Generation layers name based on current existing layers

This commit is contained in:
Jesús Espino 2016-12-22 14:55:32 +01:00
parent a3586cb3aa
commit a3fdb22342
3 changed files with 41 additions and 26 deletions

View file

@ -31,8 +31,9 @@
ptk/UpdateEvent ptk/UpdateEvent
(update [_ state] (update [_ state]
(let [page (get-in state [:workspace :page]) (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)] 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 (defn delete-shape
"Remove the shape using its id." "Remove the shape using its id."
@ -599,8 +600,9 @@
ptk/UpdateEvent ptk/UpdateEvent
(update [_ state] (update [_ state]
(let [pid (get-in state [:workspace :page]) (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])] selected (get-in state [:workspace :selected])]
(impl/group-shapes state selected pid))))) (impl/group-shapes state selected used-names pid)))))
(defn degroup-selected (defn degroup-selected
[] []
@ -619,8 +621,10 @@
udp/IPageUpdate udp/IPageUpdate
ptk/UpdateEvent ptk/UpdateEvent
(update [_ state] (update [_ state]
(let [selected (get-in state [:workspace :selected])] (let [pid (get-in state [:workspace :page])
(impl/duplicate-shapes state selected))))) 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 (defn delete-selected
"Deselect all and remove all selected shapes." "Deselect all and remove all selected shapes."

View file

@ -11,23 +11,34 @@
;; --- Shape Creation ;; --- 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 (defn assoc-shape-to-page
[state shape page] [state shape used-names page]
(let [sid (uuid/random) (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 $ (as-> state $
(update-in $ [:pages page :shapes] #(into [] (cons sid %))) (update-in $ [:pages page :shapes] #(into [] (cons sid %)))
(assoc-in $ [:shapes sid] shape)))) (assoc-in $ [:shapes sid] shape))))
(defn duplicate-shapes' (defn duplicate-shapes'
([state shapes page] ([state shapes used-names page]
(duplicate-shapes' state shapes page nil)) (duplicate-shapes' state shapes used-names page nil))
([state shapes page group] ([state shapes used-names page group]
(letfn [(duplicate-shape [state shape page group] (letfn [(duplicate-shape [state shape used-names page group]
(if (= (:type shape) :group) (if (= (:type shape) :group)
(let [id (uuid/random) (let [id (uuid/random)
items (:items shape) 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) state (if (nil? group)
(as-> state $ (as-> state $
(update-in $ [:pages page :shapes] #(into [] (cons id %))) (update-in $ [:pages page :shapes] #(into [] (cons id %)))
@ -36,10 +47,10 @@
(update-in $ [:shapes group :items] #(into [] (cons id %))) (update-in $ [:shapes group :items] #(into [] (cons id %)))
(assoc-in $ [:shapes id] shape)))] (assoc-in $ [:shapes id] shape)))]
(->> (map #(get-in state [:shapes %]) items) (->> (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) (let [id (uuid/random)
shape (-> (dissoc shape :group) 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})))] (merge (when group {:group group})))]
(if (nil? group) (if (nil? group)
(as-> state $ (as-> state $
@ -49,12 +60,12 @@
(update-in $ [:shapes group :items] #(into [] (cons id %))) (update-in $ [:shapes group :items] #(into [] (cons id %)))
(assoc-in $ [:shapes id] shape))))))] (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 (defn duplicate-shapes
([state shapes] ([state shapes used-names]
(duplicate-shapes state shapes nil)) (duplicate-shapes state shapes used-names nil))
([state shapes page] ([state shapes used-names page]
(letfn [(all-toplevel? [coll] (letfn [(all-toplevel? [coll]
(every? #(nil? (:group %)) coll)) (every? #(nil? (:group %)) coll))
(all-same-group? [coll] (all-same-group? [coll]
@ -64,16 +75,16 @@
(cond (cond
(all-toplevel? shapes) (all-toplevel? shapes)
(let [page (or page (:page (first shapes)))] (let [page (or page (:page (first shapes)))]
(duplicate-shapes' state shapes page)) (duplicate-shapes' state shapes used-names page))
(all-same-group? shapes) (all-same-group? shapes)
(let [page (or page (:page (first shapes))) (let [page (or page (:page (first shapes)))
group (:group (first shapes))] group (:group (first shapes))]
(duplicate-shapes' state shapes page group)) (duplicate-shapes' state shapes used-names page group))
:else :else
(let [page (or page (:page (first shapes)))] (let [page (or page (:page (first shapes)))]
(duplicate-shapes' state shapes page))))))) (duplicate-shapes' state shapes used-names page)))))))
;; --- Delete Shapes ;; --- Delete Shapes
@ -271,7 +282,7 @@
(reduce match #{} (sequence xf shapes)))) (reduce match #{} (sequence xf shapes))))
(defn group-shapes (defn group-shapes
[state shapes page] [state shapes used-names page]
(letfn [(replace-first-item [pred coll replacement] (letfn [(replace-first-item [pred coll replacement]
(into [] (into []
(concat (concat
@ -319,10 +330,10 @@
(nil? (first distinct-groups)) :page (nil? (first distinct-groups)) :page
:else (first distinct-groups)) :else (first distinct-groups))
group {:type :group group {:type :group
:name (str "Group " (rand-int 1000)) :name (generate-uniq-name used-names "Group" nil)
:items (into [] shapes) :items (into [] shapes)
:id sid :id sid
:page page}] :page page}]
(as-> state $ (as-> state $
(update-shapes-on-index $ shapes' sid) (update-shapes-on-index $ shapes' sid)
(cond (cond
@ -377,4 +388,3 @@
(as-> state $ (as-> state $
(empty-groups $ page groups-ids) (empty-groups $ page groups-ids)
(update $ :workspace assoc :selected (set groups-items)))))) (update $ :workspace assoc :selected (set groups-items))))))

View file

@ -155,6 +155,7 @@
ptk/UpdateEvent ptk/UpdateEvent
(update [_ state] (update [_ state]
(let [page (get-in state [:workspace :page]) (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) selected (if (nil? id)
(first (:clipboard state)) (first (:clipboard state))
(->> (:clipboard state) (->> (:clipboard state)