diff --git a/frontend/src/app/main/data/workspace/comments.cljs b/frontend/src/app/main/data/workspace/comments.cljs index 5920f46153..d74a3bf209 100644 --- a/frontend/src/app/main/data/workspace/comments.cljs +++ b/frontend/src/app/main/data/workspace/comments.cljs @@ -132,8 +132,9 @@ (rx/ignore)))))))) ;; Move comment threads that are inside a frame when that frame is moved" -(defmethod ptk/resolve ::move-frame-comment-threads - [_ ids] + +(defn- move-frame-comment-threads + [ids transforms] (assert (sm/check-coll-of-uuid ids)) (ptk/reify ::move-frame-comment-threads @@ -148,14 +149,23 @@ threads-position-map (get page :comment-thread-positions) - object-modifiers - (:workspace-modifiers state) + object-modifiers (:workspace-modifiers state) build-move-event (fn [comment-thread] - (let [frame (get objects (:frame-id comment-thread)) - modifiers (get-in object-modifiers [(:frame-id comment-thread) :modifiers]) - frame' (gsh/transform-shape frame modifiers) + (let [frame-id (:frame-id comment-thread) + frame (get objects frame-id) + modifiers (get-in object-modifiers [frame-id :modifiers]) + transform (get transforms frame-id) + + frame' + (cond-> frame + (some? modifiers) + (gsh/transform-shape modifiers) + + (some? transform) + (gsh/apply-transform transform)) + moved (gpt/to-vec (gpt/point (:x frame) (:y frame)) (gpt/point (:x frame') (:y frame'))) position (get-in threads-position-map [(:id comment-thread) :position]) @@ -171,6 +181,13 @@ (map build-move-event) (rx/from)))))) +(defmethod ptk/resolve ::move-frame-comment-threads + [_ ids-or-transforms] + (when (d/not-empty? ids-or-transforms) + (move-frame-comment-threads + (if (map? ids-or-transforms) (keys ids-or-transforms) ids-or-transforms) + (when (map? ids-or-transforms) ids-or-transforms)))) + (defn overlap-bubbles? "Detect if two bubbles overlap" [zoom thread-1 thread-2] diff --git a/frontend/src/app/main/data/workspace/guides.cljs b/frontend/src/app/main/data/workspace/guides.cljs index eba5eb2c77..4ef75ee613 100644 --- a/frontend/src/app/main/data/workspace/guides.cljs +++ b/frontend/src/app/main/data/workspace/guides.cljs @@ -87,7 +87,7 @@ (watch [_ state _] (let [ids (:ids args) object-modifiers (:modifiers args) - + object-transforms (:transforms args) objects (dsh/lookup-page-objects state) is-frame? (fn [id] (= :frame (get-in objects [id :type]))) @@ -95,8 +95,18 @@ build-move-event (fn [guide] - (let [frame (get objects (:frame-id guide)) - frame' (gsh/transform-shape frame (get-in object-modifiers [(:frame-id guide) :modifiers])) + (let [frame-id (:frame-id guide) + frame (get objects frame-id) + modifier (get-in object-modifiers [frame-id :modifiers]) + transform (get object-transforms frame-id) + + frame' + (cond-> frame + (some? modifier) + (gsh/transform-shape modifier) + + (some? transform) + (gsh/apply-transform transform)) moved (gpt/to-vec (gpt/point (:x frame) (:y frame)) (gpt/point (:x frame') (:y frame'))) diff --git a/frontend/src/app/main/data/workspace/modifiers.cljs b/frontend/src/app/main/data/workspace/modifiers.cljs index b7ade7f6c8..6f8ffb5b21 100644 --- a/frontend/src/app/main/data/workspace/modifiers.cljs +++ b/frontend/src/app/main/data/workspace/modifiers.cljs @@ -36,6 +36,9 @@ [beicon.v2.core :as rx] [potok.v2.core :as ptk])) +(def ^:private xf:without-uuid-zero + (remove #(= % uuid/zero))) + ;; -- temporary modifiers ------------------------------------------- ;; During an interactive transformation of shapes (e.g. when resizing or rotating @@ -594,8 +597,8 @@ (ptk/reify ::apply-wasm-modifiesr ptk/WatchEvent (watch [_ state _] - (let [geometry-entries - (parse-geometry-modifiers modif-tree) + (let [objects (dsh/lookup-page-objects state) + geometry-entries (parse-geometry-modifiers modif-tree) snap-pixel? (and (not ignore-snap-pixel) (contains? (:workspace-layout state) :snap-pixel-grid)) @@ -610,7 +613,7 @@ (propagate-structure-modifiers modif-tree (dsh/lookup-page-objects state)) ids - (into (set (keys modif-tree)) (keys transforms)) + (into [] xf:without-uuid-zero (keys transforms)) update-shape (fn [shape] @@ -622,6 +625,8 @@ (ctm/apply-structure-modifiers modifiers))))] (rx/of (clear-local-transform) + (ptk/event ::dwg/move-frame-guides {:ids ids :transforms transforms}) + (ptk/event ::dwcm/move-frame-comment-threads transforms) (dwsh/update-shapes ids update-shape)))))) (def ^:private @@ -709,9 +714,6 @@ (assoc state :workspace-modifiers modif-tree))))) -(def ^:private xf:without-uuid-zero - (remove #(= % uuid/zero))) - (def ^:private transform-attrs #{:selrect :points diff --git a/frontend/src/app/main/ui/workspace/viewport/guides.cljs b/frontend/src/app/main/ui/workspace/viewport/guides.cljs index 9d044ead53..5e6963be9e 100644 --- a/frontend/src/app/main/ui/workspace/viewport/guides.cljs +++ b/frontend/src/app/main/ui/workspace/viewport/guides.cljs @@ -272,8 +272,8 @@ (mf/defc guide* {::mf/wrap [mf/memo] ::mf/props :obj} - [{:keys [guide is-hover on-guide-change get-hover-frame vbox zoom hover-frame disabled-guides frame-modifier]}] - + [{:keys [guide is-hover on-guide-change get-hover-frame vbox zoom + hover-frame disabled-guides frame-modifier frame-transform]}] (let [axis (:axis guide) handle-change-position @@ -293,7 +293,14 @@ frame]} (use-guide handle-change-position get-hover-frame zoom guide) base-frame (or frame hover-frame) - frame (gsh/transform-shape base-frame frame-modifier) + + frame + (cond-> base-frame + (some? frame-modifier) + (gsh/transform-shape frame-modifier) + + (some? frame-transform) + (gsh/apply-transform frame-transform)) move-vec (gpt/to-vec (gpt/point (:x base-frame) (:y base-frame)) (gpt/point (:x frame) (:y frame))) @@ -472,7 +479,11 @@ (fn [guide] (if (guide-inside-vbox? zoom vbox guide) (st/emit! (dw/update-guides guide)) - (st/emit! (dw/remove-guide guide)))))] + (st/emit! (dw/remove-guide guide))))) + + frame-modifiers + (-> (group-by :id modifiers) + (update-vals (comp :transform first)))] (mf/with-effect [hover-frame] (mf/set-ref-val! hover-frame-ref hover-frame)) @@ -490,15 +501,15 @@ :get-hover-frame get-hover-frame :disabled-guides disabled-guides}] - (for [current guides] - (when (or (nil? (:frame-id current)) + (for [{:keys [id frame-id] :as guide} guides] + (when (or (nil? frame-id) (empty? focus) - (contains? focus (:frame-id current))) - [:> guide* {:key (dm/str "guide-" (:id current)) - :guide current + (contains? focus frame-id)) + [:> guide* {:key (dm/str "guide-" id) + :guide guide :vbox vbox :zoom zoom - :frame-modifier (dm/get-in modifiers [(:frame-id current) :modifiers]) + :frame-transform (get frame-modifiers frame-id) :get-hover-frame get-hover-frame :on-guide-change on-guide-change :disabled-guides disabled-guides}]))])) diff --git a/frontend/src/app/main/ui/workspace/viewport_wasm.cljs b/frontend/src/app/main/ui/workspace/viewport_wasm.cljs index d874c9d704..0f49c833ee 100644 --- a/frontend/src/app/main/ui/workspace/viewport_wasm.cljs +++ b/frontend/src/app/main/ui/workspace/viewport_wasm.cljs @@ -95,9 +95,9 @@ read-only? (mf/use-ctx ctx/workspace-read-only?) ;; DEREFS - drawing (mf/deref refs/workspace-drawing) focus (mf/deref refs/workspace-focus-selected) + wasm-modifiers (mf/deref workspace-wasm-modifiers) workspace-editor-state (mf/deref refs/workspace-editor-state) @@ -105,11 +105,10 @@ objects (get page :objects) page-id (get page :id) background (get page :background clr/canvas) + guides (get page :guides) base-objects (ui-hooks/with-focus-objects objects focus) - wasm-modifiers (mf/deref workspace-wasm-modifiers) - objects-modified (mf/with-memo [base-objects wasm-modifiers] @@ -575,9 +574,10 @@ [:> guides/viewport-guides* {:zoom zoom :vbox vbox - :guides (:guides page) + :guides guides :hover-frame guide-frame - :disabled-guides disabled-guides?}]) + :disabled-guides disabled-guides? + :modifiers wasm-modifiers}]) ;; DEBUG LAYOUT DROP-ZONES (when (dbg/enabled? :layout-drop-zones)