diff --git a/common/src/app/common/geom/shapes/bounds.cljc b/common/src/app/common/geom/shapes/bounds.cljc index 065ff5e5d..3a2bb88c9 100644 --- a/common/src/app/common/geom/shapes/bounds.cljc +++ b/common/src/app/common/geom/shapes/bounds.cljc @@ -133,7 +133,9 @@ (-> (get-shape-filter-bounds shape) (add-padding (calculate-padding shape true)))) - bounds (if (or (:masked-group? shape) (cph/frame-shape? shape)) + bounds (if (or (:masked-group? shape) + (and (cph/frame-shape? shape) + (not (:show-content shape)))) [(calculate-base-bounds shape)] (cph/reduce-objects objects diff --git a/common/src/app/common/types/shape/interactions.cljc b/common/src/app/common/types/shape/interactions.cljc index 048e963d9..8b4975bdc 100644 --- a/common/src/app/common/types/shape/interactions.cljc +++ b/common/src/app/common/types/shape/interactions.cljc @@ -8,6 +8,7 @@ (:require [app.common.data :as d] [app.common.geom.point :as gpt] + [app.common.geom.shapes.bounds :as gsb] [app.common.spec :as us] [clojure.spec.alpha :as s])) @@ -362,6 +363,7 @@ (defn calc-overlay-position [interaction ;; interaction data + objects ;; the objects tree relative-to-shape ;; the interaction position is realtive to this sape base-frame ;; the base frame of the current interaction dest-frame ;; the frame to display with this interaction @@ -371,7 +373,7 @@ (assert (has-overlay-opts interaction)) (if (nil? dest-frame) (gpt/point 0 0) - (let [overlay-size (:selrect dest-frame) + (let [overlay-size (gsb/get-object-bounds objects dest-frame) base-frame-size (:selrect base-frame) relative-to-shape-size (:selrect relative-to-shape) relative-to-adjusted-to-base-frame {:x (- (:x relative-to-shape-size) (:x base-frame-size)) diff --git a/common/test/common_tests/types_shape_interactions_test.cljc b/common/test/common_tests/types_shape_interactions_test.cljc index c3202394b..b1bf12698 100644 --- a/common/test/common_tests/types_shape_interactions_test.cljc +++ b/common/test/common_tests/types_shape_interactions_test.cljc @@ -6,6 +6,7 @@ (ns common-tests.types-shape-interactions-test (:require + [app.common.geom.shapes :as gsh] [app.common.exceptions :as ex] [app.common.geom.point :as gpt] [app.common.types.shape :as cts] @@ -275,26 +276,38 @@ new-interaction (ctsi/set-position-relative-to i3 relative-to-id)] (t/is (= relative-to-id (:position-relative-to new-interaction))))))) +(defn setup-selrect [{:keys [x y width height] :as obj}] + (let [rect (gsh/make-rect x y width height) + center (gsh/center-rect rect) + selrect (gsh/rect->selrect rect) + points (gsh/rect->points rect)] + (-> obj + (assoc :selrect selrect) + (assoc :points points)))) (t/deftest calc-overlay-position (let [base-frame (-> (cts/make-minimal-shape :frame) - (assoc-in [:selrect :width] 100) - (assoc-in [:selrect :height] 100)) + (assoc :width 100) + (assoc :height 100) + (setup-selrect)) popup (-> (cts/make-minimal-shape :frame) - (assoc-in [:selrect :width] 50) - (assoc-in [:selrect :height] 50) - (assoc-in [:selrect :x] 10) - (assoc-in [:selrect :y] 10)) + (assoc :width 50) + (assoc :height 50) + (assoc :x 10) + (assoc :y 10) + (setup-selrect)) rect (-> (cts/make-minimal-shape :rect) - (assoc-in [:selrect :width] 50) - (assoc-in [:selrect :height] 50) - (assoc-in [:selrect :x] 10) - (assoc-in [:selrect :y] 10)) + (assoc :width 50) + (assoc :height 50) + (assoc :x 10) + (assoc :y 10) + (setup-selrect)) overlay-frame (-> (cts/make-minimal-shape :frame) - (assoc-in [:selrect :width] 30) - (assoc-in [:selrect :height] 20)) + (assoc :width 30) + (assoc :height 20) + (setup-selrect)) objects {(:id base-frame) base-frame (:id popup) popup @@ -311,49 +324,49 @@ interaction-rect (ctsi/set-position-relative-to interaction (:id rect))] (t/testing "Overlay top-left relative to auto" (let [i2 (ctsi/set-overlay-pos-type interaction-auto :top-left base-frame objects) - overlay-pos (ctsi/calc-overlay-position i2 base-frame base-frame overlay-frame frame-offset)] + overlay-pos (ctsi/calc-overlay-position i2 objects base-frame base-frame overlay-frame frame-offset)] (t/is (= (:x overlay-pos) 0)) (t/is (= (:y overlay-pos) 0)))) (t/testing "Overlay top-center relative to auto" (let [i2 (ctsi/set-overlay-pos-type interaction-auto :top-center base-frame objects) - overlay-pos (ctsi/calc-overlay-position i2 base-frame base-frame overlay-frame frame-offset)] + overlay-pos (ctsi/calc-overlay-position i2 objects base-frame base-frame overlay-frame frame-offset)] (t/is (= (:x overlay-pos) 35)) (t/is (= (:y overlay-pos) 0)))) (t/testing "Overlay top-right relative to auto" (let [i2 (ctsi/set-overlay-pos-type interaction-auto :top-right base-frame objects) - overlay-pos (ctsi/calc-overlay-position i2 base-frame base-frame overlay-frame frame-offset)] + overlay-pos (ctsi/calc-overlay-position i2 objects base-frame base-frame overlay-frame frame-offset)] (t/is (= (:x overlay-pos) 70)) (t/is (= (:y overlay-pos) 0)))) (t/testing "Overlay bottom-left relative to auto" (let [i2 (ctsi/set-overlay-pos-type interaction-auto :bottom-left base-frame objects) - overlay-pos (ctsi/calc-overlay-position i2 base-frame base-frame overlay-frame frame-offset)] + overlay-pos (ctsi/calc-overlay-position i2 objects base-frame base-frame overlay-frame frame-offset)] (t/is (= (:x overlay-pos) 0)) (t/is (= (:y overlay-pos) 80)))) (t/testing "Overlay bottom-center relative to auto" (let [i2 (ctsi/set-overlay-pos-type interaction-auto :bottom-center base-frame objects) - overlay-pos (ctsi/calc-overlay-position i2 base-frame base-frame overlay-frame frame-offset)] + overlay-pos (ctsi/calc-overlay-position i2 objects base-frame base-frame overlay-frame frame-offset)] (t/is (= (:x overlay-pos) 35)) (t/is (= (:y overlay-pos) 80)))) (t/testing "Overlay bottom-right relative to auto" (let [i2 (ctsi/set-overlay-pos-type interaction-auto :bottom-right base-frame objects) - overlay-pos (ctsi/calc-overlay-position i2 base-frame base-frame overlay-frame frame-offset)] + overlay-pos (ctsi/calc-overlay-position i2 objects base-frame base-frame overlay-frame frame-offset)] (t/is (= (:x overlay-pos) 70)) (t/is (= (:y overlay-pos) 80)))) (t/testing "Overlay center relative to auto" (let [i2 (ctsi/set-overlay-pos-type interaction-auto :center base-frame objects) - overlay-pos (ctsi/calc-overlay-position i2 base-frame base-frame overlay-frame frame-offset)] + overlay-pos (ctsi/calc-overlay-position i2 objects base-frame base-frame overlay-frame frame-offset)] (t/is (= (:x overlay-pos) 35)) (t/is (= (:y overlay-pos) 40)))) (t/testing "Overlay manual relative to auto" (let [i2 (ctsi/set-overlay-pos-type interaction-auto :center base-frame objects) - overlay-pos (ctsi/calc-overlay-position i2 base-frame base-frame overlay-frame frame-offset)] + overlay-pos (ctsi/calc-overlay-position i2 objects base-frame base-frame overlay-frame frame-offset)] (t/is (= (:x overlay-pos) 35)) (t/is (= (:y overlay-pos) 40)))) @@ -361,49 +374,49 @@ (let [i2 (-> interaction-auto (ctsi/set-overlay-pos-type :manual base-frame objects) (ctsi/set-overlay-position (gpt/point 12 62))) - overlay-pos (ctsi/calc-overlay-position i2 base-frame base-frame overlay-frame frame-offset)] + overlay-pos (ctsi/calc-overlay-position i2 objects base-frame base-frame overlay-frame frame-offset)] (t/is (= (:x overlay-pos) 17)) (t/is (= (:y overlay-pos) 67)))) (t/testing "Overlay top-left relative to base-frame" (let [i2 (ctsi/set-overlay-pos-type interaction-base-frame :top-left base-frame objects) - overlay-pos (ctsi/calc-overlay-position i2 base-frame base-frame overlay-frame frame-offset)] + overlay-pos (ctsi/calc-overlay-position i2 objects base-frame base-frame overlay-frame frame-offset)] (t/is (= (:x overlay-pos) 5)) (t/is (= (:y overlay-pos) 5)))) (t/testing "Overlay top-center relative to base-frame" (let [i2 (ctsi/set-overlay-pos-type interaction-base-frame :top-center base-frame objects) - overlay-pos (ctsi/calc-overlay-position i2 base-frame base-frame overlay-frame frame-offset)] + overlay-pos (ctsi/calc-overlay-position i2 objects base-frame base-frame overlay-frame frame-offset)] (t/is (= (:x overlay-pos) 40)) (t/is (= (:y overlay-pos) 5)))) (t/testing "Overlay top-right relative to base-frame" (let [i2 (ctsi/set-overlay-pos-type interaction-base-frame :top-right base-frame objects) - overlay-pos (ctsi/calc-overlay-position i2 base-frame base-frame overlay-frame frame-offset)] + overlay-pos (ctsi/calc-overlay-position i2 objects base-frame base-frame overlay-frame frame-offset)] (t/is (= (:x overlay-pos) 75)) (t/is (= (:y overlay-pos) 5)))) (t/testing "Overlay bottom-left relative to base-frame" (let [i2 (ctsi/set-overlay-pos-type interaction-base-frame :bottom-left base-frame objects) - overlay-pos (ctsi/calc-overlay-position i2 base-frame base-frame overlay-frame frame-offset)] + overlay-pos (ctsi/calc-overlay-position i2 objects base-frame base-frame overlay-frame frame-offset)] (t/is (= (:x overlay-pos) 5)) (t/is (= (:y overlay-pos) 85)))) (t/testing "Overlay bottom-center relative to base-frame" (let [i2 (ctsi/set-overlay-pos-type interaction-base-frame :bottom-center base-frame objects) - overlay-pos (ctsi/calc-overlay-position i2 base-frame base-frame overlay-frame frame-offset)] + overlay-pos (ctsi/calc-overlay-position i2 objects base-frame base-frame overlay-frame frame-offset)] (t/is (= (:x overlay-pos) 40)) (t/is (= (:y overlay-pos) 85)))) (t/testing "Overlay bottom-right relative to base-frame" (let [i2 (ctsi/set-overlay-pos-type interaction-base-frame :bottom-right base-frame objects) - overlay-pos (ctsi/calc-overlay-position i2 base-frame base-frame overlay-frame frame-offset)] + overlay-pos (ctsi/calc-overlay-position i2 objects base-frame base-frame overlay-frame frame-offset)] (t/is (= (:x overlay-pos) 75)) (t/is (= (:y overlay-pos) 85)))) (t/testing "Overlay center relative to base-frame" (let [i2 (ctsi/set-overlay-pos-type interaction-base-frame :center base-frame objects) - overlay-pos (ctsi/calc-overlay-position i2 base-frame base-frame overlay-frame frame-offset)] + overlay-pos (ctsi/calc-overlay-position i2 objects base-frame base-frame overlay-frame frame-offset)] (t/is (= (:x overlay-pos) 40)) (t/is (= (:y overlay-pos) 45)))) @@ -411,49 +424,49 @@ (let [i2 (-> interaction-base-frame (ctsi/set-overlay-pos-type :manual base-frame objects) (ctsi/set-overlay-position (gpt/point 12 62))) - overlay-pos (ctsi/calc-overlay-position i2 base-frame base-frame overlay-frame frame-offset)] + overlay-pos (ctsi/calc-overlay-position i2 objects base-frame base-frame overlay-frame frame-offset)] (t/is (= (:x overlay-pos) 17)) (t/is (= (:y overlay-pos) 67)))) (t/testing "Overlay top-left relative to popup" (let [i2 (ctsi/set-overlay-pos-type interaction-popup :top-left base-frame objects) - overlay-pos (ctsi/calc-overlay-position i2 popup base-frame overlay-frame frame-offset)] + overlay-pos (ctsi/calc-overlay-position i2 objects popup base-frame overlay-frame frame-offset)] (t/is (= (:x overlay-pos) 15)) (t/is (= (:y overlay-pos) 15)))) (t/testing "Overlay top-center relative to popup" (let [i2 (ctsi/set-overlay-pos-type interaction-popup :top-center base-frame objects) - overlay-pos (ctsi/calc-overlay-position i2 popup base-frame overlay-frame frame-offset)] + overlay-pos (ctsi/calc-overlay-position i2 objects popup base-frame overlay-frame frame-offset)] (t/is (= (:x overlay-pos) 25)) (t/is (= (:y overlay-pos) 15)))) (t/testing "Overlay top-right relative to popup" (let [i2 (ctsi/set-overlay-pos-type interaction-popup :top-right base-frame objects) - overlay-pos (ctsi/calc-overlay-position i2 popup base-frame overlay-frame frame-offset)] + overlay-pos (ctsi/calc-overlay-position i2 objects popup base-frame overlay-frame frame-offset)] (t/is (= (:x overlay-pos) 35)) (t/is (= (:y overlay-pos) 15)))) (t/testing "Overlay bottom-left relative to popup" (let [i2 (ctsi/set-overlay-pos-type interaction-popup :bottom-left base-frame objects) - overlay-pos (ctsi/calc-overlay-position i2 popup base-frame overlay-frame frame-offset)] + overlay-pos (ctsi/calc-overlay-position i2 objects popup base-frame overlay-frame frame-offset)] (t/is (= (:x overlay-pos) 15)) (t/is (= (:y overlay-pos) 45)))) (t/testing "Overlay bottom-center relative to popup" (let [i2 (ctsi/set-overlay-pos-type interaction-popup :bottom-center base-frame objects) - overlay-pos (ctsi/calc-overlay-position i2 popup base-frame overlay-frame frame-offset)] + overlay-pos (ctsi/calc-overlay-position i2 objects popup base-frame overlay-frame frame-offset)] (t/is (= (:x overlay-pos) 25)) (t/is (= (:y overlay-pos) 45)))) (t/testing "Overlay bottom-right relative to popup" (let [i2 (ctsi/set-overlay-pos-type interaction-popup :bottom-right base-frame objects) - overlay-pos (ctsi/calc-overlay-position i2 popup base-frame overlay-frame frame-offset)] + overlay-pos (ctsi/calc-overlay-position i2 objects popup base-frame overlay-frame frame-offset)] (t/is (= (:x overlay-pos) 35)) (t/is (= (:y overlay-pos) 45)))) (t/testing "Overlay center relative to popup" (let [i2 (ctsi/set-overlay-pos-type interaction-popup :center base-frame objects) - overlay-pos (ctsi/calc-overlay-position i2 popup base-frame overlay-frame frame-offset)] + overlay-pos (ctsi/calc-overlay-position i2 objects popup base-frame overlay-frame frame-offset)] (t/is (= (:x overlay-pos) 25)) (t/is (= (:y overlay-pos) 30)))) @@ -461,49 +474,49 @@ (let [i2 (-> interaction-popup (ctsi/set-overlay-pos-type :manual base-frame objects) (ctsi/set-overlay-position (gpt/point 12 62))) - overlay-pos (ctsi/calc-overlay-position i2 popup base-frame overlay-frame frame-offset)] + overlay-pos (ctsi/calc-overlay-position i2 objects popup base-frame overlay-frame frame-offset)] (t/is (= (:x overlay-pos) 27)) (t/is (= (:y overlay-pos) 77)))) (t/testing "Overlay top-left relative to popup" (let [i2 (ctsi/set-overlay-pos-type interaction-popup :top-left base-frame objects) - overlay-pos (ctsi/calc-overlay-position i2 popup base-frame overlay-frame frame-offset)] + overlay-pos (ctsi/calc-overlay-position i2 objects popup base-frame overlay-frame frame-offset)] (t/is (= (:x overlay-pos) 15)) (t/is (= (:y overlay-pos) 15)))) (t/testing "Overlay top-center relative to rect" (let [i2 (ctsi/set-overlay-pos-type interaction-rect :top-center base-frame objects) - overlay-pos (ctsi/calc-overlay-position i2 rect base-frame overlay-frame frame-offset)] + overlay-pos (ctsi/calc-overlay-position i2 objects rect base-frame overlay-frame frame-offset)] (t/is (= (:x overlay-pos) 25)) (t/is (= (:y overlay-pos) 15)))) (t/testing "Overlay top-right relative to rect" (let [i2 (ctsi/set-overlay-pos-type interaction-rect :top-right base-frame objects) - overlay-pos (ctsi/calc-overlay-position i2 rect base-frame overlay-frame frame-offset)] + overlay-pos (ctsi/calc-overlay-position i2 objects rect base-frame overlay-frame frame-offset)] (t/is (= (:x overlay-pos) 35)) (t/is (= (:y overlay-pos) 15)))) (t/testing "Overlay bottom-left relative to rect" (let [i2 (ctsi/set-overlay-pos-type interaction-rect :bottom-left base-frame objects) - overlay-pos (ctsi/calc-overlay-position i2 rect base-frame overlay-frame frame-offset)] + overlay-pos (ctsi/calc-overlay-position i2 objects rect base-frame overlay-frame frame-offset)] (t/is (= (:x overlay-pos) 15)) (t/is (= (:y overlay-pos) 45)))) (t/testing "Overlay bottom-center relative to rect" (let [i2 (ctsi/set-overlay-pos-type interaction-rect :bottom-center base-frame objects) - overlay-pos (ctsi/calc-overlay-position i2 rect base-frame overlay-frame frame-offset)] + overlay-pos (ctsi/calc-overlay-position i2 objects rect base-frame overlay-frame frame-offset)] (t/is (= (:x overlay-pos) 25)) (t/is (= (:y overlay-pos) 45)))) (t/testing "Overlay bottom-right relative to rect" (let [i2 (ctsi/set-overlay-pos-type interaction-rect :bottom-right base-frame objects) - overlay-pos (ctsi/calc-overlay-position i2 rect base-frame overlay-frame frame-offset)] + overlay-pos (ctsi/calc-overlay-position i2 objects rect base-frame overlay-frame frame-offset)] (t/is (= (:x overlay-pos) 35)) (t/is (= (:y overlay-pos) 45)))) (t/testing "Overlay center relative to rect" (let [i2 (ctsi/set-overlay-pos-type interaction-rect :center base-frame objects) - overlay-pos (ctsi/calc-overlay-position i2 rect base-frame overlay-frame frame-offset)] + overlay-pos (ctsi/calc-overlay-position i2 objects rect base-frame overlay-frame frame-offset)] (t/is (= (:x overlay-pos) 25)) (t/is (= (:y overlay-pos) 30)))) @@ -511,7 +524,7 @@ (let [i2 (-> interaction-rect (ctsi/set-overlay-pos-type :manual base-frame objects) (ctsi/set-overlay-position (gpt/point 12 62))) - overlay-pos (ctsi/calc-overlay-position i2 rect base-frame overlay-frame frame-offset)] + overlay-pos (ctsi/calc-overlay-position i2 objects rect base-frame overlay-frame frame-offset)] (t/is (= (:x overlay-pos) 17)) (t/is (= (:y overlay-pos) 67)))))) diff --git a/frontend/src/app/main/ui/viewer/shapes.cljs b/frontend/src/app/main/ui/viewer/shapes.cljs index c364d38c1..ccd997a54 100644 --- a/frontend/src/app/main/ui/viewer/shapes.cljs +++ b/frontend/src/app/main/ui/viewer/shapes.cljs @@ -69,6 +69,7 @@ overlays-ids (set (map :id overlays)) relative-to-base-frame (find-relative-to-base-frame relative-to-shape objects overlays-ids base-frame) position (ctsi/calc-overlay-position interaction + viewer-objects relative-to-shape relative-to-base-frame dest-frame @@ -90,6 +91,7 @@ overlays-ids (set (map :id overlays)) relative-to-base-frame (find-relative-to-base-frame relative-to-shape objects overlays-ids base-frame) position (ctsi/calc-overlay-position interaction + objects relative-to-shape relative-to-base-frame dest-frame @@ -154,6 +156,7 @@ overlays-ids (set (map :id overlays)) relative-to-base-frame (find-relative-to-base-frame relative-to-shape objects overlays-ids base-frame) position (ctsi/calc-overlay-position interaction + objects relative-to-shape relative-to-base-frame dest-frame