@quenty/buttonhighlightmodel 14.18.0 → 14.18.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,17 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [14.18.1](https://github.com/Quenty/NevermoreEngine/compare/@quenty/buttonhighlightmodel@14.18.0...@quenty/buttonhighlightmodel@14.18.1) (2025-04-05)
7
+
8
+
9
+ ### Bug Fixes
10
+
11
+ * Add types to packages ([2374fb2](https://github.com/Quenty/NevermoreEngine/commit/2374fb2b043cfbe0e9b507b3316eec46a4e353a0))
12
+
13
+
14
+
15
+
16
+
6
17
  # [14.18.0](https://github.com/Quenty/NevermoreEngine/compare/@quenty/buttonhighlightmodel@14.17.2...@quenty/buttonhighlightmodel@14.18.0) (2025-04-02)
7
18
 
8
19
  **Note:** Version bump only for package @quenty/buttonhighlightmodel
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@quenty/buttonhighlightmodel",
3
- "version": "14.18.0",
3
+ "version": "14.18.1",
4
4
  "description": "Contains model information for the current button",
5
5
  "keywords": [
6
6
  "Roblox",
@@ -26,19 +26,19 @@
26
26
  "Quenty"
27
27
  ],
28
28
  "dependencies": {
29
- "@quenty/acceltween": "^2.5.0",
30
- "@quenty/baseobject": "^10.8.0",
31
- "@quenty/blend": "^12.18.0",
32
- "@quenty/instanceutils": "^13.17.0",
33
- "@quenty/loader": "^10.8.0",
34
- "@quenty/maid": "^3.4.0",
35
- "@quenty/rectutils": "^1.2.0",
36
- "@quenty/rx": "^13.17.0",
37
- "@quenty/steputils": "^3.5.3",
38
- "@quenty/valueobject": "^13.17.0"
29
+ "@quenty/acceltween": "^2.5.1",
30
+ "@quenty/baseobject": "^10.8.1",
31
+ "@quenty/blend": "^12.18.1",
32
+ "@quenty/instanceutils": "^13.17.1",
33
+ "@quenty/loader": "^10.8.1",
34
+ "@quenty/maid": "^3.4.1",
35
+ "@quenty/rectutils": "^1.2.1",
36
+ "@quenty/rx": "^13.17.1",
37
+ "@quenty/steputils": "^3.5.4",
38
+ "@quenty/valueobject": "^13.17.1"
39
39
  },
40
40
  "publishConfig": {
41
41
  "access": "public"
42
42
  },
43
- "gitHead": "e8ea56930e65322fcffc05a1556d5df988068f0b"
43
+ "gitHead": "78c3ac0ab08dd18085b6e6e6e4f745e76ed99f68"
44
44
  }
@@ -1,3 +1,4 @@
1
+ --!strict
1
2
  --[=[
2
3
  Contains model information for the current button.
3
4
 
@@ -44,19 +45,88 @@ local StepUtils = require("StepUtils")
44
45
  local ValueObject = require("ValueObject")
45
46
  local RectUtils = require("RectUtils")
46
47
  local RxInstanceUtils = require("RxInstanceUtils")
48
+ local _Observable = require("Observable")
49
+ local _Signal = require("Signal")
47
50
 
48
51
  local ButtonHighlightModel = setmetatable({}, BaseObject)
49
52
  ButtonHighlightModel.ClassName = "ButtonHighlightModel"
50
53
  ButtonHighlightModel.__index = ButtonHighlightModel
51
54
 
55
+ export type ButtonHighlightUpdateCallback = (
56
+ percentHighlighted: AccelTween.AccelTween,
57
+ percentChoosen: AccelTween.AccelTween,
58
+ percentPressed: AccelTween.AccelTween
59
+ ) -> boolean
60
+
61
+ export type ButtonHighlightModel = typeof(setmetatable(
62
+ {} :: {
63
+ _isPressed: ValueObject.ValueObject<boolean>,
64
+ _isHighlighted: ValueObject.ValueObject<boolean>,
65
+ _isMouseOver: ValueObject.ValueObject<boolean>,
66
+ _isMouseDown: ValueObject.ValueObject<boolean>,
67
+ _isMouseOrTouchOver: ValueObject.ValueObject<boolean>,
68
+ _isSelected: ValueObject.ValueObject<boolean>,
69
+ _isChoosen: ValueObject.ValueObject<boolean>,
70
+ _isKeyDown: ValueObject.ValueObject<boolean>,
71
+ _numFingerDown: ValueObject.ValueObject<number>,
72
+ _interactionEnabled: ValueObject.ValueObject<boolean>,
73
+ _lastMousePositionForScrollingCheck: ValueObject.ValueObject<Vector3?>,
74
+ _isMouseOverBasedUponMouseMovement: ValueObject.ValueObject<boolean>,
75
+ _isMouseOverScrollingCheck: ValueObject.ValueObject<boolean>,
76
+ _maid: Maid.Maid,
77
+ _onUpdate: ButtonHighlightUpdateCallback,
78
+ _percentHighlightedAccelTween: AccelTween.AccelTween,
79
+ _percentChoosenAccelTween: AccelTween.AccelTween,
80
+ _percentPressAccelTween: AccelTween.AccelTween,
81
+ _buttonMaid: Maid.Maid?,
82
+ StartAnimation: (self: ButtonHighlightModel) -> (),
83
+
84
+ --[=[
85
+ @prop InteractionEnabledChanged Signal<boolean>
86
+ @readonly
87
+ @within ButtonHighlightModel
88
+ ]=]
89
+ InteractionEnabledChanged: _Signal.Signal<boolean>,
90
+
91
+ --[=[
92
+ @prop IsSelectedChanged Signal<boolean>
93
+ @readonly
94
+ @within ButtonHighlightModel
95
+ ]=]
96
+ IsSelectedChanged: _Signal.Signal<boolean>,
97
+
98
+ --[=[
99
+ @prop IsMouseOrTouchOverChanged Signal<boolean>
100
+ @readonly
101
+ @within ButtonHighlightModel
102
+ ]=]
103
+ IsMouseOrTouchOverChanged: _Signal.Signal<boolean>,
104
+
105
+ --[=[
106
+ @prop IsHighlightedChanged Signal<boolean>
107
+ @readonly
108
+ @within ButtonHighlightModel
109
+ ]=]
110
+ IsHighlightedChanged: _Signal.Signal<boolean>,
111
+
112
+ --[=[
113
+ @prop IsPressedChanged Signal<boolean>
114
+ @readonly
115
+ @within ButtonHighlightModel
116
+ ]=]
117
+ IsPressedChanged: _Signal.Signal<boolean>,
118
+ },
119
+ { __index = ButtonHighlightModel }
120
+ ))
121
+
52
122
  --[=[
53
123
  A model that dictates the current state of a button.
54
- @param button? GuiBase
124
+ @param button? GuiObject
55
125
  @param onUpdate function?
56
126
  @return ButtonHighlightModel
57
127
  ]=]
58
- function ButtonHighlightModel.new(button, onUpdate)
59
- local self = setmetatable(BaseObject.new(), ButtonHighlightModel)
128
+ function ButtonHighlightModel.new(button: GuiObject?, onUpdate: ButtonHighlightUpdateCallback?): ButtonHighlightModel
129
+ local self = setmetatable(BaseObject.new() :: any, ButtonHighlightModel)
60
130
 
61
131
  self._onUpdate = onUpdate
62
132
 
@@ -69,47 +139,17 @@ function ButtonHighlightModel.new(button, onUpdate)
69
139
  self._isMouseOver = self._maid:Add(ValueObject.new(false, "boolean"))
70
140
  self._isKeyDown = self._maid:Add(ValueObject.new(false, "boolean"))
71
141
  self._isHighlighted = self._maid:Add(ValueObject.new(false, "boolean"))
142
+ self._isPressed = self._maid:Add(ValueObject.new(false))
72
143
 
73
144
  -- Mouse state
74
145
  self._isMouseOverBasedUponMouseMovement = self._maid:Add(ValueObject.new(false, "boolean"))
75
146
  self._isMouseOverScrollingCheck = self._maid:Add(ValueObject.new(false, "boolean"))
76
147
  self._lastMousePositionForScrollingCheck = self._maid:Add(ValueObject.new(nil))
77
148
 
78
- --[=[
79
- @prop InteractionEnabledChanged Signal<boolean>
80
- @readonly
81
- @within ButtonHighlightModel
82
- ]=]
83
149
  self.InteractionEnabledChanged = self._interactionEnabled.Changed
84
-
85
- --[=[
86
- @prop IsSelectedChanged Signal<boolean>
87
- @readonly
88
- @within ButtonHighlightModel
89
- ]=]
90
150
  self.IsSelectedChanged = self._isSelected.Changed
91
-
92
- --[=[
93
- @prop IsMouseOrTouchOverChanged Signal<boolean>
94
- @readonly
95
- @within ButtonHighlightModel
96
- ]=]
97
151
  self.IsMouseOrTouchOverChanged = self._isMouseOrTouchOver.Changed
98
-
99
- --[=[
100
- @prop IsHighlightedChanged Signal<boolean>
101
- @readonly
102
- @within ButtonHighlightModel
103
- ]=]
104
152
  self.IsHighlightedChanged = self._isHighlighted.Changed
105
-
106
- self._isPressed = self._maid:Add(ValueObject.new(false))
107
-
108
- --[=[
109
- @prop IsPressedChanged Signal<boolean>
110
- @readonly
111
- @within ButtonHighlightModel
112
- ]=]
113
153
  self.IsPressedChanged = self._isPressed.Changed
114
154
 
115
155
  -- Legacy update stepping mode
@@ -152,7 +192,7 @@ end
152
192
  Sets the button for the highlight model.
153
193
  @param button
154
194
  ]=]
155
- function ButtonHighlightModel:SetButton(button: Instance)
195
+ function ButtonHighlightModel.SetButton(self: ButtonHighlightModel, button: GuiObject?)
156
196
  assert(typeof(button) == "Instance" or button == nil, "Bad button")
157
197
 
158
198
  local maid = Maid.new()
@@ -198,22 +238,26 @@ function ButtonHighlightModel:SetButton(button: Instance)
198
238
  end))
199
239
 
200
240
  -- Track until something indicates removal
201
- maid:GiveTask(self._isMouseOverBasedUponMouseMovement:ObserveBrio(function(mouseOver)
202
- return mouseOver
203
- end):Subscribe(function(brio)
204
- if brio:IsDead() then
205
- return
206
- end
207
-
208
- self:_trackIfButtonMovedOutFromMouse(brio:ToMaid(), button)
209
- end))
241
+ maid:GiveTask(self._isMouseOverBasedUponMouseMovement
242
+ :ObserveBrio(function(mouseOver)
243
+ return mouseOver
244
+ end)
245
+ :Subscribe(function(brio)
246
+ if brio:IsDead() then
247
+ return
248
+ end
249
+
250
+ self:_trackIfButtonMovedOutFromMouse(brio:ToMaid(), button)
251
+ end))
210
252
 
211
253
  -- We have to track as long as the mouse hasn't moved
212
254
  maid:GiveTask(Rx.combineLatest({
213
- isMouseOverFromInput = self._isMouseOverBasedUponMouseMovement:Observe();
214
- isMouseOverScrollingCheck = self._isMouseOverScrollingCheck:Observe();
255
+ isMouseOverFromInput = self._isMouseOverBasedUponMouseMovement:Observe(),
256
+ isMouseOverScrollingCheck = self._isMouseOverScrollingCheck:Observe(),
215
257
  }):Subscribe(function(state)
216
- self._isMouseOver.Value = state.isMouseOverFromInput and state.isMouseOverScrollingCheck
258
+ self._isMouseOver.Value = if state.isMouseOverFromInput and state.isMouseOverScrollingCheck
259
+ then true
260
+ else false
217
261
  end))
218
262
  end
219
263
 
@@ -226,49 +270,55 @@ function ButtonHighlightModel:SetButton(button: Instance)
226
270
  end
227
271
  end
228
272
 
229
- function ButtonHighlightModel:_trackIfButtonMovedOutFromMouse(maid, button)
230
- maid:GiveTask(button.InputChanged:Connect(function(inputObject)
273
+ function ButtonHighlightModel._trackIfButtonMovedOutFromMouse(
274
+ self: ButtonHighlightModel,
275
+ maid: Maid.Maid,
276
+ button: GuiObject
277
+ )
278
+ maid:GiveTask(button.InputChanged:Connect(function(inputObject: InputObject)
231
279
  if inputObject.UserInputType == Enum.UserInputType.MouseMovement then
232
280
  self._lastMousePositionForScrollingCheck.Value = inputObject.Position
233
281
  end
234
282
  end))
235
283
 
284
+ -- stylua: ignore
236
285
  maid:GiveTask(Rx.combineLatest({
237
- mousePosition = self._lastMousePositionForScrollingCheck:Observe();
238
- absolutePosition = RxInstanceUtils.observeProperty(button, "AbsolutePosition");
239
- absoluteSize = RxInstanceUtils.observeProperty(button, "AbsoluteSize");
240
- }):Pipe({
241
- Rx.map(function(state)
242
- if not state.mousePosition then
243
- return true
244
- end
286
+ mousePosition = self._lastMousePositionForScrollingCheck:Observe(),
287
+ absolutePosition = RxInstanceUtils.observeProperty(button, "AbsolutePosition"),
288
+ absoluteSize = RxInstanceUtils.observeProperty(button, "AbsoluteSize"),
289
+ })
290
+ :Pipe({
291
+ Rx.map(function(state: any)
292
+ if not state.mousePosition then
293
+ return true
294
+ end
245
295
 
246
- local area = Rect.new(state.absolutePosition, state.absolutePosition + state.absoluteSize)
296
+ local area = Rect.new(state.absolutePosition, state.absolutePosition + state.absoluteSize)
247
297
 
248
- if RectUtils.contains(area, Vector2.new(state.mousePosition.x, state.mousePosition.y)) then
249
- return true
250
- end
298
+ if RectUtils.contains(area, Vector2.new(state.mousePosition.x, state.mousePosition.y)) then
299
+ return true
300
+ end
251
301
 
252
- -- TODO: check rounded corners and rotated guis
302
+ -- TODO: check rounded corners and rotated guis
253
303
 
254
- return false
255
- end)
256
- }):Subscribe(function(state)
257
- self._isMouseOverScrollingCheck.Value = state
258
- end))
304
+ return false
305
+ end) :: any,
306
+ })
307
+ :Subscribe(function(state)
308
+ self._isMouseOverScrollingCheck.Value = state
309
+ end))
259
310
 
260
311
  maid:GiveTask(function()
261
312
  self._isMouseOverScrollingCheck.Value = false
262
313
  self._lastMousePositionForScrollingCheck.Value = nil
263
314
  end)
264
-
265
315
  end
266
316
 
267
317
  --[=[
268
318
  Gets if the button is pressed
269
319
  @return boolean
270
320
  ]=]
271
- function ButtonHighlightModel:IsPressed()
321
+ function ButtonHighlightModel.IsPressed(self: ButtonHighlightModel): boolean
272
322
  return self._isPressed.Value
273
323
  end
274
324
 
@@ -276,36 +326,40 @@ end
276
326
  Observes if the button is pressed
277
327
  @return Observable<boolean>
278
328
  ]=]
279
- function ButtonHighlightModel:ObserveIsPressed()
329
+ function ButtonHighlightModel.ObserveIsPressed(self: ButtonHighlightModel): _Observable.Observable<boolean>
280
330
  return self._isPressed:Observe()
281
331
  end
282
332
 
283
333
  --[=[
284
334
  Observes how pressed down the button is
285
335
 
286
- @param acceleration number | nil
336
+ @param acceleration number?
287
337
  @return Observable<number>
288
338
  ]=]
289
- function ButtonHighlightModel:ObservePercentPressed(acceleration)
290
- return Blend.AccelTween(Blend.toPropertyObservable(self._isPressed)
291
- :Pipe({
339
+ function ButtonHighlightModel.ObservePercentPressed(
340
+ self: ButtonHighlightModel,
341
+ acceleration: number?
342
+ ): _Observable.Observable<number>
343
+ return Blend.AccelTween(
344
+ Blend.toPropertyObservable(self._isPressed):Pipe({
292
345
  Rx.map(function(value)
293
346
  return value and 1 or 0
294
- end);
295
- }), acceleration or 200)
347
+ end),
348
+ }),
349
+ acceleration or 200
350
+ ) :: any
296
351
  end
297
352
 
298
353
  --[=[
299
354
  Observes target for how pressed the button is
300
355
  @return Observable<number>
301
356
  ]=]
302
- function ButtonHighlightModel:ObservePercentPressedTarget()
303
- return self._isPressed:Observe()
304
- :Pipe({
305
- Rx.map(function(value)
306
- return value and 1 or 0
307
- end);
308
- })
357
+ function ButtonHighlightModel.ObservePercentPressedTarget(self: ButtonHighlightModel): _Observable.Observable<number>
358
+ return self._isPressed:Observe():Pipe({
359
+ Rx.map(function(value)
360
+ return value and 1 or 0
361
+ end),
362
+ })
309
363
  end
310
364
 
311
365
  --[=[
@@ -313,7 +367,7 @@ end
313
367
 
314
368
  @return boolean
315
369
  ]=]
316
- function ButtonHighlightModel:IsHighlighted()
370
+ function ButtonHighlightModel.IsHighlighted(self: ButtonHighlightModel): boolean
317
371
  return self._isHighlighted.Value
318
372
  end
319
373
 
@@ -322,7 +376,7 @@ end
322
376
 
323
377
  @return Observable<boolean>
324
378
  ]=]
325
- function ButtonHighlightModel:ObserveIsHighlighted()
379
+ function ButtonHighlightModel.ObserveIsHighlighted(self: ButtonHighlightModel): _Observable.Observable<boolean>
326
380
  return self._isHighlighted:Observe()
327
381
  end
328
382
 
@@ -330,22 +384,26 @@ end
330
384
  Observes target for how highlighted the button is
331
385
  @return Observable<number>
332
386
  ]=]
333
- function ButtonHighlightModel:ObservePercentHighlightedTarget()
334
- return self._isHighlighted:Observe()
335
- :Pipe({
336
- Rx.map(function(value)
337
- return value and 1 or 0
338
- end);
339
- })
387
+ function ButtonHighlightModel.ObservePercentHighlightedTarget(
388
+ self: ButtonHighlightModel
389
+ ): _Observable.Observable<number>
390
+ return self._isHighlighted:Observe():Pipe({
391
+ Rx.map(function(value)
392
+ return value and 1 or 0
393
+ end),
394
+ })
340
395
  end
341
396
 
342
397
  --[=[
343
398
  Observes how highlighted the button is
344
399
 
345
- @param acceleration number | nil
400
+ @param acceleration number?
346
401
  @return Observable<number>
347
402
  ]=]
348
- function ButtonHighlightModel:ObservePercentHighlighted(acceleration)
403
+ function ButtonHighlightModel.ObservePercentHighlighted(
404
+ self: ButtonHighlightModel,
405
+ acceleration: number?
406
+ ): _Observable.Observable<boolean>
349
407
  return Blend.AccelTween(self:ObservePercentHighlightedTarget(), acceleration or 200)
350
408
  end
351
409
 
@@ -354,7 +412,7 @@ end
354
412
 
355
413
  @return boolean
356
414
  ]=]
357
- function ButtonHighlightModel:IsSelected()
415
+ function ButtonHighlightModel.IsSelected(self: ButtonHighlightModel): boolean
358
416
  return self._isSelected.Value
359
417
  end
360
418
 
@@ -363,7 +421,7 @@ end
363
421
 
364
422
  @return Observable<boolean>
365
423
  ]=]
366
- function ButtonHighlightModel:ObserveIsSelected()
424
+ function ButtonHighlightModel.ObserveIsSelected(self: ButtonHighlightModel): _Observable.Observable<boolean>
367
425
  return self._isSelected:Observe()
368
426
  end
369
427
 
@@ -373,7 +431,7 @@ end
373
431
 
374
432
  @return Observable<boolean>
375
433
  ]=]
376
- function ButtonHighlightModel:IsMouseOrTouchOver()
434
+ function ButtonHighlightModel.IsMouseOrTouchOver(self: ButtonHighlightModel): boolean
377
435
  return self._isMouseOrTouchOver.Value
378
436
  end
379
437
 
@@ -383,7 +441,7 @@ end
383
441
 
384
442
  @return Observable<boolean>
385
443
  ]=]
386
- function ButtonHighlightModel:ObserveIsMouseOrTouchOver()
444
+ function ButtonHighlightModel.ObserveIsMouseOrTouchOver(self: ButtonHighlightModel): _Observable.Observable<boolean>
387
445
  return self._isMouseOrTouchOver:Observe()
388
446
  end
389
447
 
@@ -392,7 +450,7 @@ end
392
450
  @param isChoosen boolean
393
451
  @param doNotAnimate boolean
394
452
  ]=]
395
- function ButtonHighlightModel:SetIsChoosen(isChoosen, doNotAnimate)
453
+ function ButtonHighlightModel.SetIsChoosen(self: ButtonHighlightModel, isChoosen: boolean, doNotAnimate: boolean?)
396
454
  assert(type(isChoosen) == "boolean", "Bad isChoosen")
397
455
 
398
456
  self._isChoosen:SetValue(isChoosen, doNotAnimate)
@@ -403,7 +461,7 @@ end
403
461
 
404
462
  @return boolean
405
463
  ]=]
406
- function ButtonHighlightModel:IsChoosen()
464
+ function ButtonHighlightModel.IsChoosen(self: ButtonHighlightModel): boolean
407
465
  return self._isChoosen.Value
408
466
  end
409
467
 
@@ -412,7 +470,7 @@ end
412
470
 
413
471
  @return boolean
414
472
  ]=]
415
- function ButtonHighlightModel:ObserveIsChoosen()
473
+ function ButtonHighlightModel.ObserveIsChoosen(self: ButtonHighlightModel): _Observable.Observable<boolean>
416
474
  return self._isChoosen:Observe()
417
475
  end
418
476
 
@@ -420,35 +478,39 @@ end
420
478
  Observes target for if the button is selected or not
421
479
  @return Observable<number>
422
480
  ]=]
423
- function ButtonHighlightModel:ObservePercentChoosenTarget()
424
- return self._isChoosen:Observe()
425
- :Pipe({
426
- Rx.map(function(value)
427
- return value and 1 or 0
428
- end);
429
- })
481
+ function ButtonHighlightModel.ObservePercentChoosenTarget(self: ButtonHighlightModel): _Observable.Observable<number>
482
+ return self._isChoosen:Observe():Pipe({
483
+ Rx.map(function(value)
484
+ return value and 1 or 0
485
+ end),
486
+ })
430
487
  end
431
488
 
432
489
  --[=[
433
490
  Observes how choosen the button is
434
491
 
435
- @param acceleration number | nil
492
+ @param acceleration number?
436
493
  @return Observable<number>
437
494
  ]=]
438
- function ButtonHighlightModel:ObservePercentChoosen(acceleration)
439
- return Blend.AccelTween(self._isChoosen:Observe()
440
- :Pipe({
495
+ function ButtonHighlightModel.ObservePercentChoosen(
496
+ self: ButtonHighlightModel,
497
+ acceleration: number?
498
+ ): _Observable.Observable<number>
499
+ return Blend.AccelTween(
500
+ self._isChoosen:Observe():Pipe({
441
501
  Rx.map(function(value)
442
502
  return value and 1 or 0
443
- end);
444
- }), acceleration or 200)
503
+ end),
504
+ }),
505
+ acceleration or 200
506
+ )
445
507
  end
446
508
 
447
509
  --[=[
448
510
  Sets whether interaction is enabled
449
511
  @param interactionEnabled boolean
450
512
  ]=]
451
- function ButtonHighlightModel:SetInteractionEnabled(interactionEnabled)
513
+ function ButtonHighlightModel.SetInteractionEnabled(self: ButtonHighlightModel, interactionEnabled: boolean)
452
514
  self._interactionEnabled:Mount(interactionEnabled)
453
515
  end
454
516
 
@@ -456,7 +518,7 @@ end
456
518
  Gets if interaction enabled
457
519
  @return boolean
458
520
  ]=]
459
- function ButtonHighlightModel:IsInteractionEnabled()
521
+ function ButtonHighlightModel.IsInteractionEnabled(self: ButtonHighlightModel): boolean
460
522
  return self._interactionEnabled.Value
461
523
  end
462
524
 
@@ -464,7 +526,7 @@ end
464
526
  Observes if interaction enabled
465
527
  @return Observable<boolean>
466
528
  ]=]
467
- function ButtonHighlightModel:ObserveIsInteractionEnabled()
529
+ function ButtonHighlightModel.ObserveIsInteractionEnabled(self: ButtonHighlightModel): _Observable.Observable<boolean>
468
530
  return self._interactionEnabled:Observe()
469
531
  end
470
532
 
@@ -473,13 +535,13 @@ end
473
535
  @param isKeyDown boolean
474
536
  @param doNotAnimate boolean -- Optional
475
537
  ]=]
476
- function ButtonHighlightModel:SetKeyDown(isKeyDown, doNotAnimate)
538
+ function ButtonHighlightModel.SetKeyDown(self: ButtonHighlightModel, isKeyDown: boolean, doNotAnimate: boolean?)
477
539
  assert(type(isKeyDown) == "boolean", "Bad isKeyDown")
478
540
 
479
541
  self._isKeyDown:SetValue(isKeyDown, doNotAnimate)
480
542
  end
481
543
 
482
- function ButtonHighlightModel:_trackTouch(inputObject)
544
+ function ButtonHighlightModel._trackTouch(self: ButtonHighlightModel, inputObject: InputObject)
483
545
  if inputObject.UserInputState == Enum.UserInputState.End then
484
546
  return
485
547
  end
@@ -502,12 +564,12 @@ function ButtonHighlightModel:_trackTouch(inputObject)
502
564
  self._maid[inputObject] = maid
503
565
  end
504
566
 
505
- function ButtonHighlightModel:_stopTouchTrack(inputObject)
567
+ function ButtonHighlightModel._stopTouchTrack(self: ButtonHighlightModel, inputObject: InputObject)
506
568
  -- Clears the input tracking as we slide off the button
507
569
  self._maid[inputObject] = nil
508
570
  end
509
571
 
510
- function ButtonHighlightModel:_updateTargets()
572
+ function ButtonHighlightModel._updateTargets(self: ButtonHighlightModel)
511
573
  self._isMouseOrTouchOver.Value = self._isMouseOver.Value or self._numFingerDown.Value > 0
512
574
 
513
575
  -- Assume event emission can lead to cleanup in middle of call
@@ -524,11 +586,15 @@ function ButtonHighlightModel:_updateTargets()
524
586
  end
525
587
  end
526
588
 
527
- function ButtonHighlightModel:_update()
528
- return self._onUpdate(self._percentHighlightedAccelTween, self._percentChoosenAccelTween, self._percentPressAccelTween)
589
+ function ButtonHighlightModel._update(self: ButtonHighlightModel): boolean
590
+ return self._onUpdate(
591
+ self._percentHighlightedAccelTween,
592
+ self._percentChoosenAccelTween,
593
+ self._percentPressAccelTween
594
+ )
529
595
  end
530
596
 
531
- function ButtonHighlightModel:_setupLegacySteppedMode()
597
+ function ButtonHighlightModel._setupLegacySteppedMode(self: ButtonHighlightModel)
532
598
  self._percentHighlightedAccelTween = AccelTween.new(200)
533
599
  self._percentHighlightedAccelTween.t = 0
534
600
  self._percentHighlightedAccelTween.p = 0
@@ -560,7 +626,9 @@ function ButtonHighlightModel:_setupLegacySteppedMode()
560
626
  self:StartAnimation()
561
627
  end))
562
628
 
563
- self.StartAnimation, self._maid._stop = StepUtils.bindToRenderStep(self._update)
629
+ self.StartAnimation, self._maid._stop = StepUtils.bindToRenderStep(function()
630
+ return self:_update()
631
+ end)
564
632
  self:StartAnimation()
565
633
  end
566
634
 
@@ -40,7 +40,7 @@ end
40
40
  Sets the handle for the highlight model.
41
41
  @param handle
42
42
  ]=]
43
- function HandleHighlightModel:SetHandle(handle: Instance)
43
+ function HandleHighlightModel:SetHandle(handle: HandleAdornment)
44
44
  assert(typeof(handle) == "Instance" or handle == nil, "Bad handle")
45
45
 
46
46
  local maid = Maid.new()