mirror of
https://github.com/penpot/penpot.git
synced 2025-06-02 09:31:39 +02:00
🐛 Fix problem with transforms
This commit is contained in:
parent
71bb34efc5
commit
1705954b07
5 changed files with 38 additions and 22 deletions
|
@ -7,6 +7,7 @@
|
||||||
(ns app.common.pages.helpers
|
(ns app.common.pages.helpers
|
||||||
(:require
|
(:require
|
||||||
[app.common.data :as d]
|
[app.common.data :as d]
|
||||||
|
[app.common.data.macros :as dm]
|
||||||
[app.common.geom.shapes :as gsh]
|
[app.common.geom.shapes :as gsh]
|
||||||
[app.common.spec :as us]
|
[app.common.spec :as us]
|
||||||
[app.common.spec.page :as spec.page]
|
[app.common.spec.page :as spec.page]
|
||||||
|
@ -92,7 +93,7 @@
|
||||||
"Returns a vector of parents of the specified shape."
|
"Returns a vector of parents of the specified shape."
|
||||||
[objects shape-id]
|
[objects shape-id]
|
||||||
(loop [result [] id shape-id]
|
(loop [result [] id shape-id]
|
||||||
(if-let [parent-id (get-in objects [id :parent-id])]
|
(if-let [parent-id (dm/get-in objects [id :parent-id])]
|
||||||
(recur (conj result parent-id) parent-id)
|
(recur (conj result parent-id) parent-id)
|
||||||
result)))
|
result)))
|
||||||
|
|
||||||
|
|
|
@ -378,7 +378,7 @@
|
||||||
(update [_ state]
|
(update [_ state]
|
||||||
(-> state
|
(-> state
|
||||||
(dissoc :workspace-modifiers)
|
(dissoc :workspace-modifiers)
|
||||||
(update :workspace-local dissoc :current-move-selected)))))
|
(dissoc ::current-move-selected)))))
|
||||||
|
|
||||||
;; -- Resize --------------------------------------------------------
|
;; -- Resize --------------------------------------------------------
|
||||||
|
|
||||||
|
@ -721,15 +721,15 @@
|
||||||
|
|
||||||
ptk/UpdateEvent
|
ptk/UpdateEvent
|
||||||
(update [_ state]
|
(update [_ state]
|
||||||
(if (nil? (get-in state [:workspace-local :current-move-selected]))
|
(if (nil? (get state ::current-move-selected))
|
||||||
(-> state
|
(-> state
|
||||||
(assoc-in [:workspace-local :transform] :move)
|
(assoc-in [:workspace-local :transform] :move)
|
||||||
(assoc-in [:workspace-local :current-move-selected] same-event))
|
(assoc ::current-move-selected same-event))
|
||||||
state))
|
state))
|
||||||
|
|
||||||
ptk/WatchEvent
|
ptk/WatchEvent
|
||||||
(watch [_ state stream]
|
(watch [_ state stream]
|
||||||
(if (= same-event (get-in state [:workspace-local :current-move-selected]))
|
(if (= same-event (get state ::current-move-selected))
|
||||||
(let [selected (wsh/lookup-selected state {:omit-blocked? true})
|
(let [selected (wsh/lookup-selected state {:omit-blocked? true})
|
||||||
nudge (get-in state [:profile :props :nudge] {:big 10 :small 1})
|
nudge (get-in state [:profile :props :nudge] {:big 10 :small 1})
|
||||||
move-events (->> stream
|
move-events (->> stream
|
||||||
|
@ -744,10 +744,10 @@
|
||||||
(rx/concat
|
(rx/concat
|
||||||
(rx/merge
|
(rx/merge
|
||||||
(->> move-events
|
(->> move-events
|
||||||
(rx/take-until stopper)
|
|
||||||
(rx/scan #(gpt/add %1 mov-vec) (gpt/point 0 0))
|
(rx/scan #(gpt/add %1 mov-vec) (gpt/point 0 0))
|
||||||
(rx/map #(hash-map :displacement (gmt/translate-matrix %)))
|
(rx/map #(hash-map :displacement (gmt/translate-matrix %)))
|
||||||
(rx/map (partial set-modifiers selected)))
|
(rx/map (partial set-modifiers selected))
|
||||||
|
(rx/take-until stopper))
|
||||||
(rx/of (move-selected direction shift?)))
|
(rx/of (move-selected direction shift?)))
|
||||||
|
|
||||||
(rx/of (apply-modifiers selected)
|
(rx/of (apply-modifiers selected)
|
||||||
|
|
|
@ -50,9 +50,8 @@
|
||||||
render-id (mf/use-ctx muc/render-ctx)
|
render-id (mf/use-ctx muc/render-ctx)
|
||||||
svg-text? (and (= :text (:type mask)) (some? (:position-data mask)))
|
svg-text? (and (= :text (:type mask)) (some? (:position-data mask)))
|
||||||
|
|
||||||
mask-bb
|
mask-bb (-> (gsh/transform-shape mask) (:points))
|
||||||
(-> (gsh/transform-shape mask)
|
mask-bb-rect (gsh/points->rect mask-bb)]
|
||||||
(:points))]
|
|
||||||
[:defs
|
[:defs
|
||||||
[:filter {:id (filter-id render-id mask)}
|
[:filter {:id (filter-id render-id mask)}
|
||||||
[:feFlood {:flood-color "white"
|
[:feFlood {:flood-color "white"
|
||||||
|
@ -73,7 +72,12 @@
|
||||||
;; When te shape is a text we pass to the shape the info and disable the filter.
|
;; When te shape is a text we pass to the shape the info and disable the filter.
|
||||||
;; There is a bug in Firefox with filters and texts. We change the text to white at shape level
|
;; There is a bug in Firefox with filters and texts. We change the text to white at shape level
|
||||||
[:mask {:class "mask-shape"
|
[:mask {:class "mask-shape"
|
||||||
:id (mask-id render-id mask)}
|
:id (mask-id render-id mask)
|
||||||
|
:x (:x mask-bb-rect)
|
||||||
|
:y (:y mask-bb-rect)
|
||||||
|
:width (:width mask-bb-rect)
|
||||||
|
:height (:height mask-bb-rect)
|
||||||
|
:mask-units "userSpaceOnUse"}
|
||||||
[:g {:filter (when-not svg-text? (filter-url render-id mask))}
|
[:g {:filter (when-not svg-text? (filter-url render-id mask))}
|
||||||
[:& shape-wrapper {:shape (-> mask (dissoc :shadow :blur) (assoc :is-mask? true))}]]]])))
|
[:& shape-wrapper {:shape (-> mask (dissoc :shadow :blur) (assoc :is-mask? true))}]]]])))
|
||||||
|
|
||||||
|
|
|
@ -38,15 +38,13 @@
|
||||||
(mf/use-layout-effect
|
(mf/use-layout-effect
|
||||||
(mf/deps transforms)
|
(mf/deps transforms)
|
||||||
(fn []
|
(fn []
|
||||||
(when (and (nil? @prev-transforms)
|
(when (and (empty? @prev-modifiers) (d/not-empty? modifiers))
|
||||||
(some? transforms))
|
|
||||||
(utils/start-transform! node shapes))
|
(utils/start-transform! node shapes))
|
||||||
|
|
||||||
(when (some? modifiers)
|
(when (d/not-empty? modifiers)
|
||||||
(utils/update-transform! node shapes transforms modifiers))
|
(utils/update-transform! node shapes transforms modifiers))
|
||||||
|
|
||||||
(when (and (some? @prev-modifiers)
|
(when (and (d/not-empty? @prev-modifiers) (empty? modifiers))
|
||||||
(empty? modifiers))
|
|
||||||
(utils/remove-transform! node @prev-shapes))
|
(utils/remove-transform! node @prev-shapes))
|
||||||
|
|
||||||
(reset! prev-modifiers modifiers)
|
(reset! prev-modifiers modifiers)
|
||||||
|
|
|
@ -150,10 +150,14 @@
|
||||||
|
|
||||||
(when (or (= (dom/get-tag-name node) "mask")
|
(when (or (= (dom/get-tag-name node) "mask")
|
||||||
(= (dom/get-tag-name node) "filter"))
|
(= (dom/get-tag-name node) "filter"))
|
||||||
(dom/set-attribute! node "data-old-x" (dom/get-attribute node "x"))
|
(let [old-x (dom/get-attribute node "x")
|
||||||
(dom/set-attribute! node "data-old-y" (dom/get-attribute node "y"))
|
old-y (dom/get-attribute node "y")
|
||||||
(dom/set-attribute! node "data-old-width" (dom/get-attribute node "width"))
|
old-width (dom/get-attribute node "width")
|
||||||
(dom/set-attribute! node "data-old-height" (dom/get-attribute node "height"))))))))
|
old-height (dom/get-attribute node "height")]
|
||||||
|
(dom/set-attribute! node "data-old-x" old-x)
|
||||||
|
(dom/set-attribute! node "data-old-y" old-y)
|
||||||
|
(dom/set-attribute! node "data-old-width" old-width)
|
||||||
|
(dom/set-attribute! node "data-old-height" old-height))))))))
|
||||||
|
|
||||||
(defn set-transform-att!
|
(defn set-transform-att!
|
||||||
[node att value]
|
[node att value]
|
||||||
|
@ -208,10 +212,19 @@
|
||||||
;; The shape width/height will be automaticaly setup when the modifiers are applied
|
;; The shape width/height will be automaticaly setup when the modifiers are applied
|
||||||
nil
|
nil
|
||||||
|
|
||||||
|
(or (= (dom/get-tag-name node) "mask")
|
||||||
|
(= (dom/get-tag-name node) "filter"))
|
||||||
|
(do
|
||||||
|
(dom/remove-attribute! node "data-old-x")
|
||||||
|
(dom/remove-attribute! node "data-old-y")
|
||||||
|
(dom/remove-attribute! node "data-old-width")
|
||||||
|
(dom/remove-attribute! node "data-old-height"))
|
||||||
|
|
||||||
:else
|
:else
|
||||||
(let [old-transform (dom/get-attribute node "data-old-transform")]
|
(let [old-transform (dom/get-attribute node "data-old-transform")]
|
||||||
(when-not (some? old-transform)
|
(if (some? old-transform)
|
||||||
(dom/remove-attribute! node "data-old-transform")
|
(do (dom/remove-attribute! node "data-old-transform")
|
||||||
|
(dom/set-attribute! node "transform" old-transform))
|
||||||
(dom/remove-attribute! node "transform")))))))))
|
(dom/remove-attribute! node "transform")))))))))
|
||||||
|
|
||||||
(defn format-viewbox [vbox]
|
(defn format-viewbox [vbox]
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue