Improved multiple selection/deselection.

This commit is contained in:
Andrey Antukh 2015-12-28 21:05:52 +02:00
parent efeaa7a79e
commit c182340be4
3 changed files with 31 additions and 35 deletions

View file

@ -76,6 +76,13 @@
(update-in state [:workspace :selected] disj id) (update-in state [:workspace :selected] disj id)
(update-in state [:workspace :selected] conj id)))))) (update-in state [:workspace :selected] conj id))))))
(defn deselect-all
"Mark a shape selected for drawing in the canvas."
[]
(reify
rs/UpdateEvent
(-apply-update [_ state]
(assoc-in state [:workspace :selected] #{}))))
;; TODO: validate shape ;; TODO: validate shape

View file

@ -59,22 +59,7 @@
;; Mouse Position Stream ;; Mouse Position Stream
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(def immediate-scheduler js/Rx.Scheduler.immediate) (defonce shapes-dragging? (atom false))
(def current-thread-scheduler js/Rx.Scheduler.currentThread)
(defn observe-on
[scheduler ob]
(.observeOn ob scheduler))
(defn subscribe-on
[scheduler ob]
(.subscribeOn ob scheduler))
;; (defn window
;; [n ob]
;; (.windowWithCount ob n))
(defonce selected-shape-b (rx/bus))
(defonce mouse-b (rx/bus)) (defonce mouse-b (rx/bus))
(defonce mouse-s (rx/dedupe mouse-b)) (defonce mouse-s (rx/dedupe mouse-b))
@ -94,16 +79,12 @@
(rx/buffer 2 1) (rx/buffer 2 1)
(rx/map coords-delta))) (rx/map coords-delta)))
(defonce _subscription_ (defonce $$drag-subscription$$
(as-> (rx/with-latest-from vector selected-shape-b mouse-delta-s) $ (as-> mouse-delta-s $
(rx/filter #(not= :nothing (second %)) $) (rx/filter #(deref shapes-dragging?) $)
;; (observe-on current-thread-scheduler $) (rx/on-value $ (fn [delta]
(rx/on-value $ (fn [[delta shape]] (doseq [id @selected-state]
(rs/emit! (dw/apply-delta (:id shape) delta)))))) (rs/emit! (dw/apply-delta id delta)))))))
;; (rx/on-value mouse-delta-s
;; (fn [val]
;; (println "delta" val))))
;; Materialized views ;; Materialized views

View file

@ -57,20 +57,22 @@
[:g { [:g {
:on-mouse-down :on-mouse-down
(fn [event] (fn [event]
(dom/stop-propagation event)
(swap! local assoc :init-coords [x y]) (swap! local assoc :init-coords [x y])
(rx/push! wb/selected-shape-b shape)) (reset! wb/shapes-dragging? true))
:on-click :on-click
(fn [ev] (fn [event]
(when (= (:init-coords @local) [x y]) (when (= (:init-coords @local) [x y])
(rs/emit! (dw/select-shape id)) (if (.-ctrlKey event)
(println "click"))) (rs/emit! (dw/select-shape id))
(rs/emit! (dw/deselect-all)
(dw/select-shape id)))))
:on-mouse-up :on-mouse-up
(fn [event] (fn [event]
(println "mouse-up") (dom/stop-propagation event)
(rx/push! wb/selected-shape-b :nothing) (reset! wb/shapes-dragging? false))
(dom/stop-propagation event))
} }
(shapes/render shape) (shapes/render shape)
(if (contains? selected id) (if (contains? selected id)
@ -133,10 +135,16 @@
:ref "canvas" :ref "canvas"
:width page-width :width page-width
:height page-height :height page-height
:on-mouse-down
(fn [event]
(dom/stop-propagation event)
(rs/emit! (dw/deselect-all)))
:on-mouse-up :on-mouse-up
(fn [event] (fn [event]
(rx/push! wb/selected-shape-b :nothing) (dom/stop-propagation event)
(dom/stop-propagation event)) (reset! wb/shapes-dragging? false))
} }
(background) (background)
[:svg.page-layout {} [:svg.page-layout {}