diff --git a/common/src/app/common/geom/rect.cljc b/common/src/app/common/geom/rect.cljc index cd9bf6f06..adfa3114c 100644 --- a/common/src/app/common/geom/rect.cljc +++ b/common/src/app/common/geom/rect.cljc @@ -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)) diff --git a/common/src/app/common/geom/shapes/intersect.cljc b/common/src/app/common/geom/shapes/intersect.cljc index 94c8bebdb..2a5f8af20 100644 --- a/common/src/app/common/geom/shapes/intersect.cljc +++ b/common/src/app/common/geom/shapes/intersect.cljc @@ -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] diff --git a/frontend/src/app/main/ui/context.cljs b/frontend/src/app/main/ui/context.cljs index c0d1aa00e..a365ce9f3 100644 --- a/frontend/src/app/main/ui/context.cljs +++ b/frontend/src/app/main/ui/context.cljs @@ -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)) diff --git a/frontend/src/app/main/ui/workspace/shapes.cljs b/frontend/src/app/main/ui/workspace/shapes.cljs index ce440a890..083713ddb 100644 --- a/frontend/src/app/main/ui/workspace/shapes.cljs +++ b/frontend/src/app/main/ui/workspace/shapes.cljs @@ -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} diff --git a/frontend/src/app/main/ui/workspace/shapes/frame.cljs b/frontend/src/app/main/ui/workspace/shapes/frame.cljs index 24437dc94..24c088225 100644 --- a/frontend/src/app/main/ui/workspace/shapes/frame.cljs +++ b/frontend/src/app/main/ui/workspace/shapes/frame.cljs @@ -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]] - ])))) + ])))) diff --git a/frontend/src/app/main/ui/workspace/viewport.cljs b/frontend/src/app/main/ui/workspace/viewport.cljs index 275d9f4a0..d2982a10c 100644 --- a/frontend/src/app/main/ui/workspace/viewport.cljs +++ b/frontend/src/app/main/ui/workspace/viewport.cljs @@ -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"