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)))