🐛 Fix problem with transforms

This commit is contained in:
alonso.torres 2022-04-26 18:27:11 +02:00
parent 71bb34efc5
commit 1705954b07
5 changed files with 38 additions and 22 deletions

View file

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

View file

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

View file

@ -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))}]]]])))

View file

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

View file

@ -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]