diff --git a/src/uxbox/ui/workspace.cljs b/src/uxbox/ui/workspace.cljs index c3c8cb31e..f2b2f8709 100644 --- a/src/uxbox/ui/workspace.cljs +++ b/src/uxbox/ui/workspace.cljs @@ -22,7 +22,7 @@ [uxbox.ui.confirm] [uxbox.ui.keyboard :as kbd] [uxbox.ui.workspace.canvas.scroll :as scroll] - [uxbox.ui.workspace.base :as uuwb] + [uxbox.ui.workspace.base :as wb] [uxbox.ui.workspace.shortcuts :as wshortcuts] [uxbox.ui.workspace.header :refer (header)] [uxbox.ui.workspace.rules :refer (horizontal-rule vertical-rule)] @@ -50,8 +50,8 @@ dom (mx/get-ref-dom own "workspace-canvas")] ;; Set initial scroll position - (set! (.-scrollLeft dom) uuwb/canvas-start-scroll-x) - (set! (.-scrollTop dom) uuwb/canvas-start-scroll-y) + (set! (.-scrollLeft dom) (* wb/canvas-start-scroll-x @wb/zoom-l)) + (set! (.-scrollTop dom) (* wb/canvas-start-scroll-y @wb/zoom-l)) (assoc own ::sub1 sub1 ::sub2 sub2))) @@ -85,12 +85,7 @@ (let [target (.-target event) top (.-scrollTop target) left (.-scrollLeft target)] - (rx/push! uuwb/scroll-b (gpt/point left top)))) - - -(def ^:const ^:private zoom-l - (-> (l/in [:workspace :zoom]) - (l/focus-atom st/state))) + (rx/push! wb/scroll-b (gpt/point left top)))) (defn- on-wheel [own event] @@ -102,12 +97,12 @@ (rs/emit! (dw/decrease-zoom))) (let [dom (mx/get-ref-dom own "workspace-canvas")] - (set! (.-scrollLeft dom) (* uuwb/canvas-start-scroll-x (or @zoom-l 1))) - (set! (.-scrollTop dom) (* uuwb/canvas-start-scroll-y (or @zoom-l 1)))))) + (set! (.-scrollLeft dom) (* wb/canvas-start-scroll-x @wb/zoom-l)) + (set! (.-scrollTop dom) (* wb/canvas-start-scroll-y @wb/zoom-l))))) (defn- workspace-render [own projectid] - (let [{:keys [flags zoom] :as workspace} (rum/react uuwb/workspace-l) + (let [{:keys [flags zoom] :as workspace} (rum/react wb/workspace-l) left-sidebar? (not (empty? (keep flags [:layers :sitemap :document-history]))) right-sidebar? (not (empty? (keep flags [:icons :drawtools diff --git a/src/uxbox/ui/workspace/base.cljs b/src/uxbox/ui/workspace/base.cljs index 3844fe480..0ed1381b0 100644 --- a/src/uxbox/ui/workspace/base.cljs +++ b/src/uxbox/ui/workspace/base.cljs @@ -40,22 +40,26 @@ (as-> (ul/getter getter) $ (l/focus-atom $ st/state)))) -(def ^:static selected-shapes-l +(def ^:const selected-shapes-l (as-> (l/in [:selected]) $ (l/focus-atom $ workspace-l))) -(def ^:static toolboxes-l +(def ^:const toolboxes-l (as-> (l/in [:toolboxes]) $ (l/focus-atom $ workspace-l))) -(def ^:static flags-l +(def ^:const flags-l (as-> (l/in [:flags]) $ (l/focus-atom $ workspace-l))) -(def ^:static shapes-by-id-l +(def ^:const shapes-by-id-l (as-> (l/key :shapes-by-id) $ (l/focus-atom $ st/state))) +(def ^:const zoom-l + (-> (l/in [:workspace :zoom]) + (l/focus-atom st/state))) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Scroll Stream ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/src/uxbox/ui/workspace/canvas/draw.cljs b/src/uxbox/ui/workspace/canvas/draw.cljs index e77cffe72..3333b7c4d 100644 --- a/src/uxbox/ui/workspace/canvas/draw.cljs +++ b/src/uxbox/ui/workspace/canvas/draw.cljs @@ -13,6 +13,7 @@ [lentes.core :as l] [uxbox.rstore :as rs] [uxbox.shapes :as ush] + [uxbox.state :as st] [uxbox.data.workspace :as udw] [uxbox.data.shapes :as uds] [uxbox.ui.core :as uuc] @@ -53,10 +54,11 @@ (define-once :drawing-subscriptions (letfn [(init-shape [shape] - (let [{:keys [x y] :as point} @wb/mouse-canvas-a + (let [{:keys [x y] :as pt} (gpt/divide @wb/mouse-canvas-a @wb/zoom-l) shape (ush/initialize shape {:x1 x :y1 y :x2 x :y2 y})] + (reset! +drawing-shape+ shape) - (reset! +drawing-position+ (assoc point :lock false)) + (reset! +drawing-position+ (assoc pt :lock false)) (let [stoper (->> uuc/actions-s (rx/map :type) @@ -67,8 +69,16 @@ (rx/with-latest-from vector wb/mouse-ctrl-s $) (rx/subscribe $ on-value nil on-complete))))) - (on-value [[point ctrl?]] - (reset! +drawing-position+ (assoc point :lock ctrl?))) + (init-icon [shape] + (let [{:keys [x y]} (gpt/divide @wb/mouse-canvas-a @wb/zoom-l) + props {:x1 x :y1 y :x2 (+ x 100) :y2 (+ y 100)} + shape (ush/initialize shape props)] + (rs/emit! (uds/add-shape shape) + (udw/select-for-drawing nil)))) + + (on-value [[pt ctrl?]] + (let [pt (gpt/divide pt @wb/zoom-l)] + (reset! +drawing-position+ (assoc pt :lock ctrl?)))) (on-complete [] (let [shape @+drawing-shape+ @@ -79,12 +89,6 @@ (reset! +drawing-position+ nil) (reset! +drawing-shape+ nil))) - (init-icon [shape] - (let [{:keys [x y]} @wb/mouse-canvas-a - props {:x1 x :y1 y :x2 (+ x 100) :y2 (+ y 100)} - shape (ush/initialize shape props)] - (rs/emit! (uds/add-shape shape) - (udw/select-for-drawing nil)))) (init [] (when-let [shape (:drawing @wb/workspace-l)] (case (:type shape) diff --git a/src/uxbox/ui/workspace/canvas/movement.cljs b/src/uxbox/ui/workspace/canvas/movement.cljs index 63616410b..dd5061471 100644 --- a/src/uxbox/ui/workspace/canvas/movement.cljs +++ b/src/uxbox/ui/workspace/canvas/movement.cljs @@ -10,18 +10,20 @@ (:require [beicon.core :as rx] [lentes.core :as l] [uxbox.rstore :as rs] - [uxbox.state :as ust] + [uxbox.state :as st] [uxbox.ui.core :as uuc] - [uxbox.ui.workspace.base :as uuwb] - [uxbox.data.shapes :as uds])) + [uxbox.ui.workspace.base :as wb] + [uxbox.data.shapes :as uds] + [uxbox.util.geom.point :as gpt])) (define-once :movement-subscription (letfn [(on-value [delta] - (let [pageid (get-in @ust/state [:workspace :page]) - selected (get-in @ust/state [:workspace :selected]) - shapes (->> (vals @uuwb/shapes-by-id-l) + (let [pageid (get-in @st/state [:workspace :page]) + selected (get-in @st/state [:workspace :selected]) + shapes (->> (vals @wb/shapes-by-id-l) (filter #(= (:page %) pageid)) - (filter (comp selected :id)))] + (filter (comp selected :id))) + delta (gpt/divide delta @wb/zoom-l)] (doseq [{:keys [id group]} shapes] (rs/emit! (uds/move-shape id delta))))) @@ -30,7 +32,7 @@ (rx/map :type) (rx/filter empty?) (rx/take 1))] - (as-> uuwb/mouse-delta-s $ + (as-> wb/mouse-delta-s $ (rx/take-until stoper $) (rx/on-value $ on-value))))] diff --git a/src/uxbox/ui/workspace/canvas/selrect.cljs b/src/uxbox/ui/workspace/canvas/selrect.cljs index fe2d2b601..c56a7fbae 100644 --- a/src/uxbox/ui/workspace/canvas/selrect.cljs +++ b/src/uxbox/ui/workspace/canvas/selrect.cljs @@ -25,10 +25,6 @@ (defonce selrect-pos (atom nil)) -(def ^:const ^:private zoom-l - (-> (l/in [:workspace :zoom]) - (l/focus-atom st/state))) - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Component ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -56,21 +52,11 @@ ;; Subscriptions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(defn selrect->rect +(defn- selrect->rect ([data] (selrect->rect data false)) ([data translate?] (let [start (:start data) - current (:current data ) - - zoom (or @zoom-l 1) - start (if translate? - (gpt/multiply start (- zoom (- zoom 1))) - start) - - current (if translate? - (gpt/multiply current (- zoom (- zoom 1))) - current) - + current (:current data) start-x (min (:x start) (:x current)) start-y (min (:y start) (:y current)) current-x (max (:x start) (:x current)) @@ -82,27 +68,24 @@ :width (- current-x start-x) :height (- current-y start-y)}))) +(defn- translate-to-canvas + [selrect] + (let [startx (* wb/canvas-start-x @wb/zoom-l) + starty (* wb/canvas-start-y @wb/zoom-l)] + (assoc selrect + :x (- (:x selrect) startx) + :y (- (:y selrect) starty) + :width (/ (:width selrect) @wb/zoom-l) + :height (/ (:height selrect) @wb/zoom-l)))) + (define-once :selrect-subscriptions (letfn [(on-value [pos] - (let [pos' (as-> (gmx/matrix) $ - (gmx/scale $ (or @zoom-l 1)) - (gpt/transform-point pos $))] - ;; (println "on-value" pos pos') - (swap! selrect-pos assoc :current pos))) - - (translate-selrect [selrect] - (let [zoom (or @zoom-l 1) - startx (* wb/canvas-start-x zoom) - starty (* wb/canvas-start-y zoom)] - (assoc selrect - :x (- (:x selrect) startx) - :y (- (:y selrect) starty)))) + (swap! selrect-pos assoc :current pos)) (on-complete [] - (let [selrect (selrect->rect @selrect-pos true) - selrect' (translate-selrect selrect)] - ;; (println selrect "---" selrect2) - (rs/emit! (dw/select-shapes selrect')) + (let [selrect (selrect->rect @selrect-pos) + selrect (translate-to-canvas selrect)] + (rs/emit! (dw/select-shapes selrect)) (reset! selrect-pos nil))) (init [] diff --git a/src/uxbox/ui/workspace/rules.cljs b/src/uxbox/ui/workspace/rules.cljs index 78aaf2f2d..225acfcbd 100644 --- a/src/uxbox/ui/workspace/rules.cljs +++ b/src/uxbox/ui/workspace/rules.cljs @@ -119,7 +119,6 @@ path (reduce (partial make-vertical-tick zoom) [] +ticks+) labels (->> (map (partial horizontal-text-label zoom) +ticks+) (filterv identity))] - (println (count labels)) (html [:g [:path {:d (str/join " " path) :stroke "#9da2a6"}] diff --git a/src/uxbox/ui/workspace/shortcuts.cljs b/src/uxbox/ui/workspace/shortcuts.cljs index 9b0dd2d14..9439629f6 100644 --- a/src/uxbox/ui/workspace/shortcuts.cljs +++ b/src/uxbox/ui/workspace/shortcuts.cljs @@ -33,9 +33,7 @@ :ctrl+shift+f #(rs/emit! (dw/toggle-flag :drawtools)) :ctrl+shift+i #(rs/emit! (dw/toggle-flag :icons)) :ctrl+shift+l #(rs/emit! (dw/toggle-flag :layers)) - :ctrl+p #(rs/emit! (dw/increase-zoom)) - :ctrl+m #(rs/emit! (dw/decrease-zoom)) - :ctrl+l #(rs/emit! (dw/reset-zoom)) + :ctrl+0 #(rs/emit! (dw/reset-zoom)) :ctrl+r #(rs/emit! (dw/toggle-flag :ruler)) :ctrl+d #(rs/emit! (dw/duplicate-selected)) :ctrl+c #(rs/emit! (dw/copy-to-clipboard))