Don't render not visible shapes on workspace

This commit is contained in:
Andrey Antukh 2023-09-01 17:37:16 +02:00
parent 5b3e12bb9c
commit a01c64ea57
6 changed files with 54 additions and 41 deletions

View file

@ -275,21 +275,19 @@
[a b]
(mth/almost-zero? (- a b)))
;; FIXME: performance
(defn overlaps-rects?
"Check for two rects to overlap. Rects won't overlap only if
one of them is fully to the left or the top"
[rect-a rect-b]
(let [x1a (dm/get-prop rect-a :x)
y1a (dm/get-prop rect-a :y)
x2a (+ x1a (dm/get-prop rect-a :width))
y2a (+ y1a (dm/get-prop rect-a :height))
(let [x1a (:x rect-a)
y1a (:y rect-a)
x2a (+ (:x rect-a) (:width rect-a))
y2a (+ (:y rect-a) (:height rect-a))
x1b (:x rect-b)
y1b (:y rect-b)
x2b (+ (:x rect-b) (:width rect-b))
y2b (+ (:y rect-b) (:height rect-b))]
x1b (dm/get-prop rect-b :x)
y1b (dm/get-prop rect-b :y)
x2b (+ x1b (dm/get-prop rect-b :width))
y2b (+ y1b (dm/get-prop rect-b :height))]
(and (or (> x2a x1b) (s= x2a x1b))
(or (>= x2b x1a) (s= x2b x1a))

View file

@ -305,30 +305,27 @@
(defn overlaps?
"General case to check for overlapping between shapes and a rectangle"
[shape rect]
(let [stroke-width (/ (or (:stroke-width shape) 0) 2)
rect (-> rect
(update :x - stroke-width)
(update :y - stroke-width)
(update :width + (* 2 stroke-width))
(update :height + (* 2 stroke-width)))]
(let [swidth (/ (or (:stroke-width shape) 0) 2)
rect (-> rect
(update :x - swidth)
(update :y - swidth)
(update :width + (* 2 swidth))
(update :height + (* 2 swidth)))]
(or (not shape)
(let [path? (= :path (:type shape))
circle? (= :circle (:type shape))
text? (= :text (:type shape))]
(cond
path?
(and (overlaps-rect-points? rect (:points shape))
(overlaps-path? shape rect))
(cond
(cph/path-shape? shape)
(and (overlaps-rect-points? rect (:points shape))
(overlaps-path? shape rect))
circle?
(and (overlaps-rect-points? rect (:points shape))
(overlaps-ellipse? shape rect))
(cph/circle-shape? shape)
(and (overlaps-rect-points? rect (:points shape))
(overlaps-ellipse? shape rect))
text?
(overlaps-text? shape rect)
(cph/text-shape? shape)
(overlaps-text? shape rect)
:else
(overlaps-rect-points? rect (:points shape)))))))
:else
(overlaps-rect-points? rect (:points shape))))))
(defn has-point-rect?
[rect point]

View file

@ -16,6 +16,7 @@
(def current-project-id (mf/create-context nil))
(def current-page-id (mf/create-context nil))
(def current-file-id (mf/create-context nil))
(def current-vbox (mf/create-context nil))
(def active-frames (mf/create-context nil))
(def render-thumbnails (mf/create-context nil))

View file

@ -13,6 +13,7 @@
common."
(:require
[app.common.data.macros :as dm]
[app.common.geom.rect :as grc]
[app.common.pages.helpers :as cph]
[app.common.uuid :as uuid]
[app.main.ui.context :as ctx]
@ -54,7 +55,18 @@
;; frame changes won't affect the rendering frame
frame-objects
(mf/with-memo [objects]
(cph/objects-by-frame objects))]
(cph/objects-by-frame objects))
vbox (mf/use-ctx ctx/current-vbox)
shapes
(mf/with-memo [shapes vbox]
(if (some? vbox)
(->> shapes
(filterv (fn [shape]
(grc/overlaps-rects? vbox (dm/get-prop shape :selrect)))))
shapes))]
[:g {:id (dm/str "shape-" uuid/zero)}
[:& (mf/provider ctx/active-frames) {:value active-frames}

View file

@ -88,6 +88,7 @@
(let [shape (unchecked-get props "shape")]
[:& frame-shape {:shape shape :ref node-ref}])))))
(defn root-frame-wrapper-factory
[shape-wrapper]
@ -101,9 +102,9 @@
thumbnail? (unchecked-get props "thumbnail?")
page-id (mf/use-ctx ctx/current-page-id)
frame-id (:id shape)
frame-id (dm/get-prop shape :id)
objects (wsh/lookup-page-objects @st/state)
objects (wsh/lookup-page-objects @st/state page-id)
node-ref (mf/use-ref nil)
root-ref (mf/use-ref nil)
@ -129,6 +130,7 @@
on-frame-load
(fns/use-node-store node-ref rendered-ref thumbnail? render-frame?)
]
(fdm/use-dynamic-modifiers objects (mf/ref-val node-ref) modifiers)
@ -164,12 +166,12 @@
:key "frame-container"
:ref on-frame-load
:opacity (when (:hidden shape) 0)}
[:& ff/fontfaces-style {:fonts fonts}]
[:& ff/fontfaces-style {:fonts fonts}]
[:g.frame-thumbnail-wrapper
{:id (dm/str "thumbnail-container-" frame-id)
;; Hide the thumbnail when not displaying
:opacity (when-not thumbnail? 0)}
children]]
]))))
]))))

View file

@ -88,6 +88,8 @@
show-distances?
picking-color?]} wglobal
vbox' (mf/use-debounce 100 vbox)
;; CONTEXT
page-id (mf/use-ctx ctx/current-page-id)
@ -323,12 +325,13 @@
:y (:y vbox 0)
:fill background}]
[:& (mf/provider use/include-metadata-ctx) {:value (debug? :show-export-metadata)}
[:& (mf/provider embed/context) {:value true}
;; Render root shape
[:& shapes/root-shape {:key page-id
:objects base-objects
:active-frames @active-frames}]]]]
[:& (mf/provider ctx/current-vbox) {:value vbox'}
[:& (mf/provider use/include-metadata-ctx) {:value (debug? :show-export-metadata)}
[:& (mf/provider embed/context) {:value true}
;; Render root shape
[:& shapes/root-shape {:key page-id
:objects base-objects
:active-frames @active-frames}]]]]]
[:svg.viewport-controls
{:xmlns "http://www.w3.org/2000/svg"