Add full implementation of duplicate shape action.

This commit is contained in:
Andrey Antukh 2016-02-19 21:08:56 +02:00
parent e7ddd65ee2
commit 747c9b45aa
5 changed files with 154 additions and 19 deletions

View file

@ -385,22 +385,11 @@
(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)))))))
(reify
rs/UpdateEvent
(-apply-update [_ state]
(let [selected (get-in state [:workspace :selected])]
(stsh/duplicate-shapes state selected)))))
(defn delete-selected
"Deselect all and remove all selected shapes."

View file

@ -3,7 +3,6 @@
(:require [uxbox.shapes :as sh]
[uxbox.util.data :refer (index-of)]))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Shape Creation
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@ -16,6 +15,60 @@
(update-in $ [:pages-by-id page :shapes] conj sid)
(assoc-in $ [:shapes-by-id 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]
(if (= (:type shape) :builtin/group)
(let [id (random-uuid)
items (:items shape)
shape (assoc shape :id id :page page :items [])
state (if (nil? group)
(as-> state $
(update-in $ [:pages-by-id page :shapes] conj id)
(assoc-in $ [:shapes-by-id id] shape))
(as-> state $
(update-in $ [:shapes-by-id group :items] conj id)
(assoc-in $ [:shapes-by-id id] shape)))]
(->> (map #(get-in state [:shapes-by-id %]) items)
(reduce #(duplicate-shape %1 %2 page id) state)))
(let [id (random-uuid)
shape (-> (dissoc shape :group)
(assoc :id id :page page)
(merge (when group {:group group})))]
(if (nil? group)
(as-> state $
(update-in $ [:pages-by-id page :shapes] conj id)
(assoc-in $ [:shapes-by-id id] shape))
(as-> state $
(update-in $ [:shapes-by-id group :items] conj id)
(assoc-in $ [:shapes-by-id id] shape))))))]
(reduce #(duplicate-shape %1 %2 page group) state shapes))))
(defn duplicate-shapes
[state shapes]
(letfn [(all-toplevel? [coll]
(every? #(nil? (:group %)) coll))
(all-same-group? [coll]
(let [group (:group (first coll))]
(every? #(= group (:group %)) coll)))]
(let [shapes (mapv #(get-in state [:shapes-by-id %]) shapes)]
(cond
(all-toplevel? shapes)
(let [page (:page (first shapes))]
(duplicate-shapes' state shapes page))
(all-same-group? shapes)
(let [page (:page (first shapes))
group (:group (first shapes))]
(duplicate-shapes' state shapes page group))
:else
(let [page (:page (first shapes))]
(duplicate-shapes' state shapes page))))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Delete Shapes
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;