mirror of
https://github.com/penpot/penpot.git
synced 2025-02-24 07:46:13 -05:00
✨ Add api methods to align, distribute and flatten shapes
This commit is contained in:
parent
fb39dd5440
commit
8c1fba5160
3 changed files with 117 additions and 70 deletions
|
@ -970,25 +970,27 @@
|
|||
(map #(gal/align-to-rect % rect axis) selected-objs)))
|
||||
|
||||
(defn align-objects
|
||||
[axis]
|
||||
(dm/assert!
|
||||
"expected valid align axis value"
|
||||
(contains? gal/valid-align-axis axis))
|
||||
([axis]
|
||||
(align-objects axis nil))
|
||||
([axis selected]
|
||||
(dm/assert!
|
||||
"expected valid align axis value"
|
||||
(contains? gal/valid-align-axis axis))
|
||||
|
||||
(ptk/reify ::align-objects
|
||||
ptk/WatchEvent
|
||||
(watch [_ state _]
|
||||
(let [objects (wsh/lookup-page-objects state)
|
||||
selected (wsh/lookup-selected state)
|
||||
moved (if (= 1 (count selected))
|
||||
(align-object-to-parent objects (first selected) axis)
|
||||
(align-objects-list objects selected axis))
|
||||
undo-id (js/Symbol)]
|
||||
(when (can-align? selected objects)
|
||||
(rx/of (dwu/start-undo-transaction undo-id)
|
||||
(dwt/position-shapes moved)
|
||||
(ptk/data-event :layout/update {:ids selected})
|
||||
(dwu/commit-undo-transaction undo-id)))))))
|
||||
(ptk/reify ::align-objects
|
||||
ptk/WatchEvent
|
||||
(watch [_ state _]
|
||||
(let [objects (wsh/lookup-page-objects state)
|
||||
selected (or selected (wsh/lookup-selected state))
|
||||
moved (if (= 1 (count selected))
|
||||
(align-object-to-parent objects (first selected) axis)
|
||||
(align-objects-list objects selected axis))
|
||||
undo-id (js/Symbol)]
|
||||
(when (can-align? selected objects)
|
||||
(rx/of (dwu/start-undo-transaction undo-id)
|
||||
(dwt/position-shapes moved)
|
||||
(ptk/data-event :layout/update {:ids selected})
|
||||
(dwu/commit-undo-transaction undo-id))))))))
|
||||
|
||||
(defn can-distribute? [selected]
|
||||
(cond
|
||||
|
@ -997,25 +999,27 @@
|
|||
:else true))
|
||||
|
||||
(defn distribute-objects
|
||||
[axis]
|
||||
(dm/assert!
|
||||
"expected valid distribute axis value"
|
||||
(contains? gal/valid-dist-axis axis))
|
||||
([axis]
|
||||
(distribute-objects axis nil))
|
||||
([axis ids]
|
||||
(dm/assert!
|
||||
"expected valid distribute axis value"
|
||||
(contains? gal/valid-dist-axis axis))
|
||||
|
||||
(ptk/reify ::distribute-objects
|
||||
ptk/WatchEvent
|
||||
(watch [_ state _]
|
||||
(let [page-id (:current-page-id state)
|
||||
objects (wsh/lookup-page-objects state page-id)
|
||||
selected (wsh/lookup-selected state)
|
||||
moved (-> (map #(get objects %) selected)
|
||||
(gal/distribute-space axis))
|
||||
undo-id (js/Symbol)]
|
||||
(when (can-distribute? selected)
|
||||
(rx/of (dwu/start-undo-transaction undo-id)
|
||||
(dwt/position-shapes moved)
|
||||
(ptk/data-event :layout/update {:ids selected})
|
||||
(dwu/commit-undo-transaction undo-id)))))))
|
||||
(ptk/reify ::distribute-objects
|
||||
ptk/WatchEvent
|
||||
(watch [_ state _]
|
||||
(let [page-id (:current-page-id state)
|
||||
objects (wsh/lookup-page-objects state page-id)
|
||||
selected (or ids (wsh/lookup-selected state))
|
||||
moved (-> (map #(get objects %) selected)
|
||||
(gal/distribute-space axis))
|
||||
undo-id (js/Symbol)]
|
||||
(when (can-distribute? selected)
|
||||
(rx/of (dwu/start-undo-transaction undo-id)
|
||||
(dwt/position-shapes moved)
|
||||
(ptk/data-event :layout/update {:ids selected})
|
||||
(dwu/commit-undo-transaction undo-id))))))))
|
||||
|
||||
;; --- Shape Proportions
|
||||
|
||||
|
|
|
@ -15,24 +15,27 @@
|
|||
[beicon.v2.core :as rx]
|
||||
[potok.v2.core :as ptk]))
|
||||
|
||||
(defn convert-selected-to-path []
|
||||
(ptk/reify ::convert-selected-to-path
|
||||
ptk/WatchEvent
|
||||
(watch [it state _]
|
||||
(let [page-id (:current-page-id state)
|
||||
objects (wsh/lookup-page-objects state)
|
||||
selected (->> (wsh/lookup-selected state)
|
||||
(remove #(ctn/has-any-copy-parent? objects (get objects %))))
|
||||
(defn convert-selected-to-path
|
||||
([]
|
||||
(convert-selected-to-path nil))
|
||||
([ids]
|
||||
(ptk/reify ::convert-selected-to-path
|
||||
ptk/WatchEvent
|
||||
(watch [it state _]
|
||||
(let [page-id (:current-page-id state)
|
||||
objects (wsh/lookup-page-objects state)
|
||||
selected (->> (or ids (wsh/lookup-selected state))
|
||||
(remove #(ctn/has-any-copy-parent? objects (get objects %))))
|
||||
|
||||
children-ids
|
||||
(into #{}
|
||||
(mapcat #(cph/get-children-ids objects %))
|
||||
selected)
|
||||
children-ids
|
||||
(into #{}
|
||||
(mapcat #(cph/get-children-ids objects %))
|
||||
selected)
|
||||
|
||||
changes
|
||||
(-> (pcb/empty-changes it page-id)
|
||||
(pcb/with-objects objects)
|
||||
(pcb/update-shapes selected #(upsp/convert-to-path % objects))
|
||||
(pcb/remove-objects children-ids))]
|
||||
changes
|
||||
(-> (pcb/empty-changes it page-id)
|
||||
(pcb/with-objects objects)
|
||||
(pcb/update-shapes selected #(upsp/convert-to-path % objects))
|
||||
(pcb/remove-objects children-ids))]
|
||||
|
||||
(rx/of (dch/commit-changes changes))))))
|
||||
(rx/of (dch/commit-changes changes)))))))
|
||||
|
|
|
@ -371,30 +371,70 @@
|
|||
(st/emit! (dw/go-to-page id))))
|
||||
|
||||
(alignHorizontal
|
||||
[_ _shapes _direction]
|
||||
;; TODO
|
||||
)
|
||||
[_ shapes direction]
|
||||
(let [dir (case direction
|
||||
"left" :hleft
|
||||
"center" :hcenter
|
||||
"right" :hright
|
||||
nil)]
|
||||
(cond
|
||||
(nil? dir)
|
||||
(u/display-not-valid :alignHorizontal-direction "Direction not valid")
|
||||
|
||||
(or (not (array? shapes)) (not (every? shape/shape-proxy? shapes)))
|
||||
(u/display-not-valid :alignHorizontal-shapes "Not valid shapes")
|
||||
|
||||
:else
|
||||
(let [ids (into #{} (map #(obj/get % "$id")) shapes)]
|
||||
(st/emit! (dw/align-objects dir ids))))))
|
||||
|
||||
(alignVertical
|
||||
[_ _shapes _direction]
|
||||
;; TODO
|
||||
)
|
||||
[_ shapes direction]
|
||||
(let [dir (case direction
|
||||
"top" :vtop
|
||||
"center" :vcenter
|
||||
"bottom" :vbottom
|
||||
nil)]
|
||||
(cond
|
||||
(nil? dir)
|
||||
(u/display-not-valid :alignVertical-direction "Direction not valid")
|
||||
|
||||
(or (not (array? shapes)) (not (every? shape/shape-proxy? shapes)))
|
||||
(u/display-not-valid :alignVertical-shapes "Not valid shapes")
|
||||
|
||||
:else
|
||||
(let [ids (into #{} (map #(obj/get % "$id")) shapes)]
|
||||
(st/emit! (dw/align-objects dir ids))))))
|
||||
|
||||
(distributeHorizontal
|
||||
[_ _shapes]
|
||||
;; TODO
|
||||
)
|
||||
[_ shapes]
|
||||
(cond
|
||||
(or (not (array? shapes)) (not (every? shape/shape-proxy? shapes)))
|
||||
(u/display-not-valid :distributeHorizontal-shapes "Not valid shapes")
|
||||
|
||||
:else
|
||||
(let [ids (into #{} (map #(obj/get % "$id")) shapes)]
|
||||
(st/emit! (dw/distribute-objects :horizontal ids)))))
|
||||
|
||||
(distributeVertical
|
||||
[_ _shapes]
|
||||
;; TODO
|
||||
)
|
||||
[_ shapes]
|
||||
(cond
|
||||
(or (not (array? shapes)) (not (every? shape/shape-proxy? shapes)))
|
||||
(u/display-not-valid :distributeVertical-shapes "Not valid shapes")
|
||||
|
||||
:else
|
||||
(let [ids (into #{} (map #(obj/get % "$id")) shapes)]
|
||||
(st/emit! (dw/distribute-objects :vertical ids)))))
|
||||
|
||||
(flatten
|
||||
[_ _shapes]
|
||||
;; TODO
|
||||
)
|
||||
)
|
||||
[_ shapes]
|
||||
(cond
|
||||
(or (not (array? shapes)) (not (every? shape/shape-proxy? shapes)))
|
||||
(u/display-not-valid :flatten-shapes "Not valid shapes")
|
||||
|
||||
:else
|
||||
(let [ids (into #{} (map #(obj/get % "$id")) shapes)]
|
||||
(st/emit! (dw/convert-selected-to-path ids))))))
|
||||
|
||||
(defn create-context
|
||||
[plugin-id]
|
||||
|
|
Loading…
Add table
Reference in a new issue