mirror of
https://github.com/penpot/penpot.git
synced 2025-03-12 15:51:37 -05:00
✨ Change parent/children constraint for problematic configurations
This commit is contained in:
parent
071ac0366c
commit
00e265695c
1 changed files with 75 additions and 2 deletions
|
@ -271,16 +271,89 @@
|
|||
(ptk/data-event :layout/update ids)
|
||||
(dwu/commit-undo-transaction undo-id))))))
|
||||
|
||||
(defn fix-child-sizing
|
||||
[objects parent-changes shape]
|
||||
|
||||
(let [parent (-> (cph/get-parent objects (:id shape))
|
||||
(d/deep-merge parent-changes))
|
||||
|
||||
auto-width? (ctl/auto-width? parent)
|
||||
auto-height? (ctl/auto-height? parent)
|
||||
col? (ctl/col? parent)
|
||||
row? (ctl/row? parent)
|
||||
|
||||
all-children (->> parent :shapes (map (d/getf objects)))]
|
||||
|
||||
(cond-> shape
|
||||
;; If the parent is hug width and the direction column
|
||||
;; change to fixed when ALL children are fill
|
||||
(and col? auto-width? (every? ctl/fill-width? all-children))
|
||||
(assoc :layout-item-h-sizing :fix)
|
||||
|
||||
;; If the parent is hug height and the direction is column
|
||||
;; change to fixed when ANY children is fill
|
||||
(and col? auto-height? (ctl/fill-height? shape))
|
||||
(assoc :layout-item-v-sizing :fix)
|
||||
|
||||
;; If the parent is hug width and the direction row
|
||||
;; change to fixed when ANY children is fill
|
||||
(and row? auto-width? (ctl/fill-width? shape))
|
||||
(assoc :layout-item-h-sizing :fix)
|
||||
|
||||
;; If the parent is hug height and the direction row
|
||||
;; change to fixed when ALL children are fill
|
||||
(and row? auto-height? (every? ctl/fill-height? all-children))
|
||||
(assoc :layout-item-v-sizing :fix))))
|
||||
|
||||
(defn fix-parent-sizing
|
||||
[objects ids-set changes parent]
|
||||
|
||||
(let [auto-width? (ctl/auto-width? parent)
|
||||
auto-height? (ctl/auto-height? parent)
|
||||
col? (ctl/col? parent)
|
||||
row? (ctl/row? parent)
|
||||
|
||||
all-children
|
||||
(->> parent :shapes
|
||||
(map (d/getf objects))
|
||||
(map (fn [shape]
|
||||
(if (contains? ids-set (:id shape))
|
||||
(d/deep-merge shape changes)
|
||||
shape))))]
|
||||
|
||||
(cond-> parent
|
||||
;; Col layout and parent is hug-width if all children are fill-width
|
||||
;; change parent to fixed
|
||||
(and col? auto-width? (every? ctl/fill-width? all-children))
|
||||
(assoc :layout-item-h-sizing :fix)
|
||||
|
||||
;; Col layout and parent is hug-height if any children is fill-height
|
||||
;; change parent to fixed
|
||||
(and col? auto-height? (some ctl/fill-height? all-children))
|
||||
(assoc :layout-item-v-sizing :fix)
|
||||
|
||||
;; Row layout and parent is hug-width if any children is fill-width
|
||||
;; change parent to fixed
|
||||
(and row? auto-width? (some ctl/fill-width? all-children))
|
||||
(assoc :layout-item-h-sizing :fix)
|
||||
|
||||
;; Row layout and parent is hug-height if all children are fill-height
|
||||
;; change parent to fixed
|
||||
(and row? auto-height? (every? ctl/fill-height? all-children))
|
||||
(assoc :layout-item-v-sizing :fix))))
|
||||
|
||||
(defn update-layout-child
|
||||
[ids changes]
|
||||
(ptk/reify ::update-layout-child
|
||||
ptk/WatchEvent
|
||||
(watch [_ state _]
|
||||
(let [objects (wsh/lookup-page-objects state)
|
||||
children-ids (->> ids (mapcat #(cph/get-children-ids objects %)))
|
||||
parent-ids (->> ids (map #(cph/get-parent-id objects %)))
|
||||
layout-ids (->> ids (filter (comp ctl/layout? (d/getf objects))))
|
||||
undo-id (js/Symbol)]
|
||||
(rx/of (dwu/start-undo-transaction undo-id)
|
||||
(dwc/update-shapes ids #(d/deep-merge (or % {}) changes))
|
||||
(ptk/data-event :layout/update (d/concat-vec layout-ids parent-ids))
|
||||
(dwc/update-shapes children-ids (partial fix-child-sizing objects changes))
|
||||
(dwc/update-shapes parent-ids (partial fix-parent-sizing objects (set ids) changes))
|
||||
(ptk/data-event :layout/update ids)
|
||||
(dwu/commit-undo-transaction undo-id))))))
|
||||
|
|
Loading…
Add table
Reference in a new issue