mirror of
https://github.com/penpot/penpot.git
synced 2025-04-01 01:21:21 -05:00
✨ Reorder layers through keys in flex layout
This commit is contained in:
parent
a66b40d79e
commit
3c5be31222
2 changed files with 81 additions and 7 deletions
|
@ -1841,7 +1841,8 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.padding-icons, .margin-item-icons {
|
.padding-icons,
|
||||||
|
.margin-item-icons {
|
||||||
margin-bottom: 8px;
|
margin-bottom: 8px;
|
||||||
margin-top: 3px;
|
margin-top: 3px;
|
||||||
margin-right: 1px;
|
margin-right: 1px;
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
"Events related with shapes transformations"
|
"Events related with shapes transformations"
|
||||||
(:require
|
(:require
|
||||||
[app.common.data :as d]
|
[app.common.data :as d]
|
||||||
|
[app.common.data.macros :as dm]
|
||||||
[app.common.geom.matrix :as gmt]
|
[app.common.geom.matrix :as gmt]
|
||||||
[app.common.geom.point :as gpt]
|
[app.common.geom.point :as gpt]
|
||||||
[app.common.geom.shapes :as gsh]
|
[app.common.geom.shapes :as gsh]
|
||||||
|
@ -516,14 +517,70 @@
|
||||||
|
|
||||||
(s/def ::direction #{:up :down :right :left})
|
(s/def ::direction #{:up :down :right :left})
|
||||||
|
|
||||||
(defn move-selected
|
(defn reorder-selected-layout-child
|
||||||
|
[direction]
|
||||||
|
(ptk/reify ::reorder-layout-child
|
||||||
|
ptk/WatchEvent
|
||||||
|
(watch [it state _]
|
||||||
|
(let [selected (wsh/lookup-selected state {:omit-blocked? true})
|
||||||
|
objects (wsh/lookup-page-objects state)
|
||||||
|
page-id (:current-page-id state)
|
||||||
|
|
||||||
|
get-new-position
|
||||||
|
(fn [parent-id position]
|
||||||
|
(let [parent (get objects parent-id)]
|
||||||
|
(when (ctl/layout? parent)
|
||||||
|
(if (or
|
||||||
|
(and (ctl/reverse? parent)
|
||||||
|
(or (= direction :left)
|
||||||
|
(= direction :up)))
|
||||||
|
(and (not (ctl/reverse? parent))
|
||||||
|
(or (= direction :right)
|
||||||
|
(= direction :down))))
|
||||||
|
(dec position)
|
||||||
|
(+ position 2)))))
|
||||||
|
|
||||||
|
add-children-position
|
||||||
|
(fn [[parent-id children]]
|
||||||
|
(let [children+position
|
||||||
|
(->> children
|
||||||
|
(keep #(let [new-position (get-new-position
|
||||||
|
parent-id
|
||||||
|
(cph/get-position-on-parent objects %))]
|
||||||
|
(when new-position
|
||||||
|
(vector % new-position))))
|
||||||
|
(sort-by second >))]
|
||||||
|
[parent-id children+position]))
|
||||||
|
|
||||||
|
change-parents-and-position
|
||||||
|
(->> selected
|
||||||
|
(group-by #(dm/get-in objects [% :parent-id]))
|
||||||
|
(map add-children-position)
|
||||||
|
(into {}))
|
||||||
|
|
||||||
|
changes
|
||||||
|
(->> change-parents-and-position
|
||||||
|
(reduce
|
||||||
|
(fn [changes [parent-id children]]
|
||||||
|
(->> children
|
||||||
|
(reduce
|
||||||
|
(fn [changes [child-id index]]
|
||||||
|
(pcb/change-parent changes parent-id
|
||||||
|
[(get objects child-id)]
|
||||||
|
index))
|
||||||
|
changes)))
|
||||||
|
(-> (pcb/empty-changes it page-id)
|
||||||
|
(pcb/with-objects objects))))]
|
||||||
|
|
||||||
|
(rx/of (dch/commit-changes changes)
|
||||||
|
(ptk/data-event :layout/update selected))))))
|
||||||
|
|
||||||
|
(defn nudge-selected-shapes
|
||||||
"Move shapes a fixed increment in one direction, from a keyboard action."
|
"Move shapes a fixed increment in one direction, from a keyboard action."
|
||||||
[direction shift?]
|
[direction shift?]
|
||||||
(us/verify ::direction direction)
|
|
||||||
(us/verify boolean? shift?)
|
|
||||||
|
|
||||||
(let [same-event (js/Symbol "same-event")]
|
(let [same-event (js/Symbol "same-event")]
|
||||||
(ptk/reify ::move-selected
|
(ptk/reify ::nudge-selected-shapes
|
||||||
IDeref
|
IDeref
|
||||||
(-deref [_] direction)
|
(-deref [_] direction)
|
||||||
|
|
||||||
|
@ -541,7 +598,7 @@
|
||||||
(let [selected (wsh/lookup-selected state {:omit-blocked? true})
|
(let [selected (wsh/lookup-selected state {:omit-blocked? true})
|
||||||
nudge (get-in state [:profile :props :nudge] {:big 10 :small 1})
|
nudge (get-in state [:profile :props :nudge] {:big 10 :small 1})
|
||||||
move-events (->> stream
|
move-events (->> stream
|
||||||
(rx/filter (ptk/type? ::move-selected))
|
(rx/filter (ptk/type? ::nudge-selected-shapes))
|
||||||
(rx/filter #(= direction (deref %))))
|
(rx/filter #(= direction (deref %))))
|
||||||
stopper (->> move-events
|
stopper (->> move-events
|
||||||
(rx/debounce 100)
|
(rx/debounce 100)
|
||||||
|
@ -556,12 +613,28 @@
|
||||||
(rx/map #(dwm/create-modif-tree selected (ctm/move-modifiers %)))
|
(rx/map #(dwm/create-modif-tree selected (ctm/move-modifiers %)))
|
||||||
(rx/map (partial dwm/set-modifiers))
|
(rx/map (partial dwm/set-modifiers))
|
||||||
(rx/take-until stopper))
|
(rx/take-until stopper))
|
||||||
(rx/of (move-selected direction shift?)))
|
(rx/of (nudge-selected-shapes direction shift?)))
|
||||||
|
|
||||||
(rx/of (dwm/apply-modifiers)
|
(rx/of (dwm/apply-modifiers)
|
||||||
(finish-transform))))
|
(finish-transform))))
|
||||||
(rx/empty))))))
|
(rx/empty))))))
|
||||||
|
|
||||||
|
(defn move-selected
|
||||||
|
"Move shapes a fixed increment in one direction, from a keyboard action."
|
||||||
|
[direction shift?]
|
||||||
|
(us/verify ::direction direction)
|
||||||
|
(us/verify boolean? shift?)
|
||||||
|
|
||||||
|
(ptk/reify ::move-selected
|
||||||
|
ptk/WatchEvent
|
||||||
|
(watch [_ state _]
|
||||||
|
(let [objects (wsh/lookup-page-objects state)
|
||||||
|
selected (wsh/lookup-selected state {:omit-blocked? true})
|
||||||
|
selected-shapes (->> selected (map (d/getf objects)))]
|
||||||
|
(if (every? (partial ctl/layout-child? objects) selected-shapes)
|
||||||
|
(rx/of (reorder-selected-layout-child direction))
|
||||||
|
(rx/of (nudge-selected-shapes direction shift?)))))))
|
||||||
|
|
||||||
(s/def ::x number?)
|
(s/def ::x number?)
|
||||||
(s/def ::y number?)
|
(s/def ::y number?)
|
||||||
(s/def ::position
|
(s/def ::position
|
||||||
|
|
Loading…
Add table
Reference in a new issue