mirror of
https://github.com/penpot/penpot.git
synced 2025-06-02 07:11:39 +02:00
✨ Reparent modifiers
This commit is contained in:
parent
f3d13005b2
commit
daf048e258
10 changed files with 283 additions and 52 deletions
|
@ -167,7 +167,7 @@
|
|||
ptk/EffectEvent
|
||||
(effect [_ state _]
|
||||
(when (features/active-feature? state "render-wasm/v1")
|
||||
(wasm.api/set-modifiers nil)))
|
||||
(wasm.api/clean-modifiers)))
|
||||
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
|
@ -417,6 +417,48 @@
|
|||
modifiers (calculate-modifiers state ignore-constraints ignore-snap-pixel modif-tree page-id params)]
|
||||
(assoc state :workspace-modifiers modifiers))))))
|
||||
|
||||
(defn- parse-structure-modifiers
|
||||
[modif-tree]
|
||||
(into
|
||||
[]
|
||||
(mapcat
|
||||
(fn [[parent-id data]]
|
||||
(when (ctm/has-structure? (:modifiers data))
|
||||
(->> data
|
||||
:modifiers
|
||||
:structure-parent
|
||||
(mapcat
|
||||
(fn [modifier]
|
||||
(case (:type modifier)
|
||||
:remove-children
|
||||
(->> (:value modifier)
|
||||
(map (fn [child-id]
|
||||
{:type :remove-children
|
||||
:parent parent-id
|
||||
:id child-id
|
||||
:index 0})))
|
||||
|
||||
:add-children
|
||||
(->> (:value modifier)
|
||||
(map (fn [child-id]
|
||||
{:type :add-children
|
||||
:parent parent-id
|
||||
:id child-id
|
||||
:index (:index modifier)})))
|
||||
nil)))))))
|
||||
modif-tree))
|
||||
|
||||
(defn- parse-geometry-modifiers
|
||||
[modif-tree]
|
||||
(into
|
||||
[]
|
||||
(keep
|
||||
(fn [[id data]]
|
||||
(when (ctm/has-geometry? (:modifiers data))
|
||||
{:id id
|
||||
:transform (ctm/modifiers->transform (:modifiers data))})))
|
||||
modif-tree))
|
||||
|
||||
(defn set-wasm-modifiers
|
||||
([modif-tree]
|
||||
(set-wasm-modifiers modif-tree false))
|
||||
|
@ -431,15 +473,13 @@
|
|||
(ptk/reify ::set-wasm-modifiers
|
||||
ptk/EffectEvent
|
||||
(effect [_ _ _]
|
||||
(let [entries
|
||||
(->> modif-tree
|
||||
(mapv (fn [[id data]]
|
||||
{:id id
|
||||
:transform (ctm/modifiers->transform (:modifiers data))})))
|
||||
|
||||
modifiers-new
|
||||
(wasm.api/propagate-modifiers entries)]
|
||||
(wasm.api/set-modifiers modifiers-new))))))
|
||||
(wasm.api/clean-modifiers)
|
||||
(let [structure-entries (parse-structure-modifiers modif-tree)]
|
||||
(wasm.api/set-structure-modifiers structure-entries)
|
||||
(let [geometry-entries (parse-geometry-modifiers modif-tree)
|
||||
modifiers-new
|
||||
(wasm.api/propagate-modifiers geometry-entries)]
|
||||
(wasm.api/set-modifiers modifiers-new)))))))
|
||||
|
||||
(defn set-selrect-transform
|
||||
[modifiers]
|
||||
|
@ -654,4 +694,3 @@
|
|||
(if undo-transation?
|
||||
(rx/of (dwu/commit-undo-transaction undo-id))
|
||||
(rx/empty))))))))
|
||||
|
||||
|
|
|
@ -821,6 +821,22 @@
|
|||
(clear-drawing-cache)
|
||||
(request-render "set-objects")))))))
|
||||
|
||||
(defn set-structure-modifiers
|
||||
[entries]
|
||||
(when-not (empty? entries)
|
||||
(let [offset (mem/alloc-bytes-32 (mem/get-list-size entries 40))
|
||||
heapu32 (mem/get-heap-u32)]
|
||||
(loop [entries (seq entries)
|
||||
current-offset offset]
|
||||
(when-not (empty? entries)
|
||||
(let [{:keys [type parent id index] :as entry} (first entries)]
|
||||
(sr/heapu32-set-u32 (sr/translate-structure-modifier-type type) heapu32 (+ current-offset 0))
|
||||
(sr/heapu32-set-u32 (or index 0) heapu32 (+ current-offset 1))
|
||||
(sr/heapu32-set-uuid parent heapu32 (+ current-offset 2))
|
||||
(sr/heapu32-set-uuid id heapu32 (+ current-offset 6))
|
||||
(recur (rest entries) (+ current-offset 10)))))
|
||||
(h/call wasm/internal-module "_set_structure_modifiers"))))
|
||||
|
||||
(defn propagate-modifiers
|
||||
[entries]
|
||||
(let [offset (mem/alloc-bytes-32 (modifier-get-entries-size entries))
|
||||
|
@ -852,11 +868,13 @@
|
|||
(h/call wasm/internal-module "_set_canvas_background" rgba)
|
||||
(request-render "set-canvas-background")))
|
||||
|
||||
(defn clean-modifiers
|
||||
[]
|
||||
(h/call wasm/internal-module "_clean_modifiers"))
|
||||
|
||||
(defn set-modifiers
|
||||
[modifiers]
|
||||
(if (empty? modifiers)
|
||||
(h/call wasm/internal-module "_clean_modifiers")
|
||||
|
||||
(when-not (empty? modifiers)
|
||||
(let [offset (mem/alloc-bytes-32 (* MODIFIER-ENTRY-SIZE (count modifiers)))
|
||||
heapu32 (mem/get-heap-u32)
|
||||
heapf32 (mem/get-heap-f32)]
|
||||
|
|
|
@ -44,6 +44,10 @@
|
|||
(aset u32-arr 3 (aget buffer 3))
|
||||
(js/Uint8Array. (.-buffer u32-arr))))
|
||||
|
||||
(defn heapu32-set-u32
|
||||
[value heap offset]
|
||||
(aset heap offset value))
|
||||
|
||||
(defn heapu32-set-uuid
|
||||
[id heap offset]
|
||||
(let [buffer (uuid/get-u32 id)]
|
||||
|
@ -262,3 +266,9 @@
|
|||
:inner-shadow 1
|
||||
0))
|
||||
|
||||
|
||||
(defn translate-structure-modifier-type
|
||||
[type]
|
||||
(case type
|
||||
:remove-children 1
|
||||
:add-children 2))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue