0
Fork 0
mirror of https://github.com/penpot/penpot.git synced 2025-02-13 10:38:13 -05:00

Memoize shapes

This commit is contained in:
alonso.torres 2021-04-28 17:28:02 +02:00 committed by Andrés Moya
parent 0b6c2df5b6
commit 91f60000b3
3 changed files with 26 additions and 3 deletions

View file

@ -12,7 +12,8 @@
(defn generic-wrapper-factory
[component]
(mf/fnc generic-wrapper
{::mf/wrap-props false}
{::mf/wrap [#(mf/memo' % (mf/check-props ["shape"]))]
::mf/wrap-props false}
[props]
(let [shape (unchecked-get props "shape")]
[:> shape-container {:shape shape}

View file

@ -28,6 +28,28 @@
(contains? (:selected local) id)))]
(l/derived check-moving refs/workspace-local)))
(defn check-props
([props] (check-props props =))
([props eqfn?]
(fn [np op]
(every? #(eqfn? (unchecked-get np %)
(unchecked-get op %))
props))))
(defn check-frame-props
"Checks for changes in the props of a frame"
[new-props old-props]
(let [new-shape (unchecked-get new-props "shape")
old-shape (unchecked-get old-props "shape")
new-objects (unchecked-get new-props "objects")
old-objects (unchecked-get old-props "objects")
new-children (->> new-shape :shapes (mapv #(get new-objects %)))
old-children (->> old-shape :shapes (mapv #(get old-objects %)))]
(and (= new-shape old-shape)
(= new-children old-children))))
;; This custom deffered don't deffer rendering when ghost rendering is
;; used.
(defn custom-deferred
@ -48,7 +70,7 @@
[shape-wrapper]
(let [frame-shape (frame/frame-shape shape-wrapper)]
(mf/fnc frame-wrapper
{::mf/wrap [#(mf/memo' % (mf/check-props ["shape" "objects"])) custom-deferred]
{::mf/wrap [#(mf/memo' % check-frame-props) custom-deferred]
::mf/wrap-props false}
[props]
(let [shape (unchecked-get props "shape")

View file

@ -30,7 +30,7 @@
[shape-wrapper]
(let [group-shape (group/group-shape shape-wrapper)]
(mf/fnc group-wrapper
{::mf/wrap [#(mf/memo' % (mf/check-props ["shape" "frame"]))]
{::mf/wrap [#(mf/memo' % (mf/check-props ["shape"]))]
::mf/wrap-props false}
[props]
(let [shape (unchecked-get props "shape")