diff --git a/CHANGES.md b/CHANGES.md index 108078dca..bcfe10084 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -22,6 +22,7 @@ - Add update components in bulk option in context menu [Taiga #1975](https://tree.taiga.io/project/penpot/us/1975) - Create first E2E tests [Taiga #2608](https://tree.taiga.io/project/penpot/task/2608), [Taiga #2608](https://tree.taiga.io/project/penpot/task/2608) - Redesign of workspace toolbars [Taiga #2319](https://tree.taiga.io/project/penpot/us/2319) +- Graphic Tablet usability improvements [Taiga #1913](https://tree.taiga.io/project/penpot/us/1913) ### :bug: Bugs fixed diff --git a/frontend/src/app/main/data/workspace/drawing.cljs b/frontend/src/app/main/data/workspace/drawing.cljs index 522d0150a..c333a7a29 100644 --- a/frontend/src/app/main/data/workspace/drawing.cljs +++ b/frontend/src/app/main/data/workspace/drawing.cljs @@ -45,11 +45,11 @@ (when (= tool :curve) (let [stopper (->> stream (rx/filter dwc/interrupt?))] (->> stream - (rx/take-until stopper) (rx/filter (ptk/type? ::common/handle-finish-drawing)) (rx/take 1) (rx/observe-on :async) - (rx/map #(select-for-drawing tool data))))) + (rx/map #(select-for-drawing tool data)) + (rx/take-until stopper)))) ;; NOTE: comments are a special case and they manage they ;; own interrupt cycle.q diff --git a/frontend/src/app/main/data/workspace/selection.cljs b/frontend/src/app/main/data/workspace/selection.cljs index 264874a94..916103b03 100644 --- a/frontend/src/app/main/data/workspace/selection.cljs +++ b/frontend/src/app/main/data/workspace/selection.cljs @@ -9,7 +9,6 @@ [app.common.data :as d] [app.common.geom.point :as gpt] [app.common.geom.shapes :as geom] - [app.common.math :as mth] [app.common.pages :as cp] [app.common.spec :as us] [app.common.spec.interactions :as cti] @@ -48,52 +47,57 @@ (defn handle-area-selection [preserve? ignore-groups?] - (letfn [(data->selrect [data] - (let [start (:start data) - stop (:stop data) - start-x (min (:x start) (:x stop)) - start-y (min (:y start) (:y stop)) - end-x (max (:x start) (:x stop)) - end-y (max (:y start) (:y stop))] - {:type :rect - :x start-x - :y start-y - :width (mth/abs (- end-x start-x)) - :height (mth/abs (- end-y start-y))}))] - (ptk/reify ::handle-area-selection - ptk/WatchEvent - (watch [_ state stream] - (let [zoom (get-in state [:workspace-local :zoom] 1) - stop? (fn [event] (or (dwc/interrupt? event) (ms/mouse-up? event))) - stoper (->> stream (rx/filter stop?)) + (ptk/reify ::handle-area-selection + ptk/WatchEvent + (watch [_ state stream] + (let [zoom (get-in state [:workspace-local :zoom] 1) + stop? (fn [event] (or (dwc/interrupt? event) (ms/mouse-up? event))) + stoper (->> stream (rx/filter stop?)) - calculate-selrect - (fn [data pos] - (if data - (assoc data :stop pos) - {:start pos :stop pos})) + init-selrect + {:type :rect + :x (:x @ms/mouse-position) + :y (:y @ms/mouse-position) + :width 0 + :height 0} - selrect-stream - (->> ms/mouse-position - (rx/scan calculate-selrect nil) - (rx/map data->selrect) - (rx/filter #(or (> (:width %) (/ 10 zoom)) - (> (:height %) (/ 10 zoom)))) - (rx/take-until stoper))] - (rx/concat - (if preserve? - (rx/empty) - (rx/of (deselect-all))) + calculate-selrect + (fn [selrect [delta space?]] + (if space? + (-> selrect + (update :x + (:x delta)) + (update :y + (:y delta))) - (rx/merge - (->> selrect-stream (rx/map update-selrect)) - (->> selrect-stream - (rx/buffer-time 100) - (rx/map #(last %)) - (rx/dedupe) - (rx/map #(select-shapes-by-current-selrect preserve? ignore-groups?)))) + (-> selrect + (update :width + (:x delta)) + (update :height + (:y delta))))) - (rx/of (update-selrect nil)))))))) + selrect-stream + (->> ms/mouse-position + (rx/buffer 2 1) + (rx/map (fn [[from to]] (when (and from to) (gpt/to-vec from to)))) + (rx/filter some?) + (rx/with-latest-from ms/keyboard-space) + (rx/scan calculate-selrect init-selrect) + (rx/filter #(or (> (:width %) (/ 10 zoom)) + (> (:height %) (/ 10 zoom)))) + (rx/take-until stoper))] + (rx/concat + (if preserve? + (rx/empty) + (rx/of (deselect-all))) + + (rx/merge + (->> selrect-stream + (rx/map update-selrect)) + + (->> selrect-stream + (rx/buffer-time 100) + (rx/map #(last %)) + (rx/dedupe) + (rx/map #(select-shapes-by-current-selrect preserve? ignore-groups?)))) + + (rx/of (update-selrect nil))))))) ;; --- Toggle shape's selection status (selected or deselected)