From 51fd90c64d954d5ee7f3a5c4a1bb054340657741 Mon Sep 17 00:00:00 2001 From: Andrey Antukh <niwi@niwi.nz> Date: Mon, 27 Feb 2017 20:25:48 +0100 Subject: [PATCH] Fix alignment initialization and flags management on workspace. Fixes issue #47. --- frontend/src/uxbox/main/data/shapes.cljs | 43 ++++++++++++--------- frontend/src/uxbox/main/data/workspace.cljs | 25 ++++++------ 2 files changed, 36 insertions(+), 32 deletions(-) diff --git a/frontend/src/uxbox/main/data/shapes.cljs b/frontend/src/uxbox/main/data/shapes.cljs index ef31d05b7..6e8cf791d 100644 --- a/frontend/src/uxbox/main/data/shapes.cljs +++ b/frontend/src/uxbox/main/data/shapes.cljs @@ -11,6 +11,7 @@ [potok.core :as ptk] [uxbox.main.store :as st] [uxbox.main.constants :as c] + [uxbox.main.refs :as refs] [uxbox.main.lenses :as ul] [uxbox.main.geom :as geom] [uxbox.main.workers :as uwrk] @@ -141,19 +142,23 @@ (declare apply-temporal-displacement) -(defn initial-align-shape + +(deftype InitialShapeAlign [id] + ptk/WatchEvent + (watch [_ state s] + (let [{:keys [x1 y1] :as shape} (->> (get-in state [:shapes id]) + (geom/shape->rect-shape state)) + point1 (gpt/point x1 y1) + point2 (gpt/add point1 canvas-coords)] + (->> (uwrk/align-point point2) + (rx/map #(gpt/subtract % canvas-coords)) + (rx/map (fn [{:keys [x y] :as pt}] + (apply-temporal-displacement id (gpt/subtract pt point1)))))))) + +(defn initial-shape-align [id] - (reify - ptk/WatchEvent - (watch [_ state s] - (let [{:keys [x1 y1] :as shape} (->> (get-in state [:shapes id]) - (geom/shape->rect-shape state)) - point1 (gpt/point x1 y1) - point2 (gpt/add point1 canvas-coords)] - (->> (uwrk/align-point point2) - (rx/map #(gpt/subtract % canvas-coords)) - (rx/map (fn [{:keys [x y] :as pt}] - (apply-temporal-displacement id (gpt/subtract pt point1))))))))) + {:pre [(uuid? id)]} + (InitialShapeAlign. id)) (defn update-rotation [sid rotation] @@ -649,13 +654,10 @@ ;; --- Move Selected -(defn alignment-activated? - ;; TODO: use the function defined in uxbox.main.refs +(defn- alignment-activated? [state] (let [flags (l/focus ul/workspace-flags state)] - (and (contains? flags :grid-indexed) - (contains? flags :grid-alignment) - (contains? flags :grid)))) + (refs/alignment-activated? flags))) (defn- get-displacement "Retrieve the correct displacement delta point for the @@ -678,6 +680,11 @@ :fast (gpt/point (if align? (* 3 gx) 10) (if align? (* 3 gy) 10))})) +;; --- Move Selected + +;; Event used for apply displacement transformation +;; to the selected shapes throught the keyboard shortcuts. + (deftype MoveSelected [direction speed] ptk/WatchEvent (watch [_ state stream] @@ -690,7 +697,7 @@ (rx/concat (when align? (rx/concat - (rx/from-coll (map initial-align-shape selected)) + (rx/from-coll (map initial-shape-align selected)) (rx/from-coll (map apply-displacement selected)))) (rx/from-coll (map #(apply-temporal-displacement % displacement) selected)) (rx/from-coll (map apply-displacement selected)))))) diff --git a/frontend/src/uxbox/main/data/workspace.cljs b/frontend/src/uxbox/main/data/workspace.cljs index 681623101..cbd0c94a3 100644 --- a/frontend/src/uxbox/main/data/workspace.cljs +++ b/frontend/src/uxbox/main/data/workspace.cljs @@ -273,22 +273,19 @@ (defrecord InitializeAlignment [id] ptk/WatchEvent (watch [_ state stream] - (let [page (get-in state [:pages id]) - opts (:metadata page) + (let [{:keys [metadata] :as page} (get-in state [:pages id]) params {:width c/viewport-width :height c/viewport-height - :x-axis (:grid-x-axis opts c/grid-x-axis) - :y-axis (:grid-y-axis opts c/grid-y-axis)} - stoper (->> (rx/filter initialize-alignment? stream) - (rx/take 1))] - (->> (rx/just nil) - (rx/delay 1000) - (rx/take-until stoper) - (rx/flat-map (fn [_] - (rx/merge (->> (uwrk/initialize-alignment params) - (rx/map #(activate-flag :grid-indexed))) - (when (:grid-alignment opts) - (rx/of (activate-flag :grid-alignment)))))))))) + :x-axis (:grid-x-axis metadata c/grid-x-axis) + :y-axis (:grid-y-axis metadata c/grid-y-axis)}] + (rx/merge + (rx/of (deactivate-flag :grid-indexed) + (if (:grid-alignment metadata) + (activate-flag :grid-alignment) + (deactivate-flag :grid-alignment))) + + (->> (uwrk/initialize-alignment params) + (rx/map #(activate-flag :grid-indexed))))))) (defn initialize-alignment? [v]