From dfa8814887d9b0c0002a13cbae14d1de7e39a836 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Mon, 9 Jan 2017 20:13:43 +0100 Subject: [PATCH] Minor reorganization on workspace and icons sidebar. --- frontend/src/uxbox/main/data/workspace.cljs | 71 +++++++++++-------- frontend/src/uxbox/main/lenses.cljs | 1 + .../main/ui/workspace/sidebar/icons.cljs | 39 +++++----- 3 files changed, 66 insertions(+), 45 deletions(-) diff --git a/frontend/src/uxbox/main/data/workspace.cljs b/frontend/src/uxbox/main/data/workspace.cljs index 2d8c883e9..a3ed32dc6 100644 --- a/frontend/src/uxbox/main/data/workspace.cljs +++ b/frontend/src/uxbox/main/data/workspace.cljs @@ -7,14 +7,11 @@ (ns uxbox.main.data.workspace (:require [cljs.spec :as s] [beicon.core :as rx] - [uxbox.util.uuid :as uuid] - [uxbox.main.constants :as c] [potok.core :as ptk] - [uxbox.util.spec :as us] - [uxbox.util.forms :as sc] - [uxbox.util.geom.point :as gpt] - [uxbox.util.workers :as uw] + [lentes.core :as l] [uxbox.store :as st] + [uxbox.main.constants :as c] + [uxbox.main.lenses :as ul] [uxbox.main.data.core :refer (worker)] [uxbox.main.data.projects :as dp] [uxbox.main.data.pages :as udp] @@ -22,6 +19,11 @@ [uxbox.main.data.shapes-impl :as shimpl] [uxbox.main.data.lightbox :as udl] [uxbox.main.data.history :as udh] + [uxbox.util.uuid :as uuid] + [uxbox.util.spec :as us] + [uxbox.util.forms :as sc] + [uxbox.util.geom.point :as gpt] + [uxbox.util.workers :as uw] [uxbox.util.time :as dt] [uxbox.util.math :as mth] [uxbox.util.data :refer (index-of)])) @@ -92,42 +94,55 @@ [project page] (InitializeWorkspace. project page)) -;; --- Toggle Flag +;; --- Select for Drawing -(defn toggle-flag - "Toggle the enabled flag of the specified tool." - [key] - (reify - ptk/UpdateEvent - (update [_ state] - (let [flags (get-in state [:workspace :flags])] - (if (contains? flags key) - (assoc-in state [:workspace :flags] (disj flags key)) - (assoc-in state [:workspace :flags] (conj flags key))))))) +(deftype SelectForDrawing [shape] + ptk/UpdateEvent + (update [_ state] + (let [current (l/focus ul/selected-drawing state)] + (if (or (nil? shape) + (= shape current)) + (update state :workspace dissoc :drawing) + (assoc-in state [:workspace :drawing] shape))))) (defn select-for-drawing - "Mark a shape selected for drawing in the canvas." [shape] - (reify - ptk/UpdateEvent - (update [_ state] - (let [current (get-in state [:workspace :drawing])] - (if (or (nil? shape) - (= shape current)) - (update state :workspace dissoc :drawing) - (assoc-in state [:workspace :drawing] shape)))))) + (SelectForDrawing. shape)) -;; --- Activate Workspace Flag +;; --- Workspace Flags -(defrecord ActivateFlag [flag] +(deftype ActivateFlag [flag] ptk/UpdateEvent (update [_ state] (update-in state [:workspace :flags] conj flag))) (defn activate-flag [flag] + {:pre [(keyword? flag)]} (ActivateFlag. flag)) +(deftype DeactivateFlag [flag] + ptk/UpdateEvent + (update [_ state] + (update-in state [:workspace :flags] disj flag))) + +(defn deactivate-flag + [flag] + {:pre [(keyword? flag)]} + (DeactivateFlag. flag)) + +(deftype ToggleFlag [flag] + ptk/WatchEvent + (watch [_ state stream] + (let [flags (get-in state [:workspace :flags])] + (if (contains? flags flag) + (rx/of (deactivate-flag flag)) + (rx/of (activate-flag flag)))))) + +(defn toggle-flag + [flag] + (ToggleFlag. flag)) + ;; --- Copy to Clipboard (defrecord CopyToClipboard [] diff --git a/frontend/src/uxbox/main/lenses.cljs b/frontend/src/uxbox/main/lenses.cljs index 4c61f7cc8..289936373 100644 --- a/frontend/src/uxbox/main/lenses.cljs +++ b/frontend/src/uxbox/main/lenses.cljs @@ -6,6 +6,7 @@ (def workspace (l/key :workspace)) (def workspace-flags (comp workspace (l/key :flags))) +(def selected-drawing (comp workspace (l/key :drawing))) (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/sidebar/icons.cljs b/frontend/src/uxbox/main/ui/workspace/sidebar/icons.cljs index e6c048d2c..b3cb5dc8e 100644 --- a/frontend/src/uxbox/main/ui/workspace/sidebar/icons.cljs +++ b/frontend/src/uxbox/main/ui/workspace/sidebar/icons.cljs @@ -10,6 +10,7 @@ [uxbox.util.router :as r] [potok.core :as ptk] [uxbox.store :as st] + [uxbox.main.lenses :as ul] [uxbox.main.data.workspace :as dw] [uxbox.main.data.icons :as udi] [uxbox.main.ui.shapes.icon :as icon] @@ -22,13 +23,12 @@ ;; --- Refs -(def ^:private drawing-shape +(def ^:private drawing-shape-ref "A focused vision of the drawing property of the workspace status. This avoids rerender the whole toolbox on each workspace change." - (-> (l/in [:workspace :drawing]) - (l/derive st/state))) + (l/derive ul/selected-drawing st/state)) ;; --- Icons (Component) @@ -52,31 +52,36 @@ (remove-watch local ::key) own)) +(defn- get-first-with-icons + "Get a first collection with icons." + [colls-map] + (->> (vals colls-map) + (sort-by :name) + (filter #(> (:num-icons %) 0)) + (first))) + (defn- get-or-select-coll - [local colls-map] - (if (:id @local) - (get colls-map (:id @local)) - (let [colls (->> (vals colls-map) - (sort-by :name)) - selected-coll (first (filter #(> (:num-icons %) 0) colls))] - (swap! local assoc :id (:id selected-coll) - selected-coll)))) + [local colls] + {:pre [(map? colls)]} + (let [selected (:id @local)] + (if selected + (get colls selected) + (let [coll (get-first-with-icons colls)] + (swap! local assoc :id (:d coll)) + coll)))) (mx/defcs icons-toolbox {:mixins [(mx/local) mx/reactive] :will-mount icons-toolbox-will-mount :will-unmount icons-toolbox-will-unmount} [{:keys [rum/local] :as own}] - (let [drawing (mx/react drawing-shape) - + (let [drawing (mx/react drawing-shape-ref) colls-map (mx/react icons/collections-ref) + selected-coll (get-or-select-coll local colls-map) colls (->> (vals colls-map) (sort-by :name)) - selected-coll (get-or-select-coll local colls-map) - icons (mx/react icons/icons-ref) - icons (->> (vals icons) + icons (->> (vals (mx/react icons/icons-ref)) (filter #(= (:id selected-coll) (:collection %))))] - (letfn [(on-close [event] (st/emit! (dw/toggle-flag :icons))) (on-select [icon event]