From a3fdb22342c8455ed4731bd4271243f03734190d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Espino?= Date: Thu, 22 Dec 2016 14:55:32 +0100 Subject: [PATCH] Generation layers name based on current existing layers --- frontend/src/uxbox/main/data/shapes.cljs | 12 +++-- frontend/src/uxbox/main/data/shapes_impl.cljs | 54 +++++++++++-------- frontend/src/uxbox/main/data/workspace.cljs | 1 + 3 files changed, 41 insertions(+), 26 deletions(-) diff --git a/frontend/src/uxbox/main/data/shapes.cljs b/frontend/src/uxbox/main/data/shapes.cljs index cd9a0e791f..4827d6d7b1 100644 --- a/frontend/src/uxbox/main/data/shapes.cljs +++ b/frontend/src/uxbox/main/data/shapes.cljs @@ -31,8 +31,9 @@ ptk/UpdateEvent (update [_ state] (let [page (get-in state [:workspace :page]) + used-names (map #(get-in state [:shapes % :name]) (get-in state [:pages page :shapes])) shape (geom/setup-proportions shape)] - (impl/assoc-shape-to-page state shape page))))) + (impl/assoc-shape-to-page state shape used-names page))))) (defn delete-shape "Remove the shape using its id." @@ -599,8 +600,9 @@ ptk/UpdateEvent (update [_ state] (let [pid (get-in state [:workspace :page]) + used-names (map #(get-in state [:shapes % :name]) (get-in state [:pages pid :shapes])) selected (get-in state [:workspace :selected])] - (impl/group-shapes state selected pid))))) + (impl/group-shapes state selected used-names pid))))) (defn degroup-selected [] @@ -619,8 +621,10 @@ udp/IPageUpdate ptk/UpdateEvent (update [_ state] - (let [selected (get-in state [:workspace :selected])] - (impl/duplicate-shapes state selected))))) + (let [pid (get-in state [:workspace :page]) + selected (get-in state [:workspace :selected]) + used-names (map #(get-in state [:shapes % :name]) (get-in state [:pages pid :shapes]))] + (impl/duplicate-shapes state selected used-names))))) (defn delete-selected "Deselect all and remove all selected shapes." diff --git a/frontend/src/uxbox/main/data/shapes_impl.cljs b/frontend/src/uxbox/main/data/shapes_impl.cljs index 865a967cd4..4ed935d1f4 100644 --- a/frontend/src/uxbox/main/data/shapes_impl.cljs +++ b/frontend/src/uxbox/main/data/shapes_impl.cljs @@ -11,23 +11,34 @@ ;; --- Shape Creation +(defn generate-uniq-name + [used-names new-name counter] + (if (nil? counter) + (if (some #(= % new-name) used-names) + (generate-uniq-name used-names new-name 1) + new-name) + (if (some #(= % (str new-name "-" counter)) used-names) + (generate-uniq-name used-names new-name (inc counter)) + (str new-name "-" counter)))) + (defn assoc-shape-to-page - [state shape page] + [state shape used-names page] (let [sid (uuid/random) - shape (merge shape {:id sid :page page})] + shape (merge shape {:id sid :page page :name (generate-uniq-name used-names (:name shape) nil)})] + (println used-names) (as-> state $ (update-in $ [:pages page :shapes] #(into [] (cons sid %))) (assoc-in $ [:shapes sid] shape)))) (defn duplicate-shapes' - ([state shapes page] - (duplicate-shapes' state shapes page nil)) - ([state shapes page group] - (letfn [(duplicate-shape [state shape page group] + ([state shapes used-names page] + (duplicate-shapes' state shapes used-names page nil)) + ([state shapes used-names page group] + (letfn [(duplicate-shape [state shape used-names page group] (if (= (:type shape) :group) (let [id (uuid/random) items (:items shape) - shape (assoc shape :id id :page page :items []) + shape (assoc shape :id id :page page :items [] :name (generate-uniq-name used-names (str (:name shape) " copy") nil)) state (if (nil? group) (as-> state $ (update-in $ [:pages page :shapes] #(into [] (cons id %))) @@ -36,10 +47,10 @@ (update-in $ [:shapes group :items] #(into [] (cons id %))) (assoc-in $ [:shapes id] shape)))] (->> (map #(get-in state [:shapes %]) items) - (reduce #(duplicate-shape %1 %2 page id) state))) + (reduce #(duplicate-shape %1 %2 used-names page id) state))) (let [id (uuid/random) shape (-> (dissoc shape :group) - (assoc :id id :page page) + (assoc :id id :page page :name (generate-uniq-name used-names (str (:name shape) " copy") nil)) (merge (when group {:group group})))] (if (nil? group) (as-> state $ @@ -49,12 +60,12 @@ (update-in $ [:shapes group :items] #(into [] (cons id %))) (assoc-in $ [:shapes id] shape))))))] - (reduce #(duplicate-shape %1 %2 page group) state shapes)))) + (reduce #(duplicate-shape %1 %2 used-names page group) state shapes)))) (defn duplicate-shapes - ([state shapes] - (duplicate-shapes state shapes nil)) - ([state shapes page] + ([state shapes used-names] + (duplicate-shapes state shapes used-names nil)) + ([state shapes used-names page] (letfn [(all-toplevel? [coll] (every? #(nil? (:group %)) coll)) (all-same-group? [coll] @@ -64,16 +75,16 @@ (cond (all-toplevel? shapes) (let [page (or page (:page (first shapes)))] - (duplicate-shapes' state shapes page)) + (duplicate-shapes' state shapes used-names page)) (all-same-group? shapes) (let [page (or page (:page (first shapes))) group (:group (first shapes))] - (duplicate-shapes' state shapes page group)) + (duplicate-shapes' state shapes used-names page group)) :else (let [page (or page (:page (first shapes)))] - (duplicate-shapes' state shapes page))))))) + (duplicate-shapes' state shapes used-names page))))))) ;; --- Delete Shapes @@ -271,7 +282,7 @@ (reduce match #{} (sequence xf shapes)))) (defn group-shapes - [state shapes page] + [state shapes used-names page] (letfn [(replace-first-item [pred coll replacement] (into [] (concat @@ -319,10 +330,10 @@ (nil? (first distinct-groups)) :page :else (first distinct-groups)) group {:type :group - :name (str "Group " (rand-int 1000)) - :items (into [] shapes) - :id sid - :page page}] + :name (generate-uniq-name used-names "Group" nil) + :items (into [] shapes) + :id sid + :page page}] (as-> state $ (update-shapes-on-index $ shapes' sid) (cond @@ -377,4 +388,3 @@ (as-> state $ (empty-groups $ page groups-ids) (update $ :workspace assoc :selected (set groups-items)))))) - diff --git a/frontend/src/uxbox/main/data/workspace.cljs b/frontend/src/uxbox/main/data/workspace.cljs index d08ab4a19c..3031b78310 100644 --- a/frontend/src/uxbox/main/data/workspace.cljs +++ b/frontend/src/uxbox/main/data/workspace.cljs @@ -155,6 +155,7 @@ ptk/UpdateEvent (update [_ state] (let [page (get-in state [:workspace :page]) + used-names (map #(get-in state [:shapes % :name]) (get-in state [:pages page :shapes])) selected (if (nil? id) (first (:clipboard state)) (->> (:clipboard state)