diff --git a/frontend/src/app/main/data/workspace.cljs b/frontend/src/app/main/data/workspace.cljs index 2a60496b2e..e6ea22308e 100644 --- a/frontend/src/app/main/data/workspace.cljs +++ b/frontend/src/app/main/data/workspace.cljs @@ -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 diff --git a/frontend/src/app/main/data/workspace/path/shapes_to_path.cljs b/frontend/src/app/main/data/workspace/path/shapes_to_path.cljs index d6367aefd0..e916aec627 100644 --- a/frontend/src/app/main/data/workspace/path/shapes_to_path.cljs +++ b/frontend/src/app/main/data/workspace/path/shapes_to_path.cljs @@ -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))))))) diff --git a/frontend/src/app/plugins/api.cljs b/frontend/src/app/plugins/api.cljs index d53a53d8ea..8d8837daab 100644 --- a/frontend/src/app/plugins/api.cljs +++ b/frontend/src/app/plugins/api.cljs @@ -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]