From f49cf0b6ae052f17e3e9dd6c244a20ec440076f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Moya?= Date: Fri, 15 Dec 2023 14:36:47 +0100 Subject: [PATCH] :lipstick: Style changes on clone-object function (now clone-shape) --- common/src/app/common/types/container.cljc | 23 +-- common/src/app/common/types/shape_tree.cljc | 133 +++++++++--------- .../data/workspace/libraries_helpers.cljs | 38 +++-- 3 files changed, 94 insertions(+), 100 deletions(-) diff --git a/common/src/app/common/types/container.cljc b/common/src/app/common/types/container.cljc index a7f060391..3d5cb31c4 100644 --- a/common/src/app/common/types/container.cljc +++ b/common/src/app/common/types/container.cljc @@ -255,7 +255,11 @@ (dissoc :component-root))) [new-root-shape new-shapes updated-shapes] - (ctst/clone-object shape nil objects update-new-shape update-original-shape) + (ctst/clone-shape shape + nil + objects + :update-new-shape update-new-shape + :update-original-shape update-original-shape) ;; If frame-id points to a shape inside the component, remap it to the ;; corresponding new frame shape. If not, set it to nil. @@ -339,15 +343,14 @@ (dissoc :component-root)))) [new-shape new-shapes _] - (ctst/clone-object component-shape - frame-id - (if components-v2 (:objects component-page) (:objects component)) - update-new-shape - (fn [object _] object) - force-id - keep-ids? - frame-id) - + (ctst/clone-shape component-shape + frame-id + (if components-v2 (:objects component-page) (:objects component)) + :update-new-shape update-new-shape + :force-id force-id + :keep-ids? keep-ids? + :frame-id frame-id + :dest-objects (:objects container)) ;; Fix empty parent-id and remap all grid cells to the new ids. remap-ids diff --git a/common/src/app/common/types/shape_tree.cljc b/common/src/app/common/types/shape_tree.cljc index 6cdf951b5..ab6f08e41 100644 --- a/common/src/app/common/types/shape_tree.cljc +++ b/common/src/app/common/types/shape_tree.cljc @@ -342,94 +342,89 @@ [frame] (not (mth/almost-zero? (:rotation frame 0)))) -(defn clone-object - "Gets a copy of the object and all its children, with new ids and with +(defn clone-shape + "Gets a copy of the shape and all its children, with new ids and with the parent-children links correctly set. Admits functions to make - more transformations to the cloned objects and the original ones. + more transformations to the cloned shapes and the original ones. - Returns the cloned object, the list of all new objects (including - the cloned one), and possibly a list of original objects modified. + Returns the cloned shape, the list of all new shapes (including + the cloned one), and possibly a list of original shapes modified. - The list of objects are returned in tree traversal order, respecting + The list of shapes are returned in tree traversal order, respecting the order of the children of each parent." - - ([object parent-id objects] - (clone-object object parent-id objects (fn [object _] object) (fn [object _] object) nil false nil objects)) - - ([object parent-id objects update-new-object] - (clone-object object parent-id objects update-new-object (fn [object _] object) nil false nil objects)) - - ([object parent-id objects update-new-object update-original-object] - (clone-object object parent-id objects update-new-object update-original-object nil false nil objects)) - - ([object parent-id objects update-new-object update-original-object force-id] - (clone-object object parent-id objects update-new-object update-original-object force-id false nil objects)) - - ([object parent-id objects update-new-object update-original-object force-id keep-ids?] - (clone-object object parent-id objects update-new-object update-original-object force-id keep-ids? nil objects)) - - ([object parent-id objects update-new-object update-original-object force-id keep-ids? frame-id] - (clone-object object parent-id objects update-new-object update-original-object force-id keep-ids? frame-id objects)) - - ([object parent-id objects update-new-object update-original-object force-id keep-ids? frame-id dest-objects] - (let [new-id (cond - (some? force-id) force-id - keep-ids? (:id object) - :else (uuid/next)) + [shape parent-id objects & {:keys [update-new-shape update-original-shape force-id keep-ids? frame-id dest-objects] + :or {update-new-shape (fn [shape _] shape) + update-original-shape (fn [shape _] shape) + force-id nil + keep-ids? false + frame-id nil + dest-objects objects}}] + (let [new-id (cond + (some? force-id) force-id + keep-ids? (:id shape) + :else (uuid/next)) ;; Assign the correct frame-id for the given parent. It's the parent-id (if parent is frame) ;; or the parent's frame-id otherwise. Only for the first cloned shapes. In recursive calls ;; this is not needed. - frame-id (cond - (and (nil? frame-id) (cfh/frame-shape? dest-objects parent-id)) - parent-id + frame-id (cond + (and (nil? frame-id) (cfh/frame-shape? dest-objects parent-id)) + parent-id - (nil? frame-id) - (dm/get-in dest-objects [parent-id :frame-id] uuid/zero) + (nil? frame-id) + (dm/get-in dest-objects [parent-id :frame-id] uuid/zero) - :else - frame-id)] + :else + frame-id)] - (loop [child-ids (seq (:shapes object)) - new-direct-children [] - new-children [] - updated-children []] + (loop [child-ids (seq (:shapes shape)) + new-direct-children [] + new-children [] + updated-children []] - (if (empty? child-ids) - (let [new-object (cond-> object - :always - (assoc :id new-id - :parent-id parent-id - :frame-id frame-id) + (if (empty? child-ids) + (let [new-shape (cond-> shape + :always + (assoc :id new-id + :parent-id parent-id + :frame-id frame-id) - (some? (:shapes object)) - (assoc :shapes (mapv :id new-direct-children))) + (some? (:shapes shape)) + (assoc :shapes (mapv :id new-direct-children))) - new-object (update-new-object new-object object) - new-objects (into [new-object] new-children) + new-shape (update-new-shape new-shape shape) + new-shapes (into [new-shape] new-children) - updated-object (update-original-object object new-object) - updated-objects (if (identical? object updated-object) - updated-children - (into [updated-object] updated-children))] + updated-shape (update-original-shape shape new-shape) + updated-shapes (if (identical? shape updated-shape) + updated-children + (into [updated-shape] updated-children))] - [new-object new-objects updated-objects]) + [new-shape new-shapes updated-shapes]) - (let [child-id (first child-ids) - child (get objects child-id) - _ (dm/assert! (some? child)) - frame-id-child (if (cfh/frame-shape? object) - new-id - frame-id) + (let [child-id (first child-ids) + child (get objects child-id) + _ (dm/assert! (some? child)) + frame-id-child (if (cfh/frame-shape? shape) + new-id + frame-id) - [new-child new-child-objects updated-child-objects] - (clone-object child new-id objects update-new-object update-original-object nil keep-ids? frame-id-child)] + [new-child new-child-shapes updated-child-shapes] + (clone-shape child + new-id + objects + :update-new-shape update-new-shape + :update-original-shape update-original-shape + :force-id nil + :keep-ids? keep-ids? + :frame-id frame-id-child + :dest-objects dest-objects)] - (recur - (next child-ids) - (into new-direct-children [new-child]) - (into new-children new-child-objects) - (into updated-children updated-child-objects)))))))) + (recur + (next child-ids) + (into new-direct-children [new-child]) + (into new-children new-child-shapes) + (into updated-children updated-child-shapes))))))) (defn generate-shape-grid "Generate a sequence of positions that lays out the list of diff --git a/frontend/src/app/main/data/workspace/libraries_helpers.cljs b/frontend/src/app/main/data/workspace/libraries_helpers.cljs index e5150b1ca..f9854062f 100644 --- a/frontend/src/app/main/data/workspace/libraries_helpers.cljs +++ b/frontend/src/app/main/data/workspace/libraries_helpers.cljs @@ -98,11 +98,11 @@ (gsh/move delta))) [new-instance-shape new-instance-shapes _] - (ctst/clone-object main-instance-shape - (:parent-id main-instance-shape) - (:objects main-instance-page) - update-new-shape - update-original-shape) + (ctst/clone-shape main-instance-shape + (:parent-id main-instance-shape) + (:objects main-instance-page) + :update-new-shape update-new-shape + :update-original-shape update-original-shape) remap-frame (fn [shape] @@ -134,10 +134,9 @@ (let [component-root (d/seek #(nil? (:parent-id %)) (vals (:objects component))) [new-component-shape new-component-shapes _] - (ctst/clone-object component-root - nil - (get component :objects) - identity)] + (ctst/clone-shape component-root + nil + (get component :objects))] [new-component-shape new-component-shapes nil nil])))) @@ -976,15 +975,12 @@ original-shape) [_ new-shapes _] - (ctst/clone-object component-shape + (ctst/clone-shape component-shape (:id parent-shape) (get component-page :objects) - update-new-shape - update-original-shape - nil - false - nil - (:objects container)) + :update-new-shape update-new-shape + :update-original-shape update-original-shape + :dest-objects (get container :objects)) add-obj-change (fn [changes shape'] (update changes :redo-changes conj @@ -1042,11 +1038,11 @@ original-shape)) [_new-shape new-shapes updated-shapes] - (ctst/clone-object shape - (:id component-parent-shape) - (get page :objects) - update-new-shape - update-original-shape) + (ctst/clone-shape shape + (:id component-parent-shape) + (get page :objects) + :update-new-shape update-new-shape + :update-original-shape update-original-shape) add-obj-change (fn [changes shape'] (update changes :redo-changes conj