mirror of
https://github.com/penpot/penpot.git
synced 2025-04-15 00:12:33 -05:00
✨ Shift+move ignores snap-pixel on the axis moving
This commit is contained in:
parent
4e1eb2d6e9
commit
4b5caf5fb9
4 changed files with 48 additions and 26 deletions
|
@ -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
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)))
|
||||
|
|
Loading…
Add table
Reference in a new issue