♻️ Refactor path editor component: path-snap

This commit is contained in:
Andrey Antukh 2025-04-04 10:48:28 +02:00
parent 93a601a1e7
commit 93199e1a70

View file

@ -219,10 +219,18 @@
:is-preview true :is-preview true
:zoom zoom}]])) :zoom zoom}]]))
(mf/defc path-snap [{:keys [selected points zoom]}] (mf/defc path-snap*
(let [ranges (mf/use-memo (mf/deps selected points) #(snap/create-ranges points selected)) {::mf/private true}
snap-matches (snap/get-snap-delta-match selected ranges (/ 1 zoom)) [{:keys [selected points zoom]}]
matches (concat (second (:x snap-matches)) (second (:y snap-matches)))] (let [ranges
(mf/with-memo [selected points]
(snap/create-ranges points selected))
snap-matches
(snap/get-snap-delta-match selected ranges (/ 1 zoom))
matches
(concat (second (:x snap-matches)) (second (:y snap-matches)))]
[:g.snap-paths [:g.snap-paths
(for [[idx [from to]] (d/enumerate matches)] (for [[idx [from to]] (d/enumerate matches)]
@ -234,7 +242,7 @@
:style {:stroke pc/secondary-color :style {:stroke pc/secondary-color
:stroke-width (/ path-snap-stroke-width zoom)}}])])) :stroke-width (/ path-snap-stroke-width zoom)}}])]))
(defn matching-handler? [content node handlers] (defn- matching-handler? [content node handlers]
(when (= 2 (count handlers)) (when (= 2 (count handlers))
(let [[[i1 p1] [i2 p2]] handlers (let [[[i1 p1] [i2 p2]] handlers
p1 (path.segment/handler->point content i1 p1) p1 (path.segment/handler->point content i1 p1)
@ -294,17 +302,8 @@
is-path-start (not (some? last-point)) is-path-start (not (some? last-point))
[snap-selected snap-points]
(cond
(some? drag-handler) [#{drag-handler} points]
(some? preview) [#{(path.segment/get-point preview)} points]
(some? moving-handler) [#{moving-handler} points]
:else
[(->> selected-points (map base->point) (into #{}))
(->> points (remove selected-points) (into #{}))])
show-snap? show-snap?
(and snap-toggled (and ^boolean snap-toggled
(or (some? drag-handler) (or (some? drag-handler)
(some? preview) (some? preview)
(some? moving-handler) (some? moving-handler)
@ -404,9 +403,17 @@
:handler prev-handler :handler prev-handler
:zoom zoom}]]) :zoom zoom}]])
(when show-snap? (when ^boolean show-snap?
[:g.path-snap {:pointer-events "none"} (let [[snap-selected snap-points]
[:& path-snap {:selected snap-selected (cond
:points snap-points (some? drag-handler) [#{drag-handler} points]
:zoom zoom}]])])) (some? preview) [#{(path.segment/get-point preview)} points]
(some? moving-handler) [#{moving-handler} points]
:else
[(->> selected-points (map base->point) (into #{}))
(->> points (remove selected-points) (into #{}))])]
[:g.path-snap {:pointer-events "none"}
[:> path-snap* {:selected snap-selected
:points snap-points
:zoom zoom}]]))]))