From 9fd6c65d9314cd70adb2c8ee6d12ab25322bd4de Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Wed, 18 Jan 2023 14:34:16 +0100 Subject: [PATCH 1/7] :bug: Fix problem with empty paths --- .../src/app/main/data/workspace/path/drawing.cljs | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/frontend/src/app/main/data/workspace/path/drawing.cljs b/frontend/src/app/main/data/workspace/path/drawing.cljs index ef0e9403d5..649d845712 100644 --- a/frontend/src/app/main/data/workspace/path/drawing.cljs +++ b/frontend/src/app/main/data/workspace/path/drawing.cljs @@ -279,11 +279,14 @@ state))) ptk/WatchEvent - (watch [_ _ _] - (rx/of (setup-frame-path) - (dwdc/handle-finish-drawing) - (dwe/start-edition-mode shape-id) - (change-edit-mode :draw))))) + (watch [_ state _] + (let [content (get-in state [:workspace-drawing :object :content] [])] + (if (seq content) + (rx/of (setup-frame-path) + (dwdc/handle-finish-drawing) + (dwe/start-edition-mode shape-id) + (change-edit-mode :draw)) + (rx/of (dwdc/handle-finish-drawing))))))) (defn handle-new-shape "Creates a new path shape" From 89371e10d10498029675a09371214dc61edbeb7d Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Wed, 18 Jan 2023 14:34:58 +0100 Subject: [PATCH 2/7] :bug: Fix problem moving shapes inside a group inside a layout --- .../src/app/common/geom/shapes/modifiers.cljc | 2 +- common/src/app/common/types/shape/layout.cljc | 17 ++++++++++++----- .../src/app/main/data/workspace/transforms.cljs | 4 ++-- frontend/src/app/main/refs.cljs | 6 +++--- frontend/src/app/util/snap_data.cljs | 4 ++-- 5 files changed, 20 insertions(+), 13 deletions(-) diff --git a/common/src/app/common/geom/shapes/modifiers.cljc b/common/src/app/common/geom/shapes/modifiers.cljc index ff6e05f522..ad762570f2 100644 --- a/common/src/app/common/geom/shapes/modifiers.cljc +++ b/common/src/app/common/geom/shapes/modifiers.cljc @@ -359,7 +359,7 @@ to-reflow (cond-> to-reflow - (and (ctl/layout-child-id? objects current) + (and (ctl/layout-descent? objects parent-base) (not= uuid/zero (:frame-id parent-base))) (conj (:frame-id parent-base)))] (recur modif-tree diff --git a/common/src/app/common/types/shape/layout.cljc b/common/src/app/common/types/shape/layout.cljc index 6213668aa1..88988c275c 100644 --- a/common/src/app/common/types/shape/layout.cljc +++ b/common/src/app/common/types/shape/layout.cljc @@ -6,6 +6,7 @@ (ns app.common.types.shape.layout (:require + [app.common.data.macros :as dm] [app.common.spec :as us] [clojure.spec.alpha :as s])) @@ -99,15 +100,21 @@ ([shape] (and (= :frame (:type shape)) (= :flex (:layout shape))))) -(defn layout-child? [objects shape] +(defn layout-immediate-child? [objects shape] + (let [parent-id (:parent-id shape) + parent (get objects parent-id)] + (layout? parent))) + +(defn layout-immediate-child-id? [objects id] + (let [parent-id (dm/get-in objects [id :parent-id]) + parent (get objects parent-id)] + (layout? parent))) + +(defn layout-descent? [objects shape] (let [frame-id (:frame-id shape) frame (get objects frame-id)] (layout? frame))) -(defn layout-child-id? [objects id] - (let [shape (get objects id)] - (layout-child? objects shape))) - (defn inside-layout? "Check if the shape is inside a layout" [objects shape] diff --git a/frontend/src/app/main/data/workspace/transforms.cljs b/frontend/src/app/main/data/workspace/transforms.cljs index 5525b73026..6ff4cfa8c9 100644 --- a/frontend/src/app/main/data/workspace/transforms.cljs +++ b/frontend/src/app/main/data/workspace/transforms.cljs @@ -440,7 +440,7 @@ exclude-frames-siblings (into exclude-frames (comp (mapcat (partial cph/get-siblings-ids objects)) - (filter (partial ctl/layout-child-id? objects))) + (filter (partial ctl/layout-immediate-child-id? objects))) selected) fix-axis @@ -640,7 +640,7 @@ (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) + (if (every? (partial ctl/layout-immediate-child-id? objects) selected-shapes) (rx/of (reorder-selected-layout-child direction)) (rx/of (nudge-selected-shapes direction shift?))))))) diff --git a/frontend/src/app/main/refs.cljs b/frontend/src/app/main/refs.cljs index 51a0becaa6..262aa81394 100644 --- a/frontend/src/app/main/refs.cljs +++ b/frontend/src/app/main/refs.cljs @@ -402,7 +402,7 @@ (let [objects (wsh/lookup-page-objects state)] (into [] (comp (map (d/getf objects)) - (filter (partial ctl/layout-child? objects))) + (filter (partial ctl/layout-immediate-child? objects))) ids))) st/state =)) @@ -481,7 +481,7 @@ (fn [objects] (->> ids (map (d/getf objects)) - (some (partial ctl/layout-child? objects)))) + (some (partial ctl/layout-immediate-child? objects)))) workspace-page-objects)) (defn get-flex-child-viewer @@ -491,7 +491,7 @@ (let [objects (wsh/lookup-viewer-objects state page-id)] (into [] (comp (map (d/getf objects)) - (filter (partial ctl/layout-child? objects))) + (filter (partial ctl/layout-immediate-child? objects))) ids))) st/state =)) diff --git a/frontend/src/app/util/snap_data.cljs b/frontend/src/app/util/snap_data.cljs index 1de3b7a259..deb4239fe5 100644 --- a/frontend/src/app/util/snap_data.cljs +++ b/frontend/src/app/util/snap_data.cljs @@ -82,7 +82,7 @@ grid-y-data (get-grids-snap-points frame :y)] (cond-> page-data - (not (ctl/layout-child? objects frame)) + (not (ctl/layout-descent? objects frame)) (-> ;; Update root frame information (assoc-in [uuid/zero :objects-data frame-id] frame-data) @@ -106,7 +106,7 @@ :id (:id shape) :pt %)))] (cond-> page-data - (not (ctl/layout-child? objects shape)) + (not (ctl/layout-descent? objects shape)) (-> (assoc-in [frame-id :objects-data (:id shape)] shape-data) (update-in [frame-id :x] (make-insert-tree-data shape-data :x)) (update-in [frame-id :y] (make-insert-tree-data shape-data :y)))))) From ab7683f1e3c17db163a78cfd1ca54c96db94896c Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Wed, 18 Jan 2023 15:19:17 +0100 Subject: [PATCH 3/7] :sparkles: Improved text layout handling --- .../app/main/data/workspace/modifiers.cljs | 2 +- .../src/app/main/data/workspace/texts.cljs | 123 ++++++++++++------ 2 files changed, 82 insertions(+), 43 deletions(-) diff --git a/frontend/src/app/main/data/workspace/modifiers.cljs b/frontend/src/app/main/data/workspace/modifiers.cljs index a93bb08f73..4e2c5de55d 100644 --- a/frontend/src/app/main/data/workspace/modifiers.cljs +++ b/frontend/src/app/main/data/workspace/modifiers.cljs @@ -219,7 +219,7 @@ result (let [[id text-modifier] (first modifiers)] (recur (rest modifiers) - (update objects id apply-text-modifier text-modifier)))))) + (update result id apply-text-modifier text-modifier)))))) #_(defn apply-path-modifiers [objects path-modifiers] diff --git a/frontend/src/app/main/data/workspace/texts.cljs b/frontend/src/app/main/data/workspace/texts.cljs index be4b7eab67..b98de7713e 100644 --- a/frontend/src/app/main/data/workspace/texts.cljs +++ b/frontend/src/app/main/data/workspace/texts.cljs @@ -15,7 +15,6 @@ [app.common.pages.helpers :as cph] [app.common.text :as txt] [app.common.types.modifiers :as ctm] - [app.common.uuid :as uuid] [app.main.data.workspace.changes :as dch] [app.main.data.workspace.common :as dwc] [app.main.data.workspace.modifiers :as dwm] @@ -318,16 +317,25 @@ (defn not-changed? [old-dim new-dim] (> (mth/abs (- old-dim new-dim)) 1)) -(defn resize-text - [id new-width new-height] - (ptk/reify ::resize-text +(defn commit-resize-text + [] + (ptk/reify ::commit-resize-text ptk/WatchEvent (watch [_ state _] - (let [shape (wsh/lookup-shape state id) + (let [props (::resize-text-debounce-props state) + objects (wsh/lookup-page-objects state) undo-id (js/Symbol)] - (letfn [(update-fn [shape] - (let [{:keys [selrect grow-type]} shape - {shape-width :width shape-height :height} selrect + + (letfn [(changed-text? [id] + (let [shape (get objects id) + [new-width new-height] (get props id)] + (or (and (not-changed? (:width shape) new-width) (= (:grow-type shape) :auto-width)) + (and (not-changed? (:height shape) new-height) + (or (= (:grow-type shape) :auto-height) (= (:grow-type shape) :auto-width)))))) + + (update-fn [{:keys [id selrect grow-type] :as shape}] + (let [{shape-width :width shape-height :height} selrect + [new-width new-height] (get props id) shape (cond-> shape @@ -342,14 +350,39 @@ shape))] - (when (or (and (not-changed? (:width shape) new-width) (= (:grow-type shape) :auto-width)) - (and (not-changed? (:height shape) new-height) - (or (= (:grow-type shape) :auto-height) (= (:grow-type shape) :auto-width)))) + (let [ids (->> (keys props) (filter changed-text?))] (rx/of (dwu/start-undo-transaction undo-id) - (dch/update-shapes [id] update-fn {:reg-objects? true :save-undo? true}) - (ptk/data-event :layout/update [id]) + (dch/update-shapes ids update-fn {:reg-objects? true :save-undo? true}) + (ptk/data-event :layout/update ids) (dwu/commit-undo-transaction undo-id)))))))) +(defn resize-text + [id new-width new-height] + + (let [cur-event (js/Symbol)] + (ptk/reify ::resize-text + ptk/UpdateEvent + (update [_ state] + (-> state + (update ::resize-text-debounce-props (fnil assoc {}) id [new-width new-height]) + (cond-> (nil? (::resize-text-debounce-event state)) + (assoc ::resize-text-debounce-event cur-event)))) + + ptk/WatchEvent + (watch [_ state stream] + (if (= (::resize-text-debounce-event state) cur-event) + (let [stopper (->> stream (rx/filter (ptk/type? :app.main.data.workspace/finalize)))] + (rx/concat + (rx/merge + (->> stream + (rx/filter (ptk/type? ::resize-text)) + (rx/debounce 50) + (rx/take 1) + (rx/map #(commit-resize-text)) + (rx/take-until stopper)) + (rx/of (resize-text id new-width new-height))) + (rx/of #(dissoc % ::resize-text-debounce-props ::resize-text-debounce-event)))) + (rx/empty)))))) (defn save-font [data] @@ -384,37 +417,43 @@ new-shape)) -(defn update-text-modifier-state - [id props] - (ptk/reify ::update-text-modifier-state - ptk/UpdateEvent - (update [_ state] - (update-in state [:workspace-text-modifier id] (fnil merge {}) props)))) +(defn commit-update-text-modifier + [] + (ptk/reify ::commit-update-text-modifier + ptk/WatchEvent + (watch [_ state _] + (let [ids (::update-text-modifier-debounce-ids state)] + (let [modif-tree (dwm/create-modif-tree ids (ctm/reflow-modifiers))] + (rx/of (dwm/update-modifiers modif-tree false true))))))) (defn update-text-modifier [id props] - (ptk/reify ::update-text-modifier - ptk/WatchEvent - (watch [_ state _] - (let [modifiers (get-in (:workspace-modifiers state) [id :modifiers]) - shape (-> (wsh/lookup-shape state id) - (gsh/transform-shape modifiers)) + (let [cur-event (js/Symbol)] + (ptk/reify ::update-text-modifier + ptk/UpdateEvent + (update [_ state] + (-> state + (update-in [:workspace-text-modifier id] (fnil merge {}) props) + (update ::update-text-modifier-debounce-ids (fnil conj #{}) id) + (cond-> (nil? (::update-text-modifier-debounce-event state)) + (assoc ::update-text-modifier-debounce-event cur-event)))) - current-width (:width shape) - current-height (:height shape)] - (rx/concat - (rx/of (update-text-modifier-state id props)) - - (if (or (and (some? (:width props)) - (not (mth/close? (:width props) current-width))) - (and (some? (:height props)) - (not (mth/close? (:height props) current-height)))) - - (let [modif-tree (dwm/create-modif-tree [id] (ctm/reflow-modifiers))] - (->> (rx/of (dwm/update-modifiers modif-tree false true)) - (rx/observe-on :async))) - (rx/empty))))))) + ptk/WatchEvent + (watch [_ state stream] + (if (= (::update-text-modifier-debounce-event state) cur-event) + (let [stopper (->> stream (rx/filter (ptk/type? :app.main.data.workspace/finalize)))] + (rx/concat + (rx/merge + (->> stream + (rx/filter (ptk/type? ::update-text-modifier)) + (rx/debounce 50) + (rx/take 1) + (rx/map #(commit-update-text-modifier)) + (rx/take-until stopper)) + (rx/of (update-text-modifier id props))) + (rx/of #(dissoc % ::update-text-modifier-debounce-event ::update-text-modifier-debounce-ids)))) + (rx/empty)))))) (defn clean-text-modifier [id] @@ -464,18 +503,18 @@ (defn update-position-data [id position-data] - (let [start (uuid/next)] + (let [cur-event (js/Symbol)] (ptk/reify ::update-position-data ptk/UpdateEvent (update [_ state] (let [state (assoc-in state [:workspace-text-modifier id :position-data] position-data)] (if (nil? (::update-position-data-debounce state)) - (assoc state ::update-position-data-debounce start) + (assoc state ::update-position-data-debounce cur-event) (assoc-in state [::update-position-data id] position-data)))) ptk/WatchEvent (watch [_ state stream] - (if (= (::update-position-data-debounce state) start) + (if (= (::update-position-data-debounce state) cur-event) (let [stopper (->> stream (rx/filter (ptk/type? :app.main.data.workspace/finalize)))] (rx/merge (->> stream From 4e1eb2d6e9e14393795b54d5fea59ce2393b3126 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Wed, 18 Jan 2023 16:31:45 +0100 Subject: [PATCH 4/7] :bug: Fix problem when flipping a mask --- .../app/main/data/workspace/transforms.cljs | 42 +++++++------------ 1 file changed, 14 insertions(+), 28 deletions(-) diff --git a/frontend/src/app/main/data/workspace/transforms.cljs b/frontend/src/app/main/data/workspace/transforms.cljs index 6ff4cfa8c9..4539c490cf 100644 --- a/frontend/src/app/main/data/workspace/transforms.cljs +++ b/frontend/src/app/main/data/workspace/transforms.cljs @@ -750,36 +750,22 @@ (ptk/reify ::flip-horizontal-selected ptk/WatchEvent (watch [_ state _] - (let [objects (wsh/lookup-page-objects state) - selected (wsh/lookup-selected state {:omit-blocked? true}) - shapes (map #(get objects %) selected) - selrect (gsh/selection-rect shapes) - origin (gpt/point (:x selrect) (+ (:y selrect) (/ (:height selrect) 2))) - - modif-tree (dwm/create-modif-tree - selected - (-> (ctm/empty) - (ctm/resize (gpt/point -1.0 1.0) origin) - (ctm/move (gpt/point (:width selrect) 0))))] - - (rx/of (dwm/set-modifiers modif-tree true) - (dwm/apply-modifiers)))))) + (let [objects (wsh/lookup-page-objects state) + selected (wsh/lookup-selected state {:omit-blocked? true}) + shapes (map #(get objects %) selected) + selrect (gsh/selection-rect shapes) + center (gsh/center-selrect selrect) + modifiers (dwm/create-modif-tree selected (ctm/resize-modifiers (gpt/point -1.0 1.0) center))] + (rx/of (dwm/apply-modifiers {:modifiers modifiers})))))) (defn flip-vertical-selected [] (ptk/reify ::flip-vertical-selected ptk/WatchEvent (watch [_ state _] - (let [objects (wsh/lookup-page-objects state) - selected (wsh/lookup-selected state {:omit-blocked? true}) - shapes (map #(get objects %) selected) - selrect (gsh/selection-rect shapes) - origin (gpt/point (+ (:x selrect) (/ (:width selrect) 2)) (:y selrect)) - - modif-tree (dwm/create-modif-tree - selected - (-> (ctm/empty) - (ctm/resize (gpt/point 1.0 -1.0) origin) - (ctm/move (gpt/point 0 (:height selrect)))))] - - (rx/of (dwm/set-modifiers modif-tree true) - (dwm/apply-modifiers)))))) + (let [objects (wsh/lookup-page-objects state) + selected (wsh/lookup-selected state {:omit-blocked? true}) + shapes (map #(get objects %) selected) + selrect (gsh/selection-rect shapes) + center (gsh/center-selrect selrect) + modifiers (dwm/create-modif-tree selected (ctm/resize-modifiers (gpt/point 1.0 -1.0) center))] + (rx/of (dwm/apply-modifiers {:modifiers modifiers})))))) From 4b5caf5fb90b9ca54ad9aca553dad81c7894bc15 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Wed, 18 Jan 2023 17:08:50 +0100 Subject: [PATCH 5/7] :sparkles: Shift+move ignores snap-pixel on the axis moving --- .../src/app/common/geom/shapes/modifiers.cljc | 6 ++-- .../common/geom/shapes/pixel_precision.cljc | 21 ++++++++---- .../app/main/data/workspace/modifiers.cljs | 14 ++++++-- .../app/main/data/workspace/transforms.cljs | 33 ++++++++++--------- 4 files changed, 48 insertions(+), 26 deletions(-) diff --git a/common/src/app/common/geom/shapes/modifiers.cljc b/common/src/app/common/geom/shapes/modifiers.cljc index ad762570f2..15cfdd9c09 100644 --- a/common/src/app/common/geom/shapes/modifiers.cljc +++ b/common/src/app/common/geom/shapes/modifiers.cljc @@ -389,8 +389,8 @@ (set-objects-modifiers nil modif-tree objects params)) ([old-modif-tree modif-tree objects - {:keys [ignore-constraints snap-pixel? snap-precision] - :or {ignore-constraints false snap-pixel? false snap-precision 1}}] + {:keys [ignore-constraints snap-pixel? snap-precision snap-ignore-axis] + :or {ignore-constraints false snap-pixel? false snap-precision 1 snap-ignore-axis nil}}] (let [objects (-> objects (cond-> (some? old-modif-tree) (apply-structure-modifiers old-modif-tree)) @@ -398,7 +398,7 @@ modif-tree (cond-> modif-tree - snap-pixel? (gpp/adjust-pixel-precision objects snap-precision)) + snap-pixel? (gpp/adjust-pixel-precision objects snap-precision snap-ignore-axis)) bounds (d/lazy-map (keys objects) #(dm/get-in objects [% :points])) bounds (cond-> bounds diff --git a/common/src/app/common/geom/shapes/pixel_precision.cljc b/common/src/app/common/geom/shapes/pixel_precision.cljc index f75b650d94..e85c708932 100644 --- a/common/src/app/common/geom/shapes/pixel_precision.cljc +++ b/common/src/app/common/geom/shapes/pixel_precision.cljc @@ -39,16 +39,25 @@ (ctm/resize scalev origin transform transform-inverse {:precise? true})))) (defn position-pixel-precision - [modifiers _ points precision] + [modifiers _ points precision ignore-axis] (let [bounds (gpr/bounds->rect points) corner (gpt/point bounds) - target-corner (gpt/round-step corner precision) + target-corner + (cond-> corner + (= ignore-axis :x) + (update :y mth/round precision) + + (= ignore-axis :y) + (update :x mth/round precision) + + (nil? ignore-axis) + (gpt/round-step precision)) deltav (gpt/to-vec corner target-corner)] (ctm/move modifiers deltav))) (defn set-pixel-precision "Adjust modifiers so they adjust to the pixel grid" - [modifiers shape precision] + [modifiers shape precision ignore-axis] (let [points (-> shape :points (gco/transform-points (ctm/modifiers->transform modifiers))) has-resize? (not (ctm/only-move? modifiers)) @@ -63,16 +72,16 @@ (gco/transform-points (ctm/modifiers->transform modifiers)) ) points)] [modifiers points])] - (position-pixel-precision modifiers shape points precision))) + (position-pixel-precision modifiers shape points precision ignore-axis))) (defn adjust-pixel-precision - [modif-tree objects precision] + [modif-tree objects precision ignore-axis] (let [update-modifiers (fn [modif-tree shape] (let [modifiers (dm/get-in modif-tree [(:id shape) :modifiers])] (cond-> modif-tree (ctm/has-geometry? modifiers) - (update-in [(:id shape) :modifiers] set-pixel-precision shape precision))))] + (update-in [(:id shape) :modifiers] set-pixel-precision shape precision ignore-axis))))] (->> (keys modif-tree) (map (d/getf objects)) diff --git a/frontend/src/app/main/data/workspace/modifiers.cljs b/frontend/src/app/main/data/workspace/modifiers.cljs index 4e2c5de55d..717dfa7fe6 100644 --- a/frontend/src/app/main/data/workspace/modifiers.cljs +++ b/frontend/src/app/main/data/workspace/modifiers.cljs @@ -241,6 +241,9 @@ (calculate-modifiers state false false modif-tree)) ([state ignore-constraints ignore-snap-pixel modif-tree] + (calculate-modifiers state ignore-constraints ignore-snap-pixel modif-tree nil)) + + ([state ignore-constraints ignore-snap-pixel modif-tree params] (let [objects (wsh/lookup-page-objects state) @@ -253,7 +256,11 @@ (as-> objects $ (apply-text-modifiers $ (get state :workspace-text-modifier)) ;;(apply-path-modifiers $ (get-in state [:workspace-local :edit-path])) - (gsh/set-objects-modifiers modif-tree $ {:ignore-constraints ignore-constraints :snap-pixel? snap-pixel? :snap-precision snap-precision}))))) + (gsh/set-objects-modifiers modif-tree $ (merge + params + {:ignore-constraints ignore-constraints + :snap-pixel? snap-pixel? + :snap-precision snap-precision})))))) (defn- calculate-update-modifiers [old-modif-tree state ignore-constraints ignore-snap-pixel modif-tree] @@ -292,10 +299,13 @@ (set-modifiers modif-tree ignore-constraints false)) ([modif-tree ignore-constraints ignore-snap-pixel] + (set-modifiers modif-tree ignore-constraints ignore-snap-pixel nil)) + + ([modif-tree ignore-constraints ignore-snap-pixel params] (ptk/reify ::set-modifiers ptk/UpdateEvent (update [_ state] - (assoc state :workspace-modifiers (calculate-modifiers state ignore-constraints ignore-snap-pixel modif-tree)))))) + (assoc state :workspace-modifiers (calculate-modifiers state ignore-constraints ignore-snap-pixel modif-tree params)))))) ;; Rotation use different algorithm to calculate children modifiers (and do not use child constraints). (defn set-rotation-modifiers diff --git a/frontend/src/app/main/data/workspace/transforms.cljs b/frontend/src/app/main/data/workspace/transforms.cljs index 4539c490cf..06de28bb45 100644 --- a/frontend/src/app/main/data/workspace/transforms.cljs +++ b/frontend/src/app/main/data/workspace/transforms.cljs @@ -443,18 +443,8 @@ (filter (partial ctl/layout-immediate-child-id? objects))) selected) - fix-axis - (fn [[position shift?]] - (let [delta (gpt/to-vec from-position position)] - (if shift? - (if (> (mth/abs (:x delta)) (mth/abs (:y delta))) - (gpt/point (:x delta) 0) - (gpt/point 0 (:y delta))) - delta))) - position (->> ms/mouse-position - (rx/with-latest-from ms/mouse-position-shift) - (rx/map #(fix-axis %))) + (rx/map #(gpt/to-vec from-position %))) snap-delta (rx/concat ;; We send the nil first so the stream is not waiting for the first value @@ -491,11 +481,24 @@ (rx/merge ;; Temporary modifiers stream (->> move-stream + (rx/with-latest-from ms/mouse-position-shift) (rx/map - (fn [[move-vector target-frame drop-index]] - (-> (dwm/create-modif-tree ids (ctm/move-modifiers move-vector)) - (dwm/build-change-frame-modifiers objects selected target-frame drop-index) - (dwm/set-modifiers))))) + (fn [[[move-vector target-frame drop-index] shift?]] + (let [x-disp? (> (mth/abs (:x move-vector)) (mth/abs (:y move-vector))) + [move-vector snap-ignore-axis] + (cond + (and shift? x-disp?) + [(assoc move-vector :y 0) :y] + + shift? + [(assoc move-vector :x 0) :x] + + :else + [move-vector nil])] + + (-> (dwm/create-modif-tree ids (ctm/move-modifiers move-vector)) + (dwm/build-change-frame-modifiers objects selected target-frame drop-index) + (dwm/set-modifiers false false {:snap-ignore-axis snap-ignore-axis})))))) (->> move-stream (rx/map (comp set-ghost-displacement first))) From d78ad30e23d4e006d02401447e6fd0548e631ada Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Wed, 18 Jan 2023 17:13:55 +0100 Subject: [PATCH 6/7] :sparkles: Enter on containers selects children --- frontend/src/app/main/data/workspace.cljs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/main/data/workspace.cljs b/frontend/src/app/main/data/workspace.cljs index ff5ba2a521..e017b6362f 100644 --- a/frontend/src/app/main/data/workspace.cljs +++ b/frontend/src/app/main/data/workspace.cljs @@ -846,8 +846,8 @@ :text (rx/of (dwe/start-edition-mode id)) - (:group :bool) - (rx/of (dws/select-shapes (into (d/ordered-set) [(last shapes)]))) + (:group :bool :frame) + (rx/of (dws/select-shapes (into (d/ordered-set) shapes))) :svg-raw nil From e7ac7ff7fb9eca82786440b71e79902638de9566 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Wed, 18 Jan 2023 17:26:16 +0100 Subject: [PATCH 7/7] :bug: Fix problem with disappearing titles --- .../app/main/ui/workspace/shapes/frame/dynamic_modifiers.cljs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/frontend/src/app/main/ui/workspace/shapes/frame/dynamic_modifiers.cljs b/frontend/src/app/main/ui/workspace/shapes/frame/dynamic_modifiers.cljs index a3c2081a03..2c849e4228 100644 --- a/frontend/src/app/main/ui/workspace/shapes/frame/dynamic_modifiers.cljs +++ b/frontend/src/app/main/ui/workspace/shapes/frame/dynamic_modifiers.cljs @@ -183,6 +183,9 @@ (dom/remove-attribute! node "data-old-width") (dom/remove-attribute! node "data-old-height")) + (dom/class? node "frame-title") + (dom/remove-attribute! node "data-old-transform") + :else (let [old-transform (dom/get-attribute node "data-old-transform")] (if (some? old-transform)