Move guides and comments for wasm modifiers

This commit is contained in:
alonso.torres 2025-05-29 13:12:24 +02:00
parent f6fe41af96
commit facb0227a0
5 changed files with 71 additions and 31 deletions

View file

@ -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]

View file

@ -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')))

View file

@ -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

View file

@ -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}]))]))

View file

@ -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)