diff --git a/frontend/uxbox/data/workspace.cljs b/frontend/uxbox/data/workspace.cljs index b873f46c32..f42a081494 100644 --- a/frontend/uxbox/data/workspace.cljs +++ b/frontend/uxbox/data/workspace.cljs @@ -76,6 +76,13 @@ (update-in state [:workspace :selected] disj 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 diff --git a/frontend/uxbox/ui/workspace/base.cljs b/frontend/uxbox/ui/workspace/base.cljs index 13b21e635f..d4e4dff064 100644 --- a/frontend/uxbox/ui/workspace/base.cljs +++ b/frontend/uxbox/ui/workspace/base.cljs @@ -59,22 +59,7 @@ ;; Mouse Position Stream ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(def immediate-scheduler js/Rx.Scheduler.immediate) -(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 shapes-dragging? (atom false)) (defonce mouse-b (rx/bus)) (defonce mouse-s (rx/dedupe mouse-b)) @@ -94,16 +79,12 @@ (rx/buffer 2 1) (rx/map coords-delta))) -(defonce _subscription_ - (as-> (rx/with-latest-from vector selected-shape-b mouse-delta-s) $ - (rx/filter #(not= :nothing (second %)) $) - ;; (observe-on current-thread-scheduler $) - (rx/on-value $ (fn [[delta shape]] - (rs/emit! (dw/apply-delta (:id shape) delta)))))) - - ;; (rx/on-value mouse-delta-s - ;; (fn [val] - ;; (println "delta" val)))) +(defonce $$drag-subscription$$ + (as-> mouse-delta-s $ + (rx/filter #(deref shapes-dragging?) $) + (rx/on-value $ (fn [delta] + (doseq [id @selected-state] + (rs/emit! (dw/apply-delta id delta))))))) ;; Materialized views diff --git a/frontend/uxbox/ui/workspace/canvas.cljs b/frontend/uxbox/ui/workspace/canvas.cljs index 377ade4ab1..3b0916f099 100644 --- a/frontend/uxbox/ui/workspace/canvas.cljs +++ b/frontend/uxbox/ui/workspace/canvas.cljs @@ -57,20 +57,22 @@ [:g { :on-mouse-down (fn [event] + (dom/stop-propagation event) (swap! local assoc :init-coords [x y]) - (rx/push! wb/selected-shape-b shape)) + (reset! wb/shapes-dragging? true)) :on-click - (fn [ev] + (fn [event] (when (= (:init-coords @local) [x y]) - (rs/emit! (dw/select-shape id)) - (println "click"))) + (if (.-ctrlKey event) + (rs/emit! (dw/select-shape id)) + (rs/emit! (dw/deselect-all) + (dw/select-shape id))))) :on-mouse-up (fn [event] - (println "mouse-up") - (rx/push! wb/selected-shape-b :nothing) - (dom/stop-propagation event)) + (dom/stop-propagation event) + (reset! wb/shapes-dragging? false)) } (shapes/render shape) (if (contains? selected id) @@ -133,10 +135,16 @@ :ref "canvas" :width page-width :height page-height + + :on-mouse-down + (fn [event] + (dom/stop-propagation event) + (rs/emit! (dw/deselect-all))) + :on-mouse-up (fn [event] - (rx/push! wb/selected-shape-b :nothing) - (dom/stop-propagation event)) + (dom/stop-propagation event) + (reset! wb/shapes-dragging? false)) } (background) [:svg.page-layout {}