From 137af0e14d73343312507b6f0c27203ce4a899ea Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Wed, 11 Jan 2017 18:19:22 +0100 Subject: [PATCH] Reorganize viewport positioning related code. --- frontend/src/uxbox/main/constants.cljs | 7 ++ frontend/src/uxbox/main/data/workspace.cljs | 44 +++++------- .../src/uxbox/main/data/workspace/scroll.cljs | 69 +++++++++++++++++++ frontend/src/uxbox/main/ui/workspace.cljs | 8 ++- .../src/uxbox/main/ui/workspace/canvas.cljs | 5 +- .../src/uxbox/main/ui/workspace/scroll.cljs | 40 ++--------- 6 files changed, 108 insertions(+), 65 deletions(-) create mode 100644 frontend/src/uxbox/main/data/workspace/scroll.cljs diff --git a/frontend/src/uxbox/main/constants.cljs b/frontend/src/uxbox/main/constants.cljs index 40d8f0f85f..e6a23e02fc 100644 --- a/frontend/src/uxbox/main/constants.cljs +++ b/frontend/src/uxbox/main/constants.cljs @@ -25,3 +25,10 @@ :grid-color "#cccccc" :grid-alignment true :background "#ffffff"}) + +(def zoom-levels + [0.20 0.21 0.22 0.23 0.24 0.25 0.27 0.28 0.30 0.32 0.34 + 0.36 0.38 0.40 0.42 0.44 0.46 0.48 0.51 0.54 0.57 0.60 + 0.63 0.66 0.69 0.73 0.77 0.81 0.85 0.90 0.95 1.00 1.05 + 1.10 1.15 1.21 1.27 1.33 1.40 1.47 1.54 1.62 1.70 1.78 + 1.87 1.96 2.06 2.16 2.27 2.38 2.50 2.62 2.75 2.88 3.00]) diff --git a/frontend/src/uxbox/main/data/workspace.cljs b/frontend/src/uxbox/main/data/workspace.cljs index 31e1577aad..6073a881fe 100644 --- a/frontend/src/uxbox/main/data/workspace.cljs +++ b/frontend/src/uxbox/main/data/workspace.cljs @@ -20,6 +20,8 @@ [uxbox.main.data.shapes-impl :as shimpl] [uxbox.main.data.lightbox :as udl] [uxbox.main.data.history :as udh] + + [uxbox.main.data.workspace.scroll :as wscroll] [uxbox.util.uuid :as uuid] [uxbox.util.spec :as us] [uxbox.util.forms :as sc] @@ -29,14 +31,10 @@ [uxbox.util.math :as mth] [uxbox.util.data :refer (index-of)])) -;; --- Constants +;; --- Expose inner functions -(def zoom-levels - [0.20 0.21 0.22 0.23 0.24 0.25 0.27 0.28 0.30 0.32 0.34 - 0.36 0.38 0.40 0.42 0.44 0.46 0.48 0.51 0.54 0.57 0.60 - 0.63 0.66 0.69 0.73 0.77 0.81 0.85 0.90 0.95 1.00 1.05 - 1.10 1.15 1.21 1.27 1.33 1.40 1.47 1.54 1.62 1.70 1.78 - 1.87 1.96 2.06 2.16 2.27 2.38 2.50 2.62 2.75 2.88 3.00]) +(def start-viewport-positioning wscroll/start-viewport-positioning) +(def stop-viewport-positioning wscroll/stop-viewport-positioning) ;; --- Initialize Workspace @@ -192,7 +190,7 @@ [] (InitializeIconsToolbox.)) -;; --- Copy to Clipboard +;; --- Clipboard Management (defrecord CopyToClipboard [] ptk/UpdateEvent @@ -213,8 +211,6 @@ [] (CopyToClipboard.)) -;; --- Paste from Clipboard - (defrecord PasteFromClipboard [id] ptk/UpdateEvent (update [_ state] @@ -231,37 +227,33 @@ ([] (PasteFromClipboard. nil)) ([id] (PasteFromClipboard. id))) -;; --- Increase Zoom +;; --- Zoom Management -(defrecord IncreaseZoom [] +(deftype IncreaseZoom [] ptk/UpdateEvent (update [_ state] - (let [increase #(nth zoom-levels - (+ (index-of zoom-levels %) 1) - (last zoom-levels))] + (let [increase #(nth c/zoom-levels + (+ (index-of c/zoom-levels %) 1) + (last c/zoom-levels))] (update-in state [:workspace :zoom] (fnil increase 1))))) (defn increase-zoom [] (IncreaseZoom.)) -;; --- Decrease Zoom - -(defrecord DecreaseZoom [] +(deftype DecreaseZoom [] ptk/UpdateEvent (update [_ state] - (let [decrease #(nth zoom-levels - (- (index-of zoom-levels %) 1) - (first zoom-levels))] + (let [decrease #(nth c/zoom-levels + (- (index-of c/zoom-levels %) 1) + (first c/zoom-levels))] (update-in state [:workspace :zoom] (fnil decrease 1))))) (defn decrease-zoom [] (DecreaseZoom.)) -;; --- Reset Zoom - -(defrecord ResetZoom [] +(deftype ResetZoom [] ptk/UpdateEvent (update [_ state] (assoc-in state [:workspace :zoom] 1))) @@ -270,7 +262,7 @@ [] (ResetZoom.)) -;; --- Set tooltip +;; --- Tooltips (defrecord SetTooltip [text] ptk/UpdateEvent @@ -281,7 +273,7 @@ [text] (SetTooltip. text)) -;; --- Initialize Alignment Index +;; --- Grid Alignment (declare initialize-alignment?) diff --git a/frontend/src/uxbox/main/data/workspace/scroll.cljs b/frontend/src/uxbox/main/data/workspace/scroll.cljs new file mode 100644 index 0000000000..2aa228fc2a --- /dev/null +++ b/frontend/src/uxbox/main/data/workspace/scroll.cljs @@ -0,0 +1,69 @@ +;; This Source Code Form is subject to the terms of the Mozilla Public +;; License, v. 2.0. If a copy of the MPL was not distributed with this +;; file, You can obtain one at http://mozilla.org/MPL/2.0/. +;; +;; Copyright (c) 2015-2017 Andrey Antukh + +(ns uxbox.main.data.workspace.scroll + "Workspace scroll related events. Mostly or all events + are related to UI logic." + (:require [beicon.core :as rx] + [potok.core :as ptk] + [uxbox.main.ui.workspace.base :as wb] + [uxbox.util.mixins :as mx :include-macros true] + [uxbox.util.rlocks :as rlocks] + [uxbox.util.dom :as dom] + [uxbox.util.geom.point :as gpt])) + +;; --- Start Viewport Positioning + +(declare stop-viewport-positioning?) + +(defn run-viewport-positioning + [stream] + (let [stoper (->> (rx/filter stop-viewport-positioning? stream) + (rx/take 1)) + reference @wb/mouse-viewport-a + dom (dom/get-element "workspace-canvas")] + (->> wb/mouse-viewport-s + (rx/take-until stoper) + (rx/map (fn [point] + (let [{:keys [x y]} (gpt/subtract point reference) + cx (.-scrollLeft dom) + cy (.-scrollTop dom)] + (set! (.-scrollLeft dom) (- cx x)) + (set! (.-scrollTop dom) (- cy y))))) + (rx/ignore)))) + +(deftype StartViewportPositioning [id] + ptk/UpdateEvent + (update [_ state] + (update-in state [:workspace :viewport-positionig] #(if (nil? %) id %))) + + ptk/WatchEvent + (watch [_ state stream] + (let [cid (get-in state [:workspace :viewport-positionig])] + (if (= cid id) + (run-viewport-positioning stream) + (rx/empty))))) + +(defn start-viewport-positioning + [] + (StartViewportPositioning. (gensym "viewport-positioning"))) + +;; --- Stop Viewport positioning + +(deftype StopViewportPositioning [] + ptk/UpdateEvent + (update [_ state] + (update state :workspace dissoc :viewport-positionig))) + +(defn stop-viewport-positioning + [] + (StopViewportPositioning.)) + +(defn stop-viewport-positioning? + [v] + (instance? StopViewportPositioning v)) + + diff --git a/frontend/src/uxbox/main/ui/workspace.cljs b/frontend/src/uxbox/main/ui/workspace.cljs index 3cb05dafc7..7c08816491 100644 --- a/frontend/src/uxbox/main/ui/workspace.cljs +++ b/frontend/src/uxbox/main/ui/workspace.cljs @@ -46,7 +46,7 @@ (let [[projectid pageid] (:rum/args own) dom (mx/ref-node own "workspace-canvas") scroll-to-page-center #(scroll/scroll-to-page-center dom @wb/page-ref) - sub1 (scroll/watch-scroll-interactions own) + ;; sub1 (scroll/watch-scroll-interactions own) sub2 (rx/subscribe wb/page-id-ref-s scroll-to-page-center)] (scroll-to-page-center) @@ -55,12 +55,14 @@ (udu/watch-page-changes pageid) (udh/watch-page-changes pageid)) - (assoc own ::sub1 sub1 ::sub2 sub2))) + (assoc own + ;; ::sub1 sub1 + ::sub2 sub2))) (defn- workspace-will-unmount [own] (st/emit! ::udp/stop-page-watcher) - (.close (::sub1 own)) + ;; (.close (::sub1 own)) (.close (::sub2 own)) (dissoc own ::sub1 ::sub2)) diff --git a/frontend/src/uxbox/main/ui/workspace/canvas.cljs b/frontend/src/uxbox/main/ui/workspace/canvas.cljs index a8c2914448..2c95661218 100644 --- a/frontend/src/uxbox/main/ui/workspace/canvas.cljs +++ b/frontend/src/uxbox/main/ui/workspace/canvas.cljs @@ -133,12 +133,15 @@ :ctrl? (kbd/ctrl? event)}] (rx/push! wb/events-b [:key/down opts]) (when (kbd/space? event) - (rlocks/acquire! :workspace/scroll)))) + (st/emit! (dw/start-viewport-positioning))))) + #_(rlocks/acquire! :workspace/scroll) (on-key-up [event] (let [opts {:key (.-keyCode event) :shift? (kbd/shift? event) :ctrl? (kbd/ctrl? event)}] + (when (kbd/space? event) + (st/emit! (dw/stop-viewport-positioning))) (rx/push! wb/events-b [:key/up opts]))) (on-mousemove [event] diff --git a/frontend/src/uxbox/main/ui/workspace/scroll.cljs b/frontend/src/uxbox/main/ui/workspace/scroll.cljs index e2ed258db2..058bdb457c 100644 --- a/frontend/src/uxbox/main/ui/workspace/scroll.cljs +++ b/frontend/src/uxbox/main/ui/workspace/scroll.cljs @@ -2,49 +2,19 @@ ;; License, v. 2.0. If a copy of the MPL was not distributed with this ;; file, You can obtain one at http://mozilla.org/MPL/2.0/. ;; -;; Copyright (c) 2015-2016 Andrey Antukh -;; Copyright (c) 2015-2016 Juan de la Cruz +;; Copyright (c) 2015-2017 Andrey Antukh +;; Copyright (c) 2015-2017 Juan de la Cruz (ns uxbox.main.ui.workspace.scroll "Workspace scroll events handling." (:require [beicon.core :as rx] - [uxbox.util.mixins :as mx :include-macros true] + [potok.core :as ptk] [uxbox.main.ui.workspace.base :as wb] + [uxbox.util.mixins :as mx :include-macros true] [uxbox.util.rlocks :as rlocks] + [uxbox.util.dom :as dom] [uxbox.util.geom.point :as gpt])) -(defn watch-scroll-interactions - [own] - (letfn [(is-space-up? [[type {:keys [key]}]] - (and (= 32 key) (= :key/up type))) - - (on-start [] - (let [stoper (->> wb/events-s - (rx/filter is-space-up?) - (rx/take 1)) - local (:rum/local own) - initial @wb/mouse-viewport-a - stream (rx/take-until stoper wb/mouse-viewport-s)] - (swap! local assoc :scrolling true) - (rx/subscribe stream #(on-scroll % initial) nil on-scroll-end))) - - (on-scroll-end [] - (rlocks/release! :workspace/scroll) - (let [local (:rum/local own)] - (swap! local assoc :scrolling false))) - - (on-scroll [pt initial] - (let [{:keys [x y]} (gpt/subtract pt initial) - el (mx/ref-node own "workspace-canvas") - cx (.-scrollLeft el) - cy (.-scrollTop el)] - (set! (.-scrollLeft el) (- cx x)) - (set! (.-scrollTop el) (- cy y))))] - - (let [stream (->> (rx/map first rlocks/stream) - (rx/filter #(= % :workspace/scroll)))] - (rx/subscribe stream on-start)))) - (defn set-scroll-position [dom position] (set! (.-scrollLeft dom) (:x position))