0
Fork 0
mirror of https://github.com/penpot/penpot.git synced 2025-01-27 00:49:28 -05:00

Merge pull request #1043 from penpot/fix/problem-with-flip-transforms

🐛 Fix problem with paths editing after flip
This commit is contained in:
Andrés Moya 2021-06-16 17:11:02 +02:00 committed by GitHub
commit 50e0284084
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 48 additions and 24 deletions

View file

@ -11,6 +11,12 @@
## 1.6.4-alpha ## 1.6.4-alpha
## 1.6.4-alpha
### :bug: Bugs fixed
- Fix problem with paths editing after flip [#1040](https://github.com/penpot/penpot/issues/1040)
### :sparkles: Minor improvements ### :sparkles: Minor improvements
- Decrease default bulk buffers on storage tasks. - Decrease default bulk buffers on storage tasks.

View file

@ -135,7 +135,9 @@
(defmethod pp/simple-dispatch Matrix [obj] (pr obj)) (defmethod pp/simple-dispatch Matrix [obj] (pr obj))
(defn transform-in [pt mtx] (defn transform-in [pt mtx]
(if (some? pt)
(-> (matrix) (-> (matrix)
(translate pt) (translate pt)
(multiply mtx) (multiply mtx)
(translate (gpt/negate pt)))) (translate (gpt/negate pt)))
mtx))

View file

@ -304,21 +304,26 @@
:else :else
(-> shape (-> shape
(merge rect-shape)))] (merge rect-shape)))
base-rotation (or (:rotation shape) 0)
modif-rotation (or (get-in shape [:modifiers :rotation]) 0)]
(as-> shape $ (as-> shape $
(update $ :transform #(gmt/multiply (or % (gmt/matrix)) matrix)) (update $ :transform #(gmt/multiply (or % (gmt/matrix)) matrix))
(update $ :transform-inverse #(gmt/multiply matrix-inverse (or % (gmt/matrix)))) (update $ :transform-inverse #(gmt/multiply matrix-inverse (or % (gmt/matrix))))
(assoc $ :points (into [] points)) (assoc $ :points (into [] points))
(assoc $ :selrect (gpr/rect->selrect rect-shape)) (assoc $ :selrect (gpr/rect->selrect rect-shape))
(update $ :rotation #(mod (+ (or % 0) (assoc $ :rotation (mod (+ base-rotation modif-rotation) 360)))))
(or (get-in $ [:modifiers :rotation]) 0)) 360)))))
(defn set-flip [shape modifiers] (defn set-flip [shape modifiers]
(let [rx (get-in modifiers [:resize-vector :x]) (let [rx (get-in modifiers [:resize-vector :x])
ry (get-in modifiers [:resize-vector :y])] ry (get-in modifiers [:resize-vector :y])]
(cond-> shape (cond-> shape
(and rx (< rx 0)) (update :flip-x not) (and rx (< rx 0)) (-> (update :flip-x not)
(and ry (< ry 0)) (update :flip-y not)))) (update :rotation -))
(and ry (< ry 0)) (-> (update :flip-y not)
(update :rotation -)))))
(defn apply-displacement [shape] (defn apply-displacement [shape]
(let [modifiers (:modifiers shape)] (let [modifiers (:modifiers shape)]

View file

@ -26,12 +26,31 @@
(= event :interrupt) ;; ESC (= event :interrupt) ;; ESC
(and (ms/mouse-double-click? event)))) (and (ms/mouse-double-click? event))))
(defn content-center
[content]
(-> content
gsh/content->selrect
gsh/center-selrect))
(defn content->points+selrect (defn content->points+selrect
"Given the content of a shape, calculate its points and selrect" "Given the content of a shape, calculate its points and selrect"
[shape content] [shape content]
(let [transform (:transform shape (gmt/matrix))
transform-inverse (:transform-inverse shape (gmt/matrix)) (let [{:keys [flip-x flip-y]} shape
center (gsh/center-shape shape) transform
(cond-> (:transform shape (gmt/matrix))
flip-x (gmt/scale (gpt/point -1 1))
flip-y (gmt/scale (gpt/point 1 -1)))
transform-inverse
(cond-> (gmt/matrix)
flip-x (gmt/scale (gpt/point -1 1))
flip-y (gmt/scale (gpt/point 1 -1))
:always (gmt/multiply (:transform-inverse shape (gmt/matrix))))
center (or (gsh/center-shape shape)
(content-center content))
base-content (gsh/transform-content base-content (gsh/transform-content
content content
(gmt/transform-in center transform-inverse)) (gmt/transform-in center transform-inverse))
@ -39,30 +58,22 @@
;; Calculates the new selrect with points given the old center ;; Calculates the new selrect with points given the old center
points (-> (gsh/content->selrect base-content) points (-> (gsh/content->selrect base-content)
(gsh/rect->points) (gsh/rect->points)
(gsh/transform-points center (:transform shape (gmt/matrix)))) (gsh/transform-points center transform))
points-center (gsh/center-points points) points-center (gsh/center-points points)
;; Points is now the selrect but the center is different so we can create the selrect ;; Points is now the selrect but the center is different so we can create the selrect
;; through points ;; through points
selrect (-> points selrect (-> points
(gsh/transform-points points-center (:transform-inverse shape (gmt/matrix))) (gsh/transform-points points-center transform-inverse)
(gsh/points->selrect))] (gsh/points->selrect))]
[points selrect])) [points selrect]))
(defn update-selrect (defn update-selrect
"Updates the selrect and points for a path" "Updates the selrect and points for a path"
[shape] [shape]
(if (= (:rotation shape 0) 0) (let [[points selrect] (content->points+selrect shape (:content shape))]
(let [content (:content shape) (assoc shape :points points :selrect selrect)))
selrect (gsh/content->selrect content)
points (gsh/rect->points selrect)]
(assoc shape :points points :selrect selrect))
(let [content (:content shape)
[points selrect] (content->points+selrect shape content)]
(assoc shape :points points :selrect selrect))))
(defn closest-angle (defn closest-angle
[angle] [angle]