From af4cde3b88f14635f09f2faf00162b017a2ee7bc Mon Sep 17 00:00:00 2001 From: Jason Woofenden Date: Sat, 19 Sep 2015 22:26:03 -0400 Subject: [PATCH] multi-select, widget lists as hashes --- auto.coffee | 93 ++++++++++++++++++++++++++++++----------------------------- 1 file changed, 48 insertions(+), 45 deletions(-) diff --git a/auto.coffee b/auto.coffee index 63870d5..89dfb86 100644 --- a/auto.coffee +++ b/auto.coffee @@ -80,6 +80,7 @@ class RectWidget extends Widget style: if @style is STYLE_NORMAL then 'filter: url(#crayon)' else '' @svg.appendChild @el destruct: -> + super() if @el? @svg.removeChild @el clone: -> @@ -141,41 +142,39 @@ init = -> 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 @@ -199,25 +198,26 @@ init = -> 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 @@ -226,30 +226,33 @@ init = -> 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 -- 1.7.10.4