From a312559b26dc7c5bace23909a0ac229261b04fc2 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Thu, 18 Feb 2016 21:56:40 +0200 Subject: [PATCH] Add basic shape duplicate functionality. --- src/uxbox/data/workspace.cljs | 45 +++++++++++++-------------- src/uxbox/state/shapes.cljs | 13 ++++++++ src/uxbox/ui/workspace/shortcuts.cljs | 1 + 3 files changed, 35 insertions(+), 24 deletions(-) diff --git a/src/uxbox/data/workspace.cljs b/src/uxbox/data/workspace.cljs index 5774a826d..bc7bc085c 100644 --- a/src/uxbox/data/workspace.cljs +++ b/src/uxbox/data/workspace.cljs @@ -126,12 +126,8 @@ (reify rs/UpdateEvent (-apply-update [_ state] - (let [sid (random-uuid) - pid (get-in state [:workspace :page]) - shape (merge shape {:id sid :page pid})] - (as-> state $ - (update-in $ [:pages-by-id pid :shapes] conj sid) - (assoc-in $ [:shapes-by-id sid] shape)))))) + (let [page (get-in state [:workspace :page])] + (stsh/assoc-shape-to-page state shape page))))) (defn delete-shape "Remove the shape using its id." @@ -348,24 +344,6 @@ (-apply-update [_ state] (assoc-in state [:workspace :selected] #{})))) -;; FIXME -;; (defn copy-selected -;; "Copy the selected shapes." -;; [] -;; (letfn [(valid-selection? [shapes] -;; (let [groups (into #{} (map :group shapes))] -;; (= 1 (count groups))))] -;; (reify -;; rs/WatchEvent -;; (-apply-watch [_ state] -;; (let [selected (get-in state [:workspace :selected]) -;; selected (map #(get-in state [:shapes-by-id %]) selected)] -;; (if (valid-selection? selected) -;; (as-> selected $ -;; (map #(assoc % :id (random-uuid)) $) -;; (map #(add-shape % %) $) -;; (rx/from-coll $)))))) - (defn group-selected [] (letfn [(update-shapes-on-page [state pid selected group] @@ -405,6 +383,25 @@ (update $ :workspace assoc :selected #{})) state)))))) +(defn duplicate-selected + [] + (letfn [(all-toplevel? [coll] + (every? #(nil? (:parent %)) coll))] + (reify + rs/UpdateEvent + (-apply-update [_ state] + (let [selected (->> (get-in state [:workspace :selected]) + (mapv #(get-in state [:shapes-by-id %]))) + page (get-in state [:workspace :page])] + (cond + (all-toplevel? selected) + (reduce #(stsh/assoc-shape-to-page %1 %2 page) state selected) + + :else + (do + (println "Not implemented") + state))))))) + (defn delete-selected "Deselect all and remove all selected shapes." [] diff --git a/src/uxbox/state/shapes.cljs b/src/uxbox/state/shapes.cljs index 2c71bacab..96244214e 100644 --- a/src/uxbox/state/shapes.cljs +++ b/src/uxbox/state/shapes.cljs @@ -3,6 +3,19 @@ (:require [uxbox.shapes :as sh] [uxbox.util.data :refer (index-of)])) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Shape Creation +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defn assoc-shape-to-page + [state shape page] + (let [sid (random-uuid) + shape (merge shape {:id sid :page page})] + (as-> state $ + (update-in $ [:pages-by-id page :shapes] conj sid) + (assoc-in $ [:shapes-by-id sid] shape)))) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Delete Shapes ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/src/uxbox/ui/workspace/shortcuts.cljs b/src/uxbox/ui/workspace/shortcuts.cljs index d0e799ee4..23a5c9476 100644 --- a/src/uxbox/ui/workspace/shortcuts.cljs +++ b/src/uxbox/ui/workspace/shortcuts.cljs @@ -19,6 +19,7 @@ :ctrl+shift+i #(rs/emit! (dw/toggle-flag :icons)) :ctrl+shift+l #(rs/emit! (dw/toggle-flag :layers)) :ctrl+r #(rs/emit! (dw/toggle-flag :ruler)) + :ctrl+d #(rs/emit! (dw/duplicate-selected)) :esc #(rs/emit! (dw/deselect-all)) :backspace #(rs/emit! (dw/delete-selected)) :delete #(rs/emit! (dw/delete-selected))