JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
multi-select, widget lists as hashes
authorJason Woofenden <jason@jasonwoof.com>
Sun, 20 Sep 2015 02:26:03 +0000 (22:26 -0400)
committerJason Woofenden <jason@jasonwoof.com>
Sun, 20 Sep 2015 02:26:03 +0000 (22:26 -0400)
auto.coffee

index 63870d5..89dfb86 100644 (file)
@@ -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