0
Fork 0
mirror of https://github.com/penpot/penpot.git synced 2025-02-13 10:38:13 -05:00

🐛 Fix path drawing inconsistencies

This commit is contained in:
Aitor 2024-02-27 16:50:47 +01:00 committed by Andrey Antukh
parent 74d2273d24
commit c123cf6e98
15 changed files with 106 additions and 78 deletions

View file

@ -38,8 +38,7 @@
(watch [_ _ stream]
(rx/merge
(when (= tool :path)
(rx/of (start-drawing :path)
(dwc/hide-toolbar)))
(rx/of (start-drawing :path)))
(when (= tool :curve)
(let [stopper (rx/filter dwc/interrupt? stream)]

View file

@ -7,8 +7,7 @@
(ns app.main.data.workspace.edition
(:require
[app.common.data.macros :as dm]
[app.common.types.shape.layout :as ctl]
[app.main.data.workspace.common :as dwc]
[app.main.data.workspace.path.common :as dwpc]
[app.main.data.workspace.state-helpers :as wsh]
[beicon.v2.core :as rx]
[potok.v2.core :as ptk]))
@ -33,25 +32,27 @@
state)))
ptk/WatchEvent
(watch [_ state stream]
(let [objects (wsh/lookup-page-objects state)]
(rx/concat
(if (ctl/grid-layout? objects id)
(rx/of (dwc/hide-toolbar))
(rx/empty))
(->> stream
(rx/filter interrupt?)
(rx/take 1)
(rx/map (constantly clear-edition-mode))))))))
(watch [_ _ stream]
(->> stream
(rx/filter interrupt?)
(rx/take 1)
(rx/map clear-edition-mode)))))
;; If these event change modules review /src/app/main/data/workspace/path/undo.cljs
(def clear-edition-mode
(defn clear-edition-mode
[]
(ptk/reify ::clear-edition-mode
ptk/UpdateEvent
(update [_ state]
(-> state
(update :workspace-local dissoc :edition)
(update :workspace-drawing dissoc :tool :object :lock)
(dissoc :workspace-grid-edition)))
ptk/WatchEvent
(watch [_ state _]
(let [id (get-in state [:workspace-local :edition])]
(-> state
(update :workspace-local dissoc :edition)
(dissoc :workspace-grid-edition)
(assoc-in [:workspace-local :hide-toolbar] false)
(cond-> (some? id) (update-in [:workspace-local :edit-path] dissoc id)))))))
(rx/concat
(when (some? id)
(dwpc/finish-path)))))))

View file

@ -16,7 +16,6 @@
[app.common.types.shape-tree :as ctst]
[app.common.types.shape.layout :as ctl]
[app.main.data.workspace.changes :as dch]
[app.main.data.workspace.common :as dwc]
[app.main.data.workspace.drawing.common :as dwdc]
[app.main.data.workspace.edition :as dwe]
[app.main.data.workspace.path.changes :as changes]
@ -166,16 +165,16 @@
(ptk/reify ::start-path-from-point
ptk/WatchEvent
(watch [_ state stream]
(let [stoper (rx/merge
(->> stream
(rx/filter mse/mouse-event?)
(rx/filter mse/mouse-up-event?))
(->> stream
(rx/filter helpers/end-path-event?)))
(let [stopper (rx/merge
(->> stream
(rx/filter mse/mouse-event?)
(rx/filter mse/mouse-up-event?))
(->> stream
(rx/filter helpers/end-path-event?)))
drag-events (->> (streams/position-stream state)
(rx/map #(drag-handler %))
(rx/take-until stoper))]
(rx/take-until stopper))]
(rx/concat
(rx/of (add-node position))
(streams/drag-stream
@ -197,16 +196,16 @@
"should be a pointer"
(gpt/point? down-event))
(let [stoper (rx/merge
(->> stream
(rx/filter mse/mouse-event?)
(rx/filter mse/mouse-up-event?))
(->> stream
(rx/filter helpers/end-path-event?)))
(let [stopper (rx/merge
(->> stream
(rx/filter mse/mouse-event?)
(rx/filter mse/mouse-up-event?))
(->> stream
(rx/filter helpers/end-path-event?)))
drag-events (->> (streams/position-stream state)
(rx/map #(drag-handler %))
(rx/take-until stoper))]
(rx/take-until stopper))]
(rx/concat
(rx/of (add-node down-event))
(streams/drag-stream
@ -307,10 +306,8 @@
(ptk/reify ::handle-new-shape
ptk/UpdateEvent
(update [_ state]
(let [id (st/get-path-id state)
shape (cts/setup-shape {:type :path})]
(let [shape (cts/setup-shape {:type :path})]
(-> state
(assoc-in [:workspace-local :edit-path id :snap-toggled] false)
(update :workspace-drawing assoc :object shape))))
ptk/WatchEvent
@ -357,13 +354,14 @@
(let [id (st/get-path-id state)
content (st/get-path state :content)
old-content (get-in state [:workspace-local :edit-path id :old-content])
mode (get-in state [:workspace-local :edit-path id :edit-mode])]
mode (get-in state [:workspace-local :edit-path id :edit-mode])
empty-content? (empty? content)]
(cond
(not= content old-content) (rx/of (changes/save-path-content)
(start-draw-mode))
(and (not= content old-content) (not empty-content?)) (rx/of (changes/save-path-content))
(= mode :draw) (rx/of :interrupt)
:else (rx/of (common/finish-path)))))))
:else (rx/of
(common/finish-path)
(dwdc/clear-drawing)))))))
(defn change-edit-mode [mode]
(ptk/reify ::change-edit-mode
@ -378,8 +376,7 @@
(let [id (st/get-path-id state)]
(cond
(and id (= :move mode)) (rx/of (common/finish-path))
(and id (= :draw mode)) (rx/of (dwc/hide-toolbar)
(start-draw-mode))
(and id (= :draw mode)) (rx/of (start-draw-mode))
:else (rx/empty))))))
(defn reset-last-handler

View file

@ -15,7 +15,6 @@
[app.common.svg.path.shapes-to-path :as upsp]
[app.common.svg.path.subpath :as ups]
[app.main.data.workspace.changes :as dch]
[app.main.data.workspace.common :as dwc]
[app.main.data.workspace.edition :as dwe]
[app.main.data.workspace.path.changes :as changes]
[app.main.data.workspace.path.drawing :as drawing]
@ -68,7 +67,7 @@
(let [changes (changes/generate-path-changes it objects page-id shape (:content shape) new-content)]
(if (empty? new-content)
(rx/of (dch/commit-changes changes)
dwe/clear-edition-mode)
(dwe/clear-edition-mode))
(rx/of (dch/commit-changes changes)
(selection/update-selection point-change)
(fn [state] (update-in state [:workspace-local :edit-path id] dissoc :content-modifiers :moving-nodes :moving-handler))))))))))
@ -319,8 +318,7 @@
(= (ptk/type %) ::start-path-edit))))
interrupt (->> stream (rx/filter #(= % :interrupt)) (rx/take 1))]
(rx/concat
(rx/of (dwc/hide-toolbar)
(undo/start-path-undo)
(rx/of (undo/start-path-undo)
(drawing/change-edit-mode mode))
(->> interrupt
(rx/map #(stop-path-edit id))

View file

@ -8,7 +8,6 @@
(:require
[app.main.data.shortcuts :as ds]
[app.main.data.workspace :as dw]
[app.main.data.workspace.common :as dwc]
[app.main.data.workspace.path :as drp]
[app.main.store :as st]
[beicon.v2.core :as rx]
@ -24,16 +23,12 @@
(ptk/reify ::esc-pressed
ptk/WatchEvent
(watch [_ state _]
;; Not interrupt when we're editing a path
;; Not interrupt when we're editing a path
(let [edition-id (or (get-in state [:workspace-drawing :object :id])
(get-in state [:workspace-local :edition]))
content (get-in state [:workspace-drawing :object :content])
path-edit-mode (get-in state [:workspace-local :edit-path edition-id :edit-mode])]
(if-not (= :draw path-edit-mode)
(rx/of :interrupt)
(if (<= (count content) 1)
(rx/of (dwc/show-toolbar))
(rx/empty)))))))
(when-not (= :draw path-edit-mode)
(rx/of :interrupt))))))
(def shortcuts
{:move-nodes {:tooltip "M"

View file

@ -40,7 +40,7 @@
(rx/of (dch/update-shapes [id] upsp/convert-to-path))
(rx/of (dch/commit-changes changes)
(when (empty? new-content)
dwe/clear-edition-mode))))))))))
(dwe/clear-edition-mode)))))))))))
(defn make-corner
([]

View file

@ -196,8 +196,45 @@
(def context-menu
(l/derived :context-menu workspace-local))
(def toolbar-visibility
(l/derived :hide-toolbar workspace-local))
(defn path-editing?
"Returns true if we're editing a path or creating a new one."
[state]
(let [selected (dm/get-in state [:workspace-local :selected])
edition (dm/get-in state [:workspace-local :edition])
edit-path? (dm/get-in state [:workspace-local :edit-path edition])
drawing (dm/get-in state [:workspace-drawing])
drawing-obj (:object drawing)
shape (or drawing-obj (-> selected first))
shape-id (:id shape)
single? (= (count selected) 1)
editing? (and (some? shape-id) (some? edition) (= shape-id edition))
;; we need to check if we're drawing a new object
;; but we're not using the pencil tool.
draw-path? (and (some? drawing-obj)
(cph/path-shape? drawing-obj)
(not= :curve (:tool drawing)))
path-edition? (or (and single? editing?
(and (not (cph/text-shape? shape))
(not (cph/frame-shape? shape))))
draw-path?
edit-path?)]
path-edition?))
(def toolbar-hidden
(l/derived
(fn [state]
(let [visibility (dm/get-in state [:workspace-local :hide-toolbar])
editing? (path-editing? state)
hidden? (if editing? true visibility)]
hidden?))
st/state))
;; page item that it is being edited
(def editing-page-item

View file

@ -171,7 +171,7 @@
(mf/use-fn
(fn []
(st/emit! :interrupt
dw/clear-edition-mode)
(dw/clear-edition-mode))
;; Delay so anything that launched :interrupt can finish
(ts/schedule 100 #(st/emit! (dw/select-for-drawing :comments)))))

View file

@ -122,8 +122,7 @@
(fn [event]
(dom/stop-propagation event)
(when (kbd/esc? event)
(st/emit! :interrupt)
(st/emit! dw/clear-edition-mode)))
(st/emit! :interrupt (dw/clear-edition-mode))))
on-mount
(fn []

View file

@ -1279,7 +1279,7 @@
[:button {:on-click open-grid-help
:class (stl/css :help-button)} i/help-refactor]
[:button {:class (stl/css :exit-btn)
:on-click #(st/emit! udw/clear-edition-mode)}
:on-click #(st/emit! (udw/clear-edition-mode))}
(tr "workspace.layout_grid.editor.options.exit")]]
[:div {:class (stl/css :row :first-row)}

View file

@ -33,7 +33,7 @@
on-click
(mf/use-fn
(fn []
(st/emit! :interrupt dw/clear-edition-mode)
(st/emit! :interrupt (dw/clear-edition-mode))
(dom/click (mf/ref-val ref))))
on-selected
@ -73,7 +73,7 @@
read-only? (mf/use-ctx ctx/workspace-read-only?)
rulers? (mf/deref refs/rulers?)
hide-toolbar? (mf/deref refs/toolbar-visibility)
hide-toolbar? (mf/deref refs/toolbar-hidden)
interrupt
(mf/use-fn #(st/emit! :interrupt))
@ -84,8 +84,7 @@
(let [tool (-> (dom/get-current-target event)
(dom/get-data "tool")
(keyword))]
(st/emit! :interrupt
dw/clear-edition-mode)
(st/emit! :interrupt (dw/clear-edition-mode))
;; Delay so anything that launched :interrupt can finish
(ts/schedule 100 #(st/emit! (dw/select-for-drawing tool))))))

View file

@ -90,7 +90,7 @@
::dwsp/interrupt)
(when (and (not= edition id) (or text-editing? grid-editing?))
(st/emit! dw/clear-edition-mode))
(st/emit! (dw/clear-edition-mode)))
(when (and (not text-editing?)
(not blocked)

View file

@ -8,6 +8,7 @@
"Drawing components."
(:require
[app.common.math :as mth]
[app.common.types.shape :as cts]
[app.main.ui.shapes.path :refer [path-shape]]
[app.main.ui.workspace.shapes :as shapes]
[app.main.ui.workspace.shapes.path.editor :refer [path-editor]]
@ -19,14 +20,16 @@
(mf/defc draw-area
[{:keys [shape zoom tool] :as props}]
[:g.draw-area
[:g {:style {:pointer-events "none"}}
[:& shapes/shape-wrapper {:shape shape}]]
;; Prevent rendering something that it's not a shape.
(when (cts/shape? shape)
[:g.draw-area
[:g {:style {:pointer-events "none"}}
[:& shapes/shape-wrapper {:shape shape}]]
(case tool
:path [:& path-editor {:shape shape :zoom zoom}]
:curve [:& path-shape {:shape shape :zoom zoom}]
#_:default [:& generic-draw-area {:shape shape :zoom zoom}])])
(case tool
:path [:& path-editor {:shape shape :zoom zoom}]
:curve [:& path-shape {:shape shape :zoom zoom}]
#_:default [:& generic-draw-area {:shape shape :zoom zoom}])]))
(mf/defc generic-draw-area
[{:keys [shape zoom]}]

View file

@ -61,7 +61,7 @@
:on-click #(st/emit! (dwge/locate-board (:id shape)))}
(tr "workspace.layout_grid.editor.top-bar.locate")]
[:button {:class (stl/css :done-btn)
:on-click #(st/emit! dw/clear-edition-mode)}
:on-click #(st/emit! (dw/clear-edition-mode))}
(tr "workspace.layout_grid.editor.top-bar.done")]]])
(mf/defc grid-editor-frame

View file

@ -69,7 +69,7 @@
[:& view-only-actions]
path-edition?
[:div.viewport-actions
[:div {:class (stl/css :viewport-actions)}
[:& path-actions {:shape shape}]]
grid-edition?