diff --git a/CHANGES.md b/CHANGES.md index 9d4f1422d..d8f2b61f6 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,5 +1,11 @@ # CHANGELOG +## 1.12.3-beta + +### :bug: Bugs fixed + +- Fix issue with shift+select to deselect shapes [Taiga #3154](https://tree.taiga.io/project/penpot/issue/3154) + ## 1.12.2-beta ### :bug: Bugs fixed diff --git a/common/src/app/common/data.cljc b/common/src/app/common/data.cljc index 69e30c6a5..953dd31ba 100644 --- a/common/src/app/common/data.cljc +++ b/common/src/app/common/data.cljc @@ -693,3 +693,13 @@ acc))) acc)))))) +(defn toggle-selection + ([set value] + (toggle-selection set value false)) + + ([set value toggle?] + (if-not toggle? + (conj (ordered-set) value) + (if (contains? set value) + (disj set value) + (conj set value))))) diff --git a/frontend/src/app/main/data/workspace/selection.cljs b/frontend/src/app/main/data/workspace/selection.cljs index 08ec41784..08f2985e5 100644 --- a/frontend/src/app/main/data/workspace/selection.cljs +++ b/frontend/src/app/main/data/workspace/selection.cljs @@ -117,13 +117,7 @@ (ptk/reify ::select-shape ptk/UpdateEvent (update [_ state] - (update-in state [:workspace-local :selected] - (fn [selected] - (if-not toggle? - (conj (d/ordered-set) id) - (if (contains? selected id) - (disj selected id) - (conj selected id)))))) + (update-in state [:workspace-local :selected] d/toggle-selection id toggle?)) ptk/WatchEvent (watch [_ state _] diff --git a/frontend/src/app/main/data/workspace/transforms.cljs b/frontend/src/app/main/data/workspace/transforms.cljs index ddc4f5686..8f5d3cc85 100644 --- a/frontend/src/app/main/data/workspace/transforms.cljs +++ b/frontend/src/app/main/data/workspace/transforms.cljs @@ -484,30 +484,44 @@ (defn start-move-selected "Enter mouse move mode, until mouse button is released." - [] - (ptk/reify ::start-move-selected - ptk/WatchEvent - (watch [_ state stream] - (let [initial (deref ms/mouse-position) - selected (wsh/lookup-selected state {:omit-blocked? true}) - stopper (rx/filter ms/mouse-up? stream)] - (when-not (empty? selected) - (->> ms/mouse-position - (rx/map #(gpt/to-vec initial %)) - (rx/map #(gpt/length %)) - (rx/filter #(> % 1)) - (rx/take 1) - (rx/with-latest vector ms/mouse-position-alt) - (rx/mapcat - (fn [[_ alt?]] - (if alt? - ;; When alt is down we start a duplicate+move - (rx/of (start-move-duplicate initial) - (dws/duplicate-selected false)) - ;; Otherwise just plain old move - (rx/of (start-move initial selected))))) - (rx/take-until stopper))))))) + ([] + (start-move-selected nil false)) + ([id shift?] + (ptk/reify ::start-move-selected + ptk/WatchEvent + (watch [_ state stream] + (let [initial (deref ms/mouse-position) + + ;; We toggle the selection so we don't have to wait for the event + selected + (cond-> (wsh/lookup-selected state {:omit-blocked? true}) + (some? id) + (d/toggle-selection id shift?)) + + stopper (rx/filter ms/mouse-up? stream)] + (when (or (d/not-empty? selected) (some? id)) + (->> ms/mouse-position + (rx/map #(gpt/to-vec initial %)) + (rx/map #(gpt/length %)) + (rx/filter #(> % 1)) + (rx/take 1) + (rx/with-latest vector ms/mouse-position-alt) + (rx/mapcat + (fn [[_ alt?]] + (rx/concat + (if (some? id) + (rx/of (dws/select-shape id shift?)) + (rx/empty)) + + (if alt? + ;; When alt is down we start a duplicate+move + (rx/of (start-move-duplicate initial) + (dws/duplicate-selected false)) + + ;; Otherwise just plain old move + (rx/of (start-move initial selected)))))) + (rx/take-until stopper)))))))) (defn- start-move-duplicate [from-position] diff --git a/frontend/src/app/main/ui/workspace/viewport/actions.cljs b/frontend/src/app/main/ui/workspace/viewport/actions.cljs index cc2a2c5b4..bb273a51a 100644 --- a/frontend/src/app/main/ui/workspace/viewport/actions.cljs +++ b/frontend/src/app/main/ui/workspace/viewport/actions.cljs @@ -94,9 +94,7 @@ (st/emit! (dw/handle-area-selection shift? ctrl?)) (not drawing-tool) - (st/emit! (when (or shift? (not selected?)) - (dw/select-shape id shift?)) - (dw/start-move-selected))))))))))) + (st/emit! (dw/start-move-selected id shift?))))))))))) (defn on-move-selected [hover hover-ids selected space?] @@ -153,16 +151,13 @@ (let [ctrl? (kbd/ctrl? event) shift? (kbd/shift? event) alt? (kbd/alt? event) - hovering? (some? @hover) - frame? (= :frame (:type @hover)) - selected? (contains? selected (:id @hover))] + frame? (= :frame (:type @hover))] (st/emit! (ms/->MouseEvent :click ctrl? shift? alt?)) (when (and hovering? (or (not frame?) ctrl?) (not @space?) - (not selected?) (not edition) (not drawing-path?) (not drawing-tool))