From 25f634352d1584174005949f04e26fd5afa90eab Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Fri, 30 Dec 2016 18:34:56 +0100 Subject: [PATCH] Move commonly used lenses to separated namespace. --- frontend/src/uxbox/main/data/shapes.cljs | 22 +++++---- frontend/src/uxbox/main/lenses.cljs | 11 +++++ .../src/uxbox/main/ui/workspace/base.cljs | 47 ++++++++++--------- 3 files changed, 49 insertions(+), 31 deletions(-) create mode 100644 frontend/src/uxbox/main/lenses.cljs diff --git a/frontend/src/uxbox/main/data/shapes.cljs b/frontend/src/uxbox/main/data/shapes.cljs index 79681c627..12b804d47 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.store :as st] [uxbox.main.constants :as c] + [uxbox.main.lenses :as ul] [uxbox.main.geom :as geom] [uxbox.main.data.core :refer (worker)] [uxbox.main.data.shapes-impl :as impl] @@ -671,15 +672,14 @@ (defn alignment-activated? [state] - (let [flags (get-in state [:workspace :flags])] + (let [flags (l/focus ul/workspace-flags state)] (and (contains? flags :grid-indexed) (contains? flags :grid-alignment) (contains? flags :grid)))) -(def selected-shapes-lens (l/in [:workspace :selected])) -(def selected-page-lens (l/in [:workspace :page])) - -(defn- calculate-displacement +(defn- get-displacement + "Retrieve the correct displacement delta point for the + provided direction speed and distances thresholds." [direction speed distance] (case direction :up (gpt/point 0 (- (get-in distance [speed :y]))) @@ -687,7 +687,9 @@ :left (gpt/point (- (get-in distance [speed :x])) 0) :right (gpt/point (get-in distance [speed :x]) 0))) -(defn- calculate-displacement-distance +(defn- get-displacement-distance + "Retrieve displacement distances thresholds for + defined displacement speeds." [metadata align?] (let [gx (:grid-x-axis metadata) gy (:grid-y-axis metadata)] @@ -700,11 +702,11 @@ ptk/WatchEvent (watch [_ state stream] (let [align? (alignment-activated? state) - selected (l/focus selected-shapes-lens state) - page (l/focus selected-page-lens state) + selected (l/focus ul/selected-shapes state) + page (l/focus ul/selected-page state) metadata (merge c/page-metadata (get-in state [:pages page :metadata])) - distance (calculate-displacement-distance metadata align?) - displacement (calculate-displacement direction speed distance)] + distance (get-displacement-distance metadata align?) + displacement (get-displacement direction speed distance)] (rx/concat (when align? (rx/concat diff --git a/frontend/src/uxbox/main/lenses.cljs b/frontend/src/uxbox/main/lenses.cljs new file mode 100644 index 000000000..4c61f7cc8 --- /dev/null +++ b/frontend/src/uxbox/main/lenses.cljs @@ -0,0 +1,11 @@ +(ns uxbox.main.lenses + (:require [lentes.core :as l])) + +;; --- Workspace + +(def workspace (l/key :workspace)) +(def workspace-flags (comp workspace (l/key :flags))) + +(def selected-shapes (comp workspace (l/key :selected))) +(def selected-page (comp workspace (l/key :page))) +(def selected-project (comp workspace (l/key :project))) diff --git a/frontend/src/uxbox/main/ui/workspace/base.cljs b/frontend/src/uxbox/main/ui/workspace/base.cljs index 5651aa65b..1e9ff1d89 100644 --- a/frontend/src/uxbox/main/ui/workspace/base.cljs +++ b/frontend/src/uxbox/main/ui/workspace/base.cljs @@ -10,6 +10,7 @@ [lentes.core :as l] [potok.core :as ptk] [uxbox.store :as st] + [uxbox.main.lenses :as ul] [uxbox.main.data.workspace :as dw] [uxbox.main.data.shapes :as uds] [uxbox.util.geom.point :as gpt] @@ -19,27 +20,35 @@ ;; FIXME: split this namespace in two: ;; uxbox.main.ui.streams and uxbox.main.ui.workspace.refs +;; --- Helpers + +(defn resolve-project + "Retrieve the current project." + [state] + (let [id (l/focus ul/selected-project state)] + (get-in state [:projects id]))) + +(defn resolve-page + [state] + (let [id (l/focus ul/selected-page state)] + (get-in state [:pages id]))) + ;; --- Refs -(def workspace-ref - (-> (l/key :workspace) - (l/derive st/state))) +(def workspace-ref (l/derive ul/workspace st/state)) (def project-ref - (letfn [(getter [state] - (let [project (get-in state [:workspace :project])] - (get-in state [:projects project])))] - (-> (l/lens getter) - (l/derive st/state)))) + "Ref to the current selected project." + (-> (l/lens resolve-project) + (l/derive st/state))) (def page-ref - (letfn [(getter [state] - (let [page (get-in state [:workspace :page])] - (get-in state [:pages page])))] - (-> (l/lens getter) - (l/derive st/state)))) + "Ref to the current selected page." + (-> (l/lens resolve-page) + (l/derive st/state))) (def page-id-ref + "Ref to the current selected page id." (-> (l/key :id) (l/derive page-ref))) @@ -62,18 +71,14 @@ (l/derive st/state))) (def zoom-ref - (-> (l/in [:workspace :zoom]) - (l/derive st/state))) + (-> (l/key :zoom) + (l/derive workspace-ref))) (def zoom-ref-s (rx/from-atom zoom-ref)) (def alignment-ref - (letfn [(getter [flags] - (and (contains? flags :grid-indexed) - (contains? flags :grid-alignment) - (contains? flags :grid)))] - (-> (l/lens getter) - (l/derive flags-ref)))) + (-> (l/lens uds/alignment-activated?) + (l/derive flags-ref))) ;; --- Scroll Stream