Move the mouse stream generation under viewport.

This commit is contained in:
Andrey Antukh 2016-02-16 19:54:04 +02:00
parent c7a38113a1
commit 5a73a4f198
5 changed files with 113 additions and 64 deletions

View File

@ -26,7 +26,7 @@
(defn- coordenates-render (defn- coordenates-render
[own] [own]
(let [{:keys [x y]} (rum/react wb/mouse-position)] (let [{:keys [x y]} (rum/react wb/mouse-canvas-a)]
(html (html
[:div {:style {:position "absolute" :left "50px" :top "25px"}} [:div {:style {:position "absolute" :left "50px" :top "25px"}}
[:span (str "| x=" x " | y=" y " |")]]))) [:span (str "| x=" x " | y=" y " |")]])))

View File

@ -108,44 +108,41 @@
;; Canvas ;; Canvas
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defn- canvas-did-mount ;; (defn- canvas-did-mount
[own] ;; [own]
(letfn [(on-mousemove [event page] ;; (letfn [(translate-point [pt page]
(let [wpt (gpt/point (.-clientX event) (.-clientY event)) ;; (let [canvas (mx/get-ref-dom own (str "canvas" (:id page)))
canvas (mx/get-ref-dom own (str "canvas" (:id page))) ;; brect (.getBoundingClientRect canvas)
brect (.getBoundingClientRect canvas) ;; brect (gpt/point (.-left brect) (.-top brect))]
brect (gpt/point (.-left brect) (.-top brect)) ;; ;; brect (gpt/add brect @wb/scroll-a)]
brect (gpt/add brect @wb/scroll-a) ;; (gpt/subtract pt brect)))
;; (on-mousemove [event page]
;; (let [wpt (gpt/point (.-clientX event)
;; (.-clientY event))
;; cpt (translate-point wpt page)
;; event {:id (:id page)
;; :ctrl (kbd/ctrl? event)
;; :shift (kbd/shift? event)
;; :window-coords wpt
;; :canvas-coords cpt}]
;; (println "on-mousemove" cpt)
;; (rx/push! wb/mouse-b event)))]
;; (let [[page] (:rum/props own)
;; key (events/listen js/document EventType.MOUSEMOVE
;; #(on-mousemove % page))]
;; (assoc own ::eventkey key))))
cpt (gpt/subtract wpt brect) ;; (defn- canvas-will-unmount
event {:id (:id page) ;; [own]
:ctrl (kbd/ctrl? event) ;; (let [key (::eventkey own)
:shift (kbd/shift? event) ;; [page] (:rum/props own)]
:window-coords wpt ;; (events/unlistenByKey key)
:canvas-coords cpt}] ;; (dissoc own ::eventkey)))
(println "brect:" brect) ;; (defn- canvas-transfer-state
(swap! wb/bounding-rect assoc (:id page) brect) ;; [old-own own]
(rx/push! wb/mouse-b event)))] ;; (let [key (::eventkey old-own)]
;; (assoc own ::eventkey key)))
;; TODO: update properly the bounding rect.
(let [[page] (:rum/props own)
key (events/listen js/document EventType.MOUSEMOVE
#(on-mousemove % page))]
(assoc own ::eventkey key))))
(defn- canvas-will-unmount
[own]
(let [key (::eventkey own)
[page] (:rum/props own)]
(swap! wb/bounding-rect dissoc (:id page))
(events/unlistenByKey key)
(dissoc own ::eventkey)))
(defn- canvas-transfer-state
[old-own own]
(let [key (::eventkey old-own)]
(assoc own ::eventkey key)))
(defn- canvas-render (defn- canvas-render
[own {:keys [width height id] :as page}] [own {:keys [width height id] :as page}]
@ -160,11 +157,11 @@
shapes-selected (filter (comp workspace-selected :id) shapes) shapes-selected (filter (comp workspace-selected :id) shapes)
shapes-notselected (filter (comp not workspace-selected :id) shapes)] shapes-notselected (filter (comp not workspace-selected :id) shapes)]
(html (html
[:svg#page-canvas.page-canvas {:x wb/document-start-x [:svg.page-canvas {:x wb/document-start-x
:y wb/document-start-y :y wb/document-start-y
:ref (str "canvas" id) :ref (str "canvas" id)
:width width :width width
:height height} :height height}
(background) (background)
(grid 1) (grid 1)
[:svg.page-layout {} [:svg.page-layout {}
@ -173,15 +170,14 @@
(for [item (reverse (sequence xf (:shapes page)))] (for [item (reverse (sequence xf (:shapes page)))]
(-> (shape item workspace-selected) (-> (shape item workspace-selected)
(rum/with-key (str (:id item))))) (rum/with-key (str (:id item)))))
(selrect)
(draw-area)]]]))) (draw-area)]]])))
(def canvas (def canvas
(mx/component (mx/component
{:render canvas-render {:render canvas-render
:did-mount canvas-did-mount ;; :did-mount canvas-did-mount
:will-unmount canvas-will-unmount ;; :will-unmount canvas-will-unmount
:transfer-state canvas-transfer-state ;; :transfer-state canvas-transfer-state
:name "canvas" :name "canvas"
:mixins [mx/static rum/reactive]})) :mixins [mx/static rum/reactive]}))
@ -208,16 +204,65 @@
(html (html
[:svg.viewport {:width wb/viewport-width [:svg.viewport {:width wb/viewport-width
:height wb/viewport-height :height wb/viewport-height
:ref "viewport"
:class (when drawing? "drawing") :class (when drawing? "drawing")
:on-mouse-down on-mouse-down :on-mouse-down on-mouse-down
:on-mouse-up on-mouse-up} :on-mouse-up on-mouse-up}
[:g.zoom {:transform (str "scale(" zoom ", " zoom ")")} [:g.zoom {:transform (str "scale(" zoom ", " zoom ")")}
(if page (if page
(canvas page)) (canvas page))
(ruler)]])))) (ruler)
(selrect)]]))))
(defn- viewport-did-mount
[own]
(letfn [(translate-point-to-viewport [pt]
(let [viewport (mx/get-ref-dom own "viewport")
brect (.getBoundingClientRect viewport)
brect (gpt/point (.-left brect) (.-top brect))]
(gpt/subtract pt brect)))
(translate-point-to-canvas [pt]
(let [viewport (mx/get-ref-dom own "viewport")
canvas (dom/get-element-by-class "page-canvas" viewport)
brect (.getBoundingClientRect canvas)
brect (gpt/point (.-left brect) (.-top brect))]
(gpt/subtract pt brect)))
(on-mousemove [event page]
(let [wpt (gpt/point (.-clientX event)
(.-clientY event))
vppt (translate-point-to-viewport wpt)
cvpt (translate-point-to-canvas wpt)
event {:ctrl (kbd/ctrl? event)
:shift (kbd/shift? event)
:window-coords wpt
:viewport-coords vppt
:canvas-coords cvpt}]
(rx/push! wb/mouse-b event)))]
(let [[page] (:rum/props own)
key (events/listen js/document EventType.MOUSEMOVE
#(on-mousemove % page))]
(assoc own ::eventkey key))))
(defn- viewport-will-unmount
[own]
(let [key (::eventkey own)
[page] (:rum/props own)]
(events/unlistenByKey key)
(dissoc own ::eventkey)))
(defn- viewport-transfer-state
[old-own own]
(let [key (::eventkey old-own)]
(assoc own ::eventkey key)))
(def viewport (def viewport
(mx/component (mx/component
{:render viewport-render {:render viewport-render
:name "viewport" :name "viewport"
:did-mount viewport-did-mount
:will-unmount viewport-will-unmount
:transfer-state viewport-transfer-state
:mixins [rum/reactive]})) :mixins [rum/reactive]}))

View File

@ -43,23 +43,24 @@
(define-once :drawing-subscriptions (define-once :drawing-subscriptions
(letfn [(init-shape [shape] (letfn [(init-shape [shape]
(let [{:keys [x y] :as point} (gpt/subtract @wb/mouse-position (let [{:keys [x y] :as point} @wb/mouse-canvas-a
@wb/scroll-a)
shape (sh/-initialize shape {:x1 x :y1 y :x2 x :y2 y})] shape (sh/-initialize shape {:x1 x :y1 y :x2 x :y2 y})]
(println "start" point)
(reset! +drawing-shape+ shape) (reset! +drawing-shape+ shape)
(reset! +drawing-position+ (assoc point :lock false)) (reset! +drawing-position+ (assoc point :lock false))
(as-> wb/interactions-b $ (let [stoper (->> wb/interactions-b
(rx/filter #(not= % :shape/movement) $) (rx/filter #(not= % :shape/movement))
(rx/take 1 $) (rx/take 1))]
(rx/take-until $ wb/mouse-s) (as-> wb/mouse-canvas-s $
(rx/with-latest-from vector wb/mouse-ctrl-s $) (rx/take-until stoper $)
(rx/subscribe $ on-value nil on-complete)))) (rx/with-latest-from vector wb/mouse-ctrl-s $)
(rx/subscribe $ on-value nil on-complete)))))
(on-value [[pos ctrl?]] (on-value [[point ctrl?]]
(let [point (gpt/subtract pos @wb/scroll-a)] (println "on-value" ctrl? point)
(reset! +drawing-position+ (assoc point :lock ctrl?)))) (reset! +drawing-position+ (assoc point :lock ctrl?)))
(on-complete [] (on-complete []
(let [shape @+drawing-shape+ (let [shape @+drawing-shape+
@ -71,7 +72,7 @@
(reset! +drawing-shape+ nil))) (reset! +drawing-shape+ nil)))
(init-icon [shape] (init-icon [shape]
(let [{:keys [x y]} (gpt/subtract @wb/mouse-position @wb/scroll-a) (let [{:keys [x y]} @wb/mouse-canvas-a
props {:x1 x :y1 y :x2 (+ x 100) :y2 (+ y 100)} props {:x1 x :y1 y :x2 (+ x 100) :y2 (+ y 100)}
shape (sh/-initialize shape props)] shape (sh/-initialize shape props)]
(rs/emit! (dw/add-shape shape) (rs/emit! (dw/add-shape shape)

View File

@ -60,7 +60,7 @@
(define-once :selrect-subscriptions (define-once :selrect-subscriptions
(letfn [(on-value [pos] (letfn [(on-value [pos]
(let [pos (gpt/add pos @wb/scroll-a)] (let [pos' (gpt/add pos @wb/scroll-a)]
(swap! selrect-pos assoc :current pos))) (swap! selrect-pos assoc :current pos)))
(on-complete [] (on-complete []
@ -72,9 +72,10 @@
(let [stoper (->> wb/interactions-b (let [stoper (->> wb/interactions-b
(rx/filter #(not= % :draw/selrect)) (rx/filter #(not= % :draw/selrect))
(rx/take 1)) (rx/take 1))
pos (gpt/add @wb/mouse-a @wb/scroll-a)] pos @wb/mouse-viewport-a]
(reset! selrect-pos {:start pos :current pos}) (reset! selrect-pos {:start pos :current pos})
(as-> wb/mouse-s $
(as-> wb/mouse-viewport-s $
(rx/take-until stoper $) (rx/take-until stoper $)
(rx/subscribe $ on-value nil on-complete))))] (rx/subscribe $ on-value nil on-complete))))]

View File

@ -2,8 +2,10 @@
(:require [goog.dom :as dom])) (:require [goog.dom :as dom]))
(defn get-element-by-class (defn get-element-by-class
[^string classname] ([classname]
(dom/getElementByClass classname)) (dom/getElementByClass classname))
([classname node]
(dom/getElementByClass classname node)))
(defn stop-propagation (defn stop-propagation
[e] [e]