0
Fork 0
mirror of https://github.com/penpot/penpot.git synced 2025-02-24 15:56:11 -05:00

🐛 Fix problem when creating groups inside grid

This commit is contained in:
alonso.torres 2023-09-19 12:12:21 +02:00 committed by Andrey Antukh
parent 9d6bd64027
commit e5b05eff23
8 changed files with 76 additions and 26 deletions

View file

@ -173,6 +173,8 @@
(dm/export gtr/transform-bounds)
(dm/export gtr/move-position-data)
(dm/export gtr/apply-objects-modifiers)
(dm/export gtr/apply-children-modifiers)
(dm/export gtr/update-shapes-geometry)
;; Constratins
(dm/export gct/calc-child-modifiers)

View file

@ -455,6 +455,29 @@
(assoc :points points))
(update-group-selrect shape children))))
(defn update-shapes-geometry
[objects ids]
(->> ids
(reduce
(fn [objects id]
(let [shape (get objects id)
children (cph/get-immediate-children objects id)
shape
(cond
(cph/mask-shape? shape)
(update-mask-selrect shape children)
(cph/bool-shape? shape)
(update-bool-selrect shape children objects)
(cph/group-shape? shape)
(update-group-selrect shape children)
:else
shape)]
(assoc objects id shape)))
objects)))
(defn transform-shape
([shape]
(let [modifiers (:modifiers shape)]

View file

@ -367,7 +367,7 @@
(comp first first))
new-shapes
(into [] (sort-by id->idx < old-shapes))]
(into [] (sort-by #(or (id->idx %) -1) < old-shapes))]
(reset! changed? (not= old-shapes new-shapes))

View file

@ -528,8 +528,7 @@
:layout-justify-items
:layout-grid-dir
:layout-grid-columns
:layout-grid-rows
))
:layout-grid-rows))
(defn remove-layout-item-data
[shape]

View file

@ -107,12 +107,28 @@
;; docstring to understand the real purpose of this code
ids-to-delete (get-empty-groups-after-group-creation objects parent-id shapes)
target-cell
(when (ctl/grid-layout? objects parent-id)
(ctl/get-cell-by-shape-id (get objects parent-id) (-> shapes last :id)))
grid-parents
(into []
(comp (map :parent-id)
(filter (partial ctl/grid-layout? objects)))
shapes)
changes (-> (pcb/empty-changes it page-id)
(pcb/with-objects objects)
(pcb/add-object group {:index group-idx})
(pcb/update-shapes (map :id shapes) ctl/remove-layout-item-data)
(pcb/change-parent (:id group) (reverse shapes))
(pcb/update-shapes (map :id shapes-to-detach) ctk/detach-shape)
(cond-> target-cell
(pcb/update-shapes
[parent-id]
(fn [parent]
(assoc-in parent [:layout-grid-cells (:id target-cell) :shapes] [(:id group)]))))
(pcb/update-shapes grid-parents ctl/assign-cells)
(pcb/remove-objects ids-to-delete))]
[group changes]))
@ -212,12 +228,14 @@
objects (wsh/lookup-page-objects state page-id)
selected (wsh/lookup-selected state)
selected (cph/clean-loops objects selected)
shapes (shapes-for-grouping objects selected)]
shapes (shapes-for-grouping objects selected)
parents (into #{} (map :parent-id) shapes)]
(when-not (empty? shapes)
(let [[group changes]
(prepare-create-group it objects page-id shapes "Group" false)]
(rx/of (dch/commit-changes changes)
(dws/select-shapes (d/ordered-set (:id group))))))))))
(dws/select-shapes (d/ordered-set (:id group)))
(ptk/data-event :layout/update parents))))))))
(def ungroup-selected
(ptk/reify ::ungroup-selected

View file

@ -299,7 +299,8 @@
(let [file-id (:current-file-id state)
page-id (:current-page-id state)
objects (wsh/lookup-page-objects state page-id)
shapes (dwg/shapes-for-grouping objects selected)]
shapes (dwg/shapes-for-grouping objects selected)
parents (into #{} (map :parent-id) shapes)]
(when-not (empty? shapes)
(let [[root _ changes]
(dwlh/generate-add-component it shapes objects page-id file-id components-v2
@ -307,7 +308,8 @@
dwsh/prepare-create-artboard-from-selection)]
(when-not (empty? (:redo-changes changes))
(rx/of (dch/commit-changes changes)
(dws/select-shapes (d/ordered-set (:id root)))))))))))
(dws/select-shapes (d/ordered-set (:id root)))
(ptk/data-event :layout/update parents)))))))))
(defn add-component
"Add a new component to current file library, from the currently selected shapes.

View file

@ -177,19 +177,20 @@
modif-tree)))
(defn add-grid-children-modifiers
[modifiers frame-id selected objects [row column :as cell]]
[modifiers frame-id shapes objects [row column :as cell]]
(let [frame (get objects frame-id)
ids (set shapes)
;; Temporary remove the children when moving them
frame (-> frame
(update :shapes #(d/removev selected %))
(update :shapes #(d/removev ids %))
(ctl/assign-cells))
selected (->> selected (remove #(ctl/layout-absolute? objects %)))
ids (->> ids (remove #(ctl/layout-absolute? objects %)))
frame (-> frame
(update :shapes d/concat-vec selected)
(update :shapes d/concat-vec ids)
(cond-> (some? cell)
(ctl/push-into-cell selected row column))
(ctl/push-into-cell ids row column))
(ctl/assign-cells))]
(-> modifiers
@ -205,6 +206,7 @@
target-frame (get objects target-frame-id)
target-flex-layout? (ctl/flex-layout? target-frame)
target-grid-layout? (ctl/grid-layout? target-frame)
children-ids (concat (:shapes target-frame) selected)
@ -225,12 +227,12 @@
(fn [modif-tree [original-frame shapes]]
(let [shapes (->> shapes (d/removev #(= target-frame-id %)))
shapes (cond->> shapes
(and target-flex-layout? (= original-frame target-frame-id))
(and (or target-grid-layout? target-flex-layout?)
(= original-frame target-frame-id))
;; When movining inside a layout frame remove the shapes that are not immediate children
(filterv #(contains? child-set %)))
children-ids (->> (dm/get-in objects [original-frame :shapes])
(remove (set selected)))
h-sizing? (and (ctl/flex-layout? objects original-frame)
(ctl/change-h-sizing? original-frame objects children-ids))
v-sizing? (and (ctl/flex-layout? objects original-frame)
@ -246,7 +248,11 @@
(update-in [original-frame :modifiers] ctm/change-property :layout-item-v-sizing :fix)))
(and target-flex-layout? (= original-frame target-frame-id))
(update-in [target-frame-id :modifiers] ctm/add-children shapes drop-index))))]
(update-in [target-frame-id :modifiers] ctm/add-children shapes drop-index)
;; Add the object to the cell
target-grid-layout?
(update-in [target-frame-id :modifiers] add-grid-children-modifiers target-frame-id shapes objects cell-data))))]
(as-> modif-tree $
(reduce update-frame-modifiers $ origin-frame-ids)
@ -259,11 +265,7 @@
;; Set fix position to target frame (vertical)
(and (ctl/flex-layout? objects target-frame-id)
(ctl/change-v-sizing? target-frame-id objects children-ids))
(update-in [target-frame-id :modifiers] ctm/change-property :layout-item-v-sizing :fix)
;; Add the object to the cell
(ctl/grid-layout? objects target-frame-id)
(update-in [target-frame-id :modifiers] add-grid-children-modifiers target-frame-id selected objects cell-data)))))
(update-in [target-frame-id :modifiers] ctm/change-property :layout-item-v-sizing :fix)))))
(defn modif->js
[modif-tree objects]

View file

@ -15,6 +15,7 @@
[app.common.geom.shapes.grid-layout :as gsg]
[app.common.geom.shapes.points :as gpo]
[app.common.math :as mth]
[app.common.pages.helpers :as cph]
[app.common.types.modifiers :as ctm]
[app.common.types.shape.layout :as ctl]
[app.main.data.workspace.grid-layout.editor :as dwge]
@ -734,13 +735,16 @@
children
(mf/use-memo
(mf/deps shape modifiers)
(mf/deps objects shape modifiers)
(fn []
(->> (:shapes shape)
(map (d/getf objects))
(map #(gsh/transform-shape % (dm/get-in modifiers [(:id %) :modifiers])))
(remove :hidden)
(map #(vector (gpo/parent-coords-bounds (:points %) (:points shape)) %)))))
(let [ids (cph/get-children-ids objects (:id shape))
objects (-> objects
(gsh/apply-objects-modifiers (select-keys modifiers ids))
(gsh/update-shapes-geometry (reverse ids)))]
(->> (:shapes shape)
(map (d/getf objects))
(remove :hidden)
(map #(vector (gpo/parent-coords-bounds (:points %) (:points shape)) %))))))
children (hooks/use-equal-memo children)