@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 +11 -0
- package/package.json +12 -12
- package/src/Client/ButtonHighlightModel.lua +193 -125
- package/src/Client/HandleHighlightModel.lua +1 -1
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.
|
|
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.
|
|
30
|
-
"@quenty/baseobject": "^10.8.
|
|
31
|
-
"@quenty/blend": "^12.18.
|
|
32
|
-
"@quenty/instanceutils": "^13.17.
|
|
33
|
-
"@quenty/loader": "^10.8.
|
|
34
|
-
"@quenty/maid": "^3.4.
|
|
35
|
-
"@quenty/rectutils": "^1.2.
|
|
36
|
-
"@quenty/rx": "^13.17.
|
|
37
|
-
"@quenty/steputils": "^3.5.
|
|
38
|
-
"@quenty/valueobject": "^13.17.
|
|
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": "
|
|
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?
|
|
124
|
+
@param button? GuiObject
|
|
55
125
|
@param onUpdate function?
|
|
56
126
|
@return ButtonHighlightModel
|
|
57
127
|
]=]
|
|
58
|
-
function ButtonHighlightModel.new(button
|
|
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
|
|
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
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
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
|
|
230
|
-
|
|
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
|
-
})
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
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
|
-
|
|
296
|
+
local area = Rect.new(state.absolutePosition, state.absolutePosition + state.absoluteSize)
|
|
247
297
|
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
298
|
+
if RectUtils.contains(area, Vector2.new(state.mousePosition.x, state.mousePosition.y)) then
|
|
299
|
+
return true
|
|
300
|
+
end
|
|
251
301
|
|
|
252
|
-
|
|
302
|
+
-- TODO: check rounded corners and rotated guis
|
|
253
303
|
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
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
|
|
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
|
|
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
|
|
336
|
+
@param acceleration number?
|
|
287
337
|
@return Observable<number>
|
|
288
338
|
]=]
|
|
289
|
-
function ButtonHighlightModel
|
|
290
|
-
|
|
291
|
-
|
|
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
|
-
}),
|
|
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
|
|
303
|
-
return self._isPressed:Observe()
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
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
|
|
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
|
|
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
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
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
|
|
400
|
+
@param acceleration number?
|
|
346
401
|
@return Observable<number>
|
|
347
402
|
]=]
|
|
348
|
-
function ButtonHighlightModel
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
424
|
-
return self._isChoosen:Observe()
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
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
|
|
492
|
+
@param acceleration number?
|
|
436
493
|
@return Observable<number>
|
|
437
494
|
]=]
|
|
438
|
-
function ButtonHighlightModel
|
|
439
|
-
|
|
440
|
-
|
|
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
|
-
}),
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
528
|
-
return self._onUpdate(
|
|
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
|
|
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(
|
|
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:
|
|
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()
|