-
Notifications
You must be signed in to change notification settings - Fork 479
/
LayerStates.coffee
73 lines (56 loc) · 1.61 KB
/
LayerStates.coffee
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
{_} = require "./Underscore"
{Events} = require "./Events"
{BaseClass} = require "./BaseClass"
{Defaults} = require "./Defaults"
LayerStatesIgnoredKeys = ["ignoreEvents"]
# Animation events
Events.StateWillSwitch = "willSwitch"
Events.StateDidSwitch = "didSwitch"
class exports.LayerStates extends BaseClass
constructor: (layer,initial, states={}) ->
@_previousStates = []
for stateName,value of states
@[stateName] = value
@_layer = layer
initial ?= layer.props
@_currentName = 'initial'
@_initial = LayerStates.filterStateProperties(initial)
super
@define "initial",
enumerable: false
exportable: false
importable: false
get: -> @_initial
@define "current",
enumerable: false
exportable: false
importable: false
get: -> @[@_currentName]
@define "currentName",
enumerable: false
exportable: false
importable: false
get: -> @_currentName
emit: (args...) ->
super
# Also emit this to the layer with self as argument
@_layer.emit args...
@filterStateProperties = (properties) ->
stateProperties = {}
# TODO: Maybe we want to support advanced data structures like objects in the future too.
for k, v of properties
if Color.isValidColorProperty(k, v)
stateProperties[k] = new Color(v)
continue
if @_isValidProperty(k, v)
stateProperties[k] = v
return stateProperties
@_isValidProperty: (k, v) ->
return true if _.isNumber(v)
return true if _.isFunction(v)
return true if _.isBoolean(v)
return true if _.isString(v)
return true if Color.isColorObject(v)
return true if v is null
return true if v?.constructor?.name is "Layer"
return false