diff --git a/common/src/app/common/types/shape/interactions.cljc b/common/src/app/common/types/shape/interactions.cljc index 8b4975bdc..d06a059bc 100644 --- a/common/src/app/common/types/shape/interactions.cljc +++ b/common/src/app/common/types/shape/interactions.cljc @@ -9,6 +9,7 @@ [app.common.data :as d] [app.common.geom.point :as gpt] [app.common.geom.shapes.bounds :as gsb] + [app.common.pages.helpers :as cph] [app.common.spec :as us] [clojure.spec.alpha :as s])) @@ -363,6 +364,7 @@ (defn calc-overlay-position [interaction ;; interaction data + shape ;; Shape with the interaction objects ;; the objects tree relative-to-shape ;; the interaction position is realtive to this sape base-frame ;; the base frame of the current interaction @@ -371,56 +373,68 @@ (us/verify ::interaction interaction) (assert (has-overlay-opts interaction)) - (if (nil? dest-frame) - (gpt/point 0 0) - (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)) - :y (- (:y relative-to-shape-size) (:y base-frame-size))} - relative-to-is-auto? (and (nil? (:position-relative-to interaction)) (not= :manual (:overlay-pos-type interaction))) - base-position (if relative-to-is-auto? - {:x 0 :y 0} - {:x (+ (:x frame-offset) - (:x relative-to-adjusted-to-base-frame)) - :y (+ (:y frame-offset) - (:y relative-to-adjusted-to-base-frame))}) - overlay-position (:overlay-position interaction) - overlay-position (if (= (:type relative-to-shape) :frame) - overlay-position - {:x (- (:x overlay-position) (:x relative-to-adjusted-to-base-frame)) - :y (- (:y overlay-position) (:y relative-to-adjusted-to-base-frame))})] - (case (:overlay-pos-type interaction) - :center - (gpt/point (+ (:x base-position) (/ (- (:width relative-to-shape-size) (:width overlay-size)) 2)) - (+ (:y base-position) (/ (- (:height relative-to-shape-size) (:height overlay-size)) 2))) + (let [ + ;; When the interactive item is inside a nested frame we need to add to the offset the position + ;; of the parent-frame otherwise the position won't match + shape-frame (cph/get-frame objects shape) - :top-left - (gpt/point (:x base-position) (:y base-position)) + frame-offset (if (or (not= :manual (:overlay-pos-type interaction)) + (nil? shape-frame) + (cph/root-frame? shape-frame) + (cph/root? shape-frame)) + frame-offset + (gpt/add frame-offset (gpt/point shape-frame))) + ] + (if (nil? dest-frame) + (gpt/point 0 0) + (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)) + :y (- (:y relative-to-shape-size) (:y base-frame-size))} + relative-to-is-auto? (and (nil? (:position-relative-to interaction)) (not= :manual (:overlay-pos-type interaction))) + base-position (if relative-to-is-auto? + {:x 0 :y 0} + {:x (+ (:x frame-offset) + (:x relative-to-adjusted-to-base-frame)) + :y (+ (:y frame-offset) + (:y relative-to-adjusted-to-base-frame))}) + overlay-position (:overlay-position interaction) + overlay-position (if (= (:type relative-to-shape) :frame) + overlay-position + {:x (- (:x overlay-position) (:x relative-to-adjusted-to-base-frame)) + :y (- (:y overlay-position) (:y relative-to-adjusted-to-base-frame))})] + (case (:overlay-pos-type interaction) + :center + (gpt/point (+ (:x base-position) (/ (- (:width relative-to-shape-size) (:width overlay-size)) 2)) + (+ (:y base-position) (/ (- (:height relative-to-shape-size) (:height overlay-size)) 2))) - :top-right - (gpt/point (+ (:x base-position) (- (:width relative-to-shape-size) (:width overlay-size))) - (:y base-position)) + :top-left + (gpt/point (:x base-position) (:y base-position)) - :top-center - (gpt/point (+ (:x base-position) (/ (- (:width relative-to-shape-size) (:width overlay-size)) 2)) - (:y base-position)) + :top-right + (gpt/point (+ (:x base-position) (- (:width relative-to-shape-size) (:width overlay-size))) + (:y base-position)) - :bottom-left - (gpt/point (:x base-position) - (+ (:y base-position) (- (:height relative-to-shape-size) (:height overlay-size)))) + :top-center + (gpt/point (+ (:x base-position) (/ (- (:width relative-to-shape-size) (:width overlay-size)) 2)) + (:y base-position)) - :bottom-right - (gpt/point (+ (:x base-position) (- (:width relative-to-shape-size) (:width overlay-size))) - (+ (:y base-position) (- (:height relative-to-shape-size) (:height overlay-size)))) + :bottom-left + (gpt/point (:x base-position) + (+ (:y base-position) (- (:height relative-to-shape-size) (:height overlay-size)))) - :bottom-center - (gpt/point (+ (:x base-position) (/ (- (:width relative-to-shape-size) (:width overlay-size)) 2)) - (+ (:y base-position) (- (:height relative-to-shape-size) (:height overlay-size)))) + :bottom-right + (gpt/point (+ (:x base-position) (- (:width relative-to-shape-size) (:width overlay-size))) + (+ (:y base-position) (- (:height relative-to-shape-size) (:height overlay-size)))) - :manual - (gpt/point (+ (:x base-position) (:x overlay-position)) - (+ (:y base-position) (:y overlay-position))))))) + :bottom-center + (gpt/point (+ (:x base-position) (/ (- (:width relative-to-shape-size) (:width overlay-size)) 2)) + (+ (:y base-position) (- (:height relative-to-shape-size) (:height overlay-size)))) + + :manual + (gpt/point (+ (:x base-position) (:x overlay-position)) + (+ (:y base-position) (:y overlay-position)))))))) (defn has-animation? [interaction] diff --git a/common/test/common_tests/types_shape_interactions_test.cljc b/common/test/common_tests/types_shape_interactions_test.cljc index b1bf12698..4411d86f1 100644 --- a/common/test/common_tests/types_shape_interactions_test.cljc +++ b/common/test/common_tests/types_shape_interactions_test.cljc @@ -324,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 objects base-frame base-frame overlay-frame frame-offset)] + overlay-pos (ctsi/calc-overlay-position i2 rect 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 objects base-frame base-frame overlay-frame frame-offset)] + overlay-pos (ctsi/calc-overlay-position i2 rect 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 objects base-frame base-frame overlay-frame frame-offset)] + overlay-pos (ctsi/calc-overlay-position i2 rect 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 objects base-frame base-frame overlay-frame frame-offset)] + overlay-pos (ctsi/calc-overlay-position i2 rect 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 objects base-frame base-frame overlay-frame frame-offset)] + overlay-pos (ctsi/calc-overlay-position i2 rect 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 objects base-frame base-frame overlay-frame frame-offset)] + overlay-pos (ctsi/calc-overlay-position i2 rect 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 objects base-frame base-frame overlay-frame frame-offset)] + overlay-pos (ctsi/calc-overlay-position i2 rect 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 objects base-frame base-frame overlay-frame frame-offset)] + overlay-pos (ctsi/calc-overlay-position i2 rect objects base-frame base-frame overlay-frame frame-offset)] (t/is (= (:x overlay-pos) 35)) (t/is (= (:y overlay-pos) 40)))) @@ -374,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 objects base-frame base-frame overlay-frame frame-offset)] + overlay-pos (ctsi/calc-overlay-position i2 rect 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 objects base-frame base-frame overlay-frame frame-offset)] + overlay-pos (ctsi/calc-overlay-position i2 rect 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 objects base-frame base-frame overlay-frame frame-offset)] + overlay-pos (ctsi/calc-overlay-position i2 rect 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 objects base-frame base-frame overlay-frame frame-offset)] + overlay-pos (ctsi/calc-overlay-position i2 rect 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 objects base-frame base-frame overlay-frame frame-offset)] + overlay-pos (ctsi/calc-overlay-position i2 rect 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 objects base-frame base-frame overlay-frame frame-offset)] + overlay-pos (ctsi/calc-overlay-position i2 rect 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 objects base-frame base-frame overlay-frame frame-offset)] + overlay-pos (ctsi/calc-overlay-position i2 rect 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 objects base-frame base-frame overlay-frame frame-offset)] + overlay-pos (ctsi/calc-overlay-position i2 rect objects base-frame base-frame overlay-frame frame-offset)] (t/is (= (:x overlay-pos) 40)) (t/is (= (:y overlay-pos) 45)))) @@ -424,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 objects base-frame base-frame overlay-frame frame-offset)] + overlay-pos (ctsi/calc-overlay-position i2 rect 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 objects popup base-frame overlay-frame frame-offset)] + overlay-pos (ctsi/calc-overlay-position i2 rect 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 objects popup base-frame overlay-frame frame-offset)] + overlay-pos (ctsi/calc-overlay-position i2 rect 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 objects popup base-frame overlay-frame frame-offset)] + overlay-pos (ctsi/calc-overlay-position i2 rect 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 objects popup base-frame overlay-frame frame-offset)] + overlay-pos (ctsi/calc-overlay-position i2 rect 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 objects popup base-frame overlay-frame frame-offset)] + overlay-pos (ctsi/calc-overlay-position i2 rect 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 objects popup base-frame overlay-frame frame-offset)] + overlay-pos (ctsi/calc-overlay-position i2 rect 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 objects popup base-frame overlay-frame frame-offset)] + overlay-pos (ctsi/calc-overlay-position i2 rect objects popup base-frame overlay-frame frame-offset)] (t/is (= (:x overlay-pos) 25)) (t/is (= (:y overlay-pos) 30)))) @@ -474,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 objects popup base-frame overlay-frame frame-offset)] + overlay-pos (ctsi/calc-overlay-position i2 rect 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 objects popup base-frame overlay-frame frame-offset)] + overlay-pos (ctsi/calc-overlay-position i2 rect 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 objects rect base-frame overlay-frame frame-offset)] + overlay-pos (ctsi/calc-overlay-position i2 rect 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 objects rect base-frame overlay-frame frame-offset)] + overlay-pos (ctsi/calc-overlay-position i2 rect 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 objects rect base-frame overlay-frame frame-offset)] + overlay-pos (ctsi/calc-overlay-position i2 rect 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 objects rect base-frame overlay-frame frame-offset)] + overlay-pos (ctsi/calc-overlay-position i2 rect 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 objects rect base-frame overlay-frame frame-offset)] + overlay-pos (ctsi/calc-overlay-position i2 rect 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 objects rect base-frame overlay-frame frame-offset)] + overlay-pos (ctsi/calc-overlay-position i2 rect objects rect base-frame overlay-frame frame-offset)] (t/is (= (:x overlay-pos) 25)) (t/is (= (:y overlay-pos) 30)))) @@ -524,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 objects rect base-frame overlay-frame frame-offset)] + overlay-pos (ctsi/calc-overlay-position i2 rect 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 99c59c22c..619e0a159 100644 --- a/frontend/src/app/main/ui/viewer/shapes.cljs +++ b/frontend/src/app/main/ui/viewer/shapes.cljs @@ -7,7 +7,6 @@ (ns app.main.ui.viewer.shapes "The main container for a frame in viewer mode" (:require - [app.common.geom.point :as gpt] [app.common.geom.shapes :as gsh] [app.common.pages.helpers :as cph] [app.common.types.shape.interactions :as ctsi] @@ -48,87 +47,82 @@ (defn- activate-interaction [interaction shape base-frame frame-offset objects overlays] - (let [;; When the interactive item is inside a nested frame we need to add to the offset the position - ;; of the parent-frame otherwise the position won't match - shape-frame (cph/get-frame objects shape) + (case (:action-type interaction) + :navigate + (when-let [frame-id (:destination interaction)] + (let [viewer-section (dom/get-element "viewer-section") + scroll (if (:preserve-scroll interaction) + (dom/get-scroll-pos viewer-section) + 0)] + (st/emit! (dv/set-nav-scroll scroll) + (dv/go-to-frame frame-id (:animation interaction))))) - frame-offset (if (or (cph/root-frame? shape-frame) (cph/root? shape-frame)) - frame-offset - (gpt/add frame-offset (gpt/point shape-frame)))] - (case (:action-type interaction) - :navigate - (when-let [frame-id (:destination interaction)] - (let [viewer-section (dom/get-element "viewer-section") - scroll (if (:preserve-scroll interaction) - (dom/get-scroll-pos viewer-section) - 0)] - (st/emit! (dv/set-nav-scroll scroll) - (dv/go-to-frame frame-id (:animation interaction))))) + :open-overlay + (let [dest-frame-id (:destination interaction) + viewer-objects (deref (refs/get-viewer-objects)) + dest-frame (get viewer-objects dest-frame-id) + relative-to-id (if (= :manual (:overlay-pos-type interaction)) + (:id shape) ;; manual interactions are allways from "self" + (:position-relative-to interaction)) + relative-to-shape (or (get objects relative-to-id) base-frame) + close-click-outside (:close-click-outside interaction) + background-overlay (:background-overlay interaction) + 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 + shape + viewer-objects + relative-to-shape + relative-to-base-frame + dest-frame + frame-offset)] + (when dest-frame-id + (st/emit! (dv/open-overlay dest-frame-id + position + close-click-outside + background-overlay + (:animation interaction))))) - :open-overlay - (let [dest-frame-id (:destination interaction) - viewer-objects (deref (refs/get-viewer-objects)) - dest-frame (get viewer-objects dest-frame-id) - relative-to-id (if (= :manual (:overlay-pos-type interaction)) - (:id shape) ;; manual interactions are allways from "self" - (:position-relative-to interaction)) - relative-to-shape (or (get objects relative-to-id) base-frame) - close-click-outside (:close-click-outside interaction) - background-overlay (:background-overlay interaction) - 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 - frame-offset)] - (when dest-frame-id - (st/emit! (dv/open-overlay dest-frame-id + :toggle-overlay + (let [frame-id (:destination interaction) + dest-frame (get objects frame-id) + relative-to-id (if (= :manual (:overlay-pos-type interaction)) + (:id shape) ;; manual interactions are allways from "self" + (:position-relative-to interaction)) + relative-to-shape (or (get objects relative-to-id) base-frame) + 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 + shape + objects + relative-to-shape + relative-to-base-frame + dest-frame + frame-offset) + + close-click-outside (:close-click-outside interaction) + background-overlay (:background-overlay interaction)] + (when frame-id + (st/emit! (dv/toggle-overlay frame-id position close-click-outside background-overlay (:animation interaction))))) - :toggle-overlay - (let [frame-id (:destination interaction) - dest-frame (get objects frame-id) - relative-to-id (if (= :manual (:overlay-pos-type interaction)) - (:id shape) ;; manual interactions are allways from "self" - (:position-relative-to interaction)) - relative-to-shape (or (get objects relative-to-id) base-frame) - 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 - frame-offset) + :close-overlay + (let [frame-id (or (:destination interaction) + (if (= (:type shape) :frame) + (:id shape) + (:frame-id shape)))] + (st/emit! (dv/close-overlay frame-id (:animation interaction)))) - close-click-outside (:close-click-outside interaction) - background-overlay (:background-overlay interaction)] - (when frame-id - (st/emit! (dv/toggle-overlay frame-id - position - close-click-outside - background-overlay - (:animation interaction))))) + :prev-screen + (st/emit! (rt/nav-back-local)) - :close-overlay - (let [frame-id (or (:destination interaction) - (if (= (:type shape) :frame) - (:id shape) - (:frame-id shape)))] - (st/emit! (dv/close-overlay frame-id (:animation interaction)))) + :open-url + (st/emit! (dom/open-new-window (:url interaction))) - :prev-screen - (st/emit! (rt/nav-back-local)) - - :open-url - (st/emit! (dom/open-new-window (:url interaction))) - - nil))) + nil)) ;; Perform the opposite action of an interaction, if possible (defn- deactivate-interaction @@ -165,6 +159,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 + shape objects relative-to-shape relative-to-base-frame