mirror of
https://github.com/penpot/penpot.git
synced 2025-05-21 00:46:10 +02:00
🎉 Control when the mask of a group is moved or deleted
This commit is contained in:
parent
f9c45849c8
commit
4be7f054b7
4 changed files with 167 additions and 88 deletions
|
@ -677,10 +677,8 @@
|
|||
(let [page-id (:current-page-id state)
|
||||
objects (dwc/lookup-page-objects state page-id)
|
||||
|
||||
del-change #(array-map :type :del-obj :page-id page-id :id %)
|
||||
|
||||
get-empty-parents
|
||||
(fn get-empty-parents [parents]
|
||||
(fn [parents]
|
||||
(->> parents
|
||||
(map (fn [id]
|
||||
(let [obj (get objects id)]
|
||||
|
@ -690,43 +688,78 @@
|
|||
(take-while (complement nil?))
|
||||
(map :id)))
|
||||
|
||||
rchanges
|
||||
(reduce (fn [res id]
|
||||
(let [children (cph/get-children id objects)
|
||||
parents (cph/get-parents id objects)]
|
||||
(d/concat res
|
||||
(map del-change (reverse children))
|
||||
[(del-change id)]
|
||||
(map del-change (get-empty-parents parents))
|
||||
[{:type :reg-objects
|
||||
:page-id page-id
|
||||
:shapes (vec parents)}])))
|
||||
[]
|
||||
groups-to-unmask
|
||||
(reduce (fn [group-ids id]
|
||||
;; When the shape to delete is the mask of a masked group,
|
||||
;; the mask condition must be removed, and it must be
|
||||
;; converted to a normal group.
|
||||
(let [obj (get objects id)
|
||||
parent (get objects (:parent-id obj))]
|
||||
(if (and (:masked-group? parent)
|
||||
(= id (first (:shapes parent))))
|
||||
(conj group-ids (:id parent))
|
||||
group-ids)))
|
||||
#{}
|
||||
ids)
|
||||
|
||||
rchanges
|
||||
(d/concat
|
||||
(reduce (fn [res id]
|
||||
(let [children (cph/get-children id objects)
|
||||
parents (cph/get-parents id objects)
|
||||
del-change #(array-map
|
||||
:type :del-obj
|
||||
:page-id page-id
|
||||
:id %)]
|
||||
(d/concat res
|
||||
(map del-change (reverse children))
|
||||
[(del-change id)]
|
||||
(map del-change (get-empty-parents parents))
|
||||
[{:type :reg-objects
|
||||
:page-id page-id
|
||||
:shapes (vec parents)}])))
|
||||
[]
|
||||
ids)
|
||||
(map #(array-map
|
||||
:type :mod-obj
|
||||
:page-id page-id
|
||||
:id %
|
||||
:operations [{:type :set
|
||||
:attr :masked-group?
|
||||
:val false}])
|
||||
groups-to-unmask))
|
||||
|
||||
uchanges
|
||||
(reduce (fn [res id]
|
||||
(let [children (cph/get-children id objects)
|
||||
parents (cph/get-parents id objects)
|
||||
add-chg (fn [id]
|
||||
(let [item (get objects id)]
|
||||
{:type :add-obj
|
||||
:id (:id item)
|
||||
:page-id page-id
|
||||
:index (cph/position-on-parent id objects)
|
||||
:frame-id (:frame-id item)
|
||||
:parent-id (:parent-id item)
|
||||
:obj item}))]
|
||||
(d/concat res
|
||||
(map add-chg (reverse (get-empty-parents parents)))
|
||||
[(add-chg id)]
|
||||
(map add-chg children)
|
||||
[{:type :reg-objects
|
||||
:page-id page-id
|
||||
:shapes (vec parents)}])))
|
||||
[]
|
||||
ids)
|
||||
]
|
||||
(d/concat
|
||||
(reduce (fn [res id]
|
||||
(let [children (cph/get-children id objects)
|
||||
parents (cph/get-parents id objects)
|
||||
add-change (fn [id]
|
||||
(let [item (get objects id)]
|
||||
{:type :add-obj
|
||||
:id (:id item)
|
||||
:page-id page-id
|
||||
:index (cph/position-on-parent id objects)
|
||||
:frame-id (:frame-id item)
|
||||
:parent-id (:parent-id item)
|
||||
:obj item}))]
|
||||
(d/concat res
|
||||
(map add-change (reverse (get-empty-parents parents)))
|
||||
[(add-change id)]
|
||||
(map add-change children)
|
||||
[{:type :reg-objects
|
||||
:page-id page-id
|
||||
:shapes (vec parents)}])))
|
||||
[]
|
||||
ids)
|
||||
(map #(array-map
|
||||
:type :mod-obj
|
||||
:page-id page-id
|
||||
:id %
|
||||
:operations [{:type :set
|
||||
:attr :masked-group?
|
||||
:val true}])
|
||||
groups-to-unmask))]
|
||||
|
||||
;; (println "================ rchanges")
|
||||
;; (cljs.pprint/pprint rchanges)
|
||||
|
@ -808,29 +841,60 @@
|
|||
(conj res (cph/get-parent (first ids) objects))
|
||||
(next ids))))
|
||||
|
||||
rchanges [{:type :mov-objects
|
||||
:parent-id parent-id
|
||||
:page-id page-id
|
||||
:index to-index
|
||||
:shapes (vec (reverse ids))}
|
||||
{:type :reg-objects
|
||||
:page-id page-id
|
||||
:shapes parents}]
|
||||
groups-to-unmask
|
||||
(reduce (fn [group-ids id]
|
||||
;; When a masked group loses its mask shape, because it's
|
||||
;; moved outside the group, the mask condition must be
|
||||
;; removed, and it must be converted to a normal group.
|
||||
(let [obj (get objects id)
|
||||
parent (get objects (:parent-id obj))]
|
||||
(if (and (:masked-group? parent)
|
||||
(= id (first (:shapes parent)))
|
||||
(not= (:id parent) parent-id))
|
||||
(conj group-ids (:id parent))
|
||||
group-ids)))
|
||||
#{}
|
||||
ids)
|
||||
|
||||
uchanges
|
||||
(reduce (fn [res id]
|
||||
(let [obj (get objects id)]
|
||||
(conj res
|
||||
{:type :mov-objects
|
||||
:parent-id (:parent-id obj)
|
||||
rchanges (d/concat
|
||||
[{:type :mov-objects
|
||||
:parent-id parent-id
|
||||
:page-id page-id
|
||||
:index to-index
|
||||
:shapes (vec (reverse ids))}
|
||||
{:type :reg-objects
|
||||
:page-id page-id
|
||||
:shapes parents}]
|
||||
(map (fn [group-id]
|
||||
{:type :mod-obj
|
||||
:page-id page-id
|
||||
:index (cph/position-on-parent id objects)
|
||||
:shapes [id]})))
|
||||
[] (reverse ids))
|
||||
uchanges (conj uchanges
|
||||
{:type :reg-objects
|
||||
:id group-id
|
||||
:operations [{:type :set
|
||||
:attr :masked-group?
|
||||
:val false}]})
|
||||
groups-to-unmask))
|
||||
|
||||
uchanges (d/concat
|
||||
(reduce (fn [res id]
|
||||
(let [obj (get objects id)]
|
||||
(conj res
|
||||
{:type :mov-objects
|
||||
:parent-id (:parent-id obj)
|
||||
:page-id page-id
|
||||
:index (cph/position-on-parent id objects)
|
||||
:shapes [id]})))
|
||||
[] (reverse ids))
|
||||
[{:type :reg-objects
|
||||
:page-id page-id
|
||||
:shapes parents})]
|
||||
:shapes parents}]
|
||||
(map (fn [group-id]
|
||||
{:type :mod-obj
|
||||
:page-id page-id
|
||||
:id group-id
|
||||
:operations [{:type :set
|
||||
:attr :masked-group?
|
||||
:val true}]})
|
||||
groups-to-unmask))]
|
||||
|
||||
;; (println "================ rchanges")
|
||||
;; (cljs.pprint/pprint rchanges)
|
||||
|
@ -1577,9 +1641,10 @@
|
|||
"+" #(st/emit! (increase-zoom nil))
|
||||
"-" #(st/emit! (decrease-zoom nil))
|
||||
"ctrl+g" #(st/emit! group-selected)
|
||||
"ctrl+shift+m" #(st/emit! mask-group)
|
||||
"ctrl+k" #(st/emit! dwl/add-component)
|
||||
"shift+g" #(st/emit! ungroup-selected)
|
||||
"ctrl+m" #(st/emit! mask-group)
|
||||
"shift+m" #(st/emit! unmask-group)
|
||||
"ctrl+k" #(st/emit! dwl/add-component)
|
||||
"shift+0" #(st/emit! reset-zoom)
|
||||
"shift+1" #(st/emit! zoom-to-fit-all)
|
||||
"shift+2" #(st/emit! zoom-to-selected-shape)
|
||||
|
|
|
@ -105,7 +105,7 @@
|
|||
:shortcut "Ctrl + g"
|
||||
:on-click do-create-group}]
|
||||
[:& menu-entry {:title "Mask"
|
||||
:shortcut "Ctrl + Shift + M"
|
||||
:shortcut "Ctrl + M"
|
||||
:on-click do-mask-group}]])
|
||||
|
||||
(when (and (= (count selected) 1) (= (:type shape) :group))
|
||||
|
@ -115,10 +115,10 @@
|
|||
:on-click do-remove-group}]
|
||||
(if (:masked-group? shape)
|
||||
[:& menu-entry {:title "Unmask"
|
||||
:shortcut "Ctrl + Shift + M"
|
||||
:shortcut "Shift + M"
|
||||
:on-click do-unmask-group}]
|
||||
[:& menu-entry {:title "Mask"
|
||||
:shortcut "Ctrl + Shift + M"
|
||||
:shortcut "Ctrl + M"
|
||||
:on-click do-mask-group}])])
|
||||
|
||||
(if (:hidden shape)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue