neft
Version:
Universal Platform
173 lines (135 loc) • 5.26 kB
text/coffeescript
# Margin
'use strict'
utils = require 'src/utils'
signal = require 'src/signal'
assert = require 'src/assert'
module.exports = (Renderer, Impl, itemUtils, Item) -> (ctor, opts) -> class Margin extends itemUtils.DeepObject
= 'Margin'
propertyName = opts?.propertyName or 'margin'
itemUtils.defineProperty
constructor: ctor
name: propertyName
defaultValue: 0
valueConstructor: Margin
setter: (_super) -> (val=0) ->
margin = @[propertyName]
if typeof val is 'string'
arr = val.split ' '
for elem, i in arr
arr[i] = parseFloat elem
switch arr.length
when 3
margin.top = arr[0]
margin.right = arr[1]
margin.bottom = arr[2]
margin.left = arr[1]
when 2
margin.top = arr[0]
margin.right = arr[1]
margin.bottom = arr[0]
margin.left = arr[1]
when 1
margin.left = margin.top = margin.right = margin.bottom = arr[0]
else
margin.top = arr[0]
margin.right = arr[1]
margin.bottom = arr[2]
margin.left = arr[3]
else if Array.isArray(val)
margin.top = val[0] if val.length > 0
margin.right = val[1] if val.length > 1
margin.bottom = val[2] if val.length > 2
margin.left = val[3] if val.length > 3
else if utils.isObject(val)
margin.left = val.left if val.left?
margin.top = val.top if val.top?
margin.right = val.right if val.right?
margin.bottom = val.bottom if val.bottom?
else
margin.left = margin.top = margin.right = margin.bottom = val
_super.call @, val
return
constructor: (ref) ->
super ref
= 0
= 0
= 0
= 0
Object.preventExtensions @
Margins are used in anchors and within layout items.
```javascript
Rectangle {
width: 100
height: 100
color: 'red'
Rectangle {
width: 100
height: 50
color: 'yellow'
anchors.left: parent.right
margin.left: 20
}
}
```
```javascript
Column {
Rectangle { color: 'red'; width: 50; height: 50; }
Rectangle { color: 'yellow'; width: 50; height: 50; margin.top: 20; }
Rectangle { color: 'green'; width: 50; height: 50; }
}
```
createMarginProp = (type, extraProp) ->
developmentSetter = (val) ->
assert typeof val is 'number' and isFinite(val)
, "margin.#{type} expects a finite number; `#{val}` given"
extraPropSignal = "on#{utils.capitalize(extraProp)}Change"
itemUtils.defineProperty
constructor: Margin
name: type
defaultValue: 0
setter: (_super) -> (val) ->
extraOldVal = @[extraProp]
_super.call @, val
@[extraPropSignal].emit extraOldVal
namespace: propertyName
parentConstructor: ctor
developmentSetter: developmentSetter
## *Float* Margin::left = `0`
## *Signal* Margin::onLeftChange(*Float* oldValue)
createMarginProp 'left', 'horizontal'
## *Float* Margin::top = `0`
## *Signal* Margin::onTopChange(*Float* oldValue)
createMarginProp 'top', 'vertical'
## *Float* Margin::right = `0`
## *Signal* Margin::onRightChange(*Float* oldValue)
createMarginProp 'right', 'horizontal'
## *Float* Margin::bottom = `0`
## *Signal* Margin::onBottomChange(*Float* oldValue)
createMarginProp 'bottom', 'vertical'
## *Float* Margin::horizontal = `0`
Sum of the left and right margin.
## *Signal* Margin::onHorizontalChange(*Float* oldValue)
signal.Emitter.createSignal @, 'onHorizontalChange'
utils.defineProperty @::, 'horizontal', null, ->
+
, (val) ->
= = val / 2
## *Float* Margin::vertical = `0`
Sum of the top and bottom margin.
## *Signal* Margin::onVerticalChange(*Float* oldValue)
signal.Emitter.createSignal @, 'onVerticalChange'
utils.defineProperty @::, 'vertical', null, ->
+
, (val) ->
= = val / 2
## *Float* Margin::valueOf()
valueOf: ->
if is and is and is
else
throw new Error "margin values are different"
toJSON: ->
left:
top:
right:
bottom: