From e7c58e873157c34d3f67c09bf54240b4ca353156 Mon Sep 17 00:00:00 2001 From: Koen Bok Date: Fri, 8 Apr 2016 23:29:08 +0200 Subject: [PATCH] First pass at an Align object You can now set properties to Align.center, Align.left, Align.right, Align.top, Align.bottom. --- framer/Align.coffee | 42 +++++++++++++++++++++++++++++++++++++++ framer/Animation.coffee | 2 +- framer/Framer.coffee | 1 + framer/Layer.coffee | 17 ++++++++++++---- framer/LayerStates.coffee | 2 +- 5 files changed, 58 insertions(+), 6 deletions(-) create mode 100644 framer/Align.coffee diff --git a/framer/Align.coffee b/framer/Align.coffee new file mode 100644 index 000000000..9343ad7da --- /dev/null +++ b/framer/Align.coffee @@ -0,0 +1,42 @@ +center = (layer, property, offset=0) -> + parent = Screen + parent = layer.parent if layer.parent + return (parent.width / 2) - (layer.width / 2) + offset if property is "x" + return (parent.height / 2) - (layer.height / 2) + offset if property is "y" + return 0 + +left = (layer, property, offset=0) -> + throw Error "Align.left only works for x" unless property is "x" + parent = Screen + parent = layer.parent if layer.parent + return 0 + offset + +right = (layer, property, offset=0) -> + throw Error "Align.right only works for x" unless property is "x" + parent = Screen + parent = layer.parent if layer.parent + return parent.width - layer.width + offset + +top = (layer, property, offset=0) -> + throw Error "Align.top only works for y" unless property is "y" + parent = Screen + parent = layer.parent if layer.parent + return 0 + offset + +bottom = (layer, property, offset=0) -> + throw Error "Align.bottom only works for y" unless property is "y" + parent = Screen + parent = layer.parent if layer.parent + return parent.height - layer.height + offset + +wrapper = (f) -> + return (a, b) -> + return ((l, p) -> f(l, p, a)) if not a? or _.isNumber(a) + return f(a, b, 0) + +exports.Align = + center: wrapper(center) + left: wrapper(left) + right: wrapper(right) + top: wrapper(top) + bottom: wrapper(bottom) \ No newline at end of file diff --git a/framer/Animation.coffee b/framer/Animation.coffee index af9464a72..06fc8fcb1 100644 --- a/framer/Animation.coffee +++ b/framer/Animation.coffee @@ -88,7 +88,7 @@ class exports.Animation extends BaseClass # Evaluate function properties if _.isFunction(v) - v = v() + v = v(@options.layer, k) # Evaluate relative properties else if isRelativeProperty(v) diff --git a/framer/Framer.coffee b/framer/Framer.coffee index ab972a833..73ec98dc8 100644 --- a/framer/Framer.coffee +++ b/framer/Framer.coffee @@ -19,6 +19,7 @@ Framer.Animation = (require "./Animation").Animation Framer.AnimationGroup = (require "./AnimationGroup").AnimationGroup Framer.Screen = (require "./Screen").Screen Framer.Canvas = (require "./Canvas").Canvas +Framer.Align = (require "./Align").Align Framer.print = (require "./Print").print # Components diff --git a/framer/Layer.coffee b/framer/Layer.coffee index 185b7ca44..1e3e7c426 100644 --- a/framer/Layer.coffee +++ b/framer/Layer.coffee @@ -35,8 +35,8 @@ layerProperty = (obj, name, cssProperty, fallback, validator, transformer, optio # console.log "Layer.#{name}.set #{value} current:#{@[name]}" - if transformer - value = transformer(value) + # Convert the value + value = transformer(value, @, name) if transformer # Return unless we get a new value return if value is @_properties[name] @@ -57,6 +57,12 @@ layerProperty = (obj, name, cssProperty, fallback, validator, transformer, optio result = _.extend(result, options) +layerPropertyPointTransformer = (value, layer, property) -> + if _.isFunction(value) + value = value(layer, property) + + return value + class exports.Layer extends BaseClass constructor: (options={}) -> @@ -104,6 +110,9 @@ class exports.Layer extends BaseClass if options.hasOwnProperty("index") @index = options.index + @x = options.x if options.hasOwnProperty("x") + @y = options.y if options.hasOwnProperty("y") + @_context.emit("layer:create", @) ############################################################## @@ -138,8 +147,8 @@ class exports.Layer extends BaseClass @define "ignoreEvents", layerProperty(@, "ignoreEvents", "pointerEvents", true, _.isBoolean) # Matrix properties - @define "x", layerProperty(@, "x", "webkitTransform", 0, _.isNumber) - @define "y", layerProperty(@, "y", "webkitTransform", 0, _.isNumber) + @define "x", layerProperty(@, "x", "webkitTransform", 0, _.isNumber, layerPropertyPointTransformer) + @define "y", layerProperty(@, "y", "webkitTransform", 0, _.isNumber, layerPropertyPointTransformer) @define "z", layerProperty(@, "z", "webkitTransform", 0, _.isNumber) @define "scaleX", layerProperty(@, "scaleX", "webkitTransform", 1, _.isNumber) diff --git a/framer/LayerStates.coffee b/framer/LayerStates.coffee index 200c4f476..26164e275 100644 --- a/framer/LayerStates.coffee +++ b/framer/LayerStates.coffee @@ -84,7 +84,7 @@ class exports.LayerStates extends BaseClass continue # Allow dynamic properties as functions - value = value.call(@layer, @layer, stateName) if _.isFunction(value) + value = value.call(@layer, @layer, propertyName, stateName) if _.isFunction(value) # Set the new value properties[propertyName] = value