style: if @style is STYLE_NORMAL then 'filter: url(#crayon)' else ''
@svg.appendChild @el
destruct: ->
+ super()
if @el?
@svg.removeChild @el
clone: ->
width: width - 2
height: height - 2 - supply_height
class: 'canvas_border'
-
- supply = [
- new RectWidget svg: svg
- new RectWidget svg: svg, width: 12, height: 50
- new RectWidget svg: svg, width: 70, height: 12
+
+ supply = {}
+ for args, i in [
+ { width: 40, height: 40 }
+ { width: 12, height: 50 }
+ { width: 70, height: 12 }
]
- for widget, i in supply
- widget.move {
- x: 30 + i * 90 + (70 - widget.width) / 2
- y: (supply_height - widget.height) / 2
+ widget = new RectWidget {
+ width: args.width
+ height: args.height
+ x: 30 + i * 90 + (70 - args.width) / 2
+ y: (supply_height - args.height) / 2
+ svg: svg
}
-
+ supply[widget.id] = widget
+
# editor state
- on_canvas = []
- selected = []
- editing = [] # has controls
+ on_canvas = {}
+ selected = {}
+ editing = {} # has controls
dragging = false
- dragging_offset = x: 0, y: 0 # from mouse x,y -> widget x,y
+ drag_from = x: 0, y: 0 # mouse was here at last frame of drag
+ shift_key_down = false
deselect_all = (args) ->
except = args?.except ? null
- found = false
- for w in selected
- if w is except
- found = true
- else
- w.set_style STYLE_NORMAL
- if found
- selected = [except]
- else
- selected = []
+ for id, w of selected
+ w.set_style STYLE_NORMAL
+ delete selected[id]
closest_widget = (widgets, xy) ->
prox = PROX_MAX + 1
closest = null
- for w in widgets
+ for id, w of widgets
new_prox = w.proximity xy
if new_prox < prox
prox = new_prox
closest = closest_widget supply, xy
if closest?
closest = closest.clone()
- on_canvas.push closest
+ on_canvas[closest.id] = closest
else
closest = closest_widget on_canvas, xy
if closest?
- deselect_all except: closest
- selected = [closest]
+ unless (shift_key_down or selected[closest.id]?)
+ deselect_all except: closest
+ selected[closest.id] = closest
closest.set_style STYLE_DRAGGING
dragging = true
- dragging_offset.x = closest.x - xy.x
- dragging_offset.y = closest.y - xy.y
+ drag_from = xy
else
deselect_all()
return false
mouseup = (e) ->
mousemove e
if dragging
- for w in selected
+ for id, w of selected
if w.y < supply_height
w.destruct()
+ delete selected[id]
else
w.set_style STYLE_SELECTED
dragging = false
mousemove = (e) ->
xy = svg_event_to_xy e
if dragging
- xy.x += dragging_offset.x
- xy.y += dragging_offset.y
- selected[0].move xy
+ return if drag_from.x is xy.x and drag_from.y is xy.y
+ rel_x = xy.x - drag_from.x
+ rel_y = xy.y - drag_from.y
+ drag_from = xy
+ for id, w of selected
+ w.move x: w.x + rel_x, y: w.y + rel_y
else
hover = closest_widget on_canvas, xy
unless hover?
hover = closest_widget supply, xy
if hover != prev_hover
- prev_hover = hover
- for w in selected
- if w.style is STYLE_HOVER and w isnt hover
- w.set_style STYLE_SELECTED
- for w in supply
- if w.style is STYLE_HOVER and w isnt hover
- w.set_style STYLE_NORMAL
- for w in on_canvas
- if w.style is STYLE_HOVER and w isnt hover
- w.set_style STYLE_NORMAL
- if hover
+ if prev_hover?
+ # FIXME
+ if selected[prev_hover.id]?
+ prev_hover.set_style STYLE_SELECTED
+ else
+ prev_hover.set_style STYLE_NORMAL
+ if hover?
hover.set_style STYLE_HOVER
+ prev_hover = hover
return false
$svg.mousedown mousedown
$svg.mouseup mouseup
$svg.mousemove mousemove
+ $(document).on 'keyup keydown', (e) ->
+ shift_key_down = e.shiftKey
+ return true
#($ document).keydown (e) ->
$ init