From 723916d93082112add1fec72082ee85fbb6be835 Mon Sep 17 00:00:00 2001 From: eva Date: Tue, 23 Nov 2021 17:45:59 +0100 Subject: [PATCH] :sparkles: Allow ungroup groups in bulk and unmask mask in group --- CHANGES.md | 3 +- .../src/app/main/data/workspace/groups.cljs | 79 ++++++++++--------- .../app/main/ui/workspace/context_menu.cljs | 53 +++++++------ 3 files changed, 73 insertions(+), 62 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index f751de8d5..40ae5df6a 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -33,6 +33,7 @@ ### :sparkles: New features +- Allow ungroup groups in bulk [Taiga #2211](https://tree.taiga.io/project/penpot/us/2211). - Enhance corner radius behavior [Taiga #2190](https://tree.taiga.io/project/penpot/issue/2190). - Allow preserve scroll position in interactions [Taiga #2250](https://tree.taiga.io/project/penpot/us/2250). - Add new onboarding modals. @@ -361,7 +362,7 @@ - Transform shapes to path on double click - Translate automatic names of new files and projects. - Use shift instead of ctrl/cmd to keep aspect ratio [Taiga 1697](https://tree.taiga.io/project/penpot/issue/1697). -- New translations: Portuguese (Brazil) and Romanias. +- New translations: Portuguese (Brazil) and Romanias. ### :bug: Bugs fixed diff --git a/frontend/src/app/main/data/workspace/groups.cljs b/frontend/src/app/main/data/workspace/groups.cljs index d192340fd..b973e6c34 100644 --- a/frontend/src/app/main/data/workspace/groups.cljs +++ b/frontend/src/app/main/data/workspace/groups.cljs @@ -166,6 +166,28 @@ :index index-in-parent}]] [rchanges uchanges])) +(defn prepare-remove-mask + [page-id mask] + (let [rchanges [{:type :mod-obj + :page-id page-id + :id (:id mask) + :operations [{:type :set + :attr :masked-group? + :val nil}]} + {:type :reg-objects + :page-id page-id + :shapes [(:id mask)]}] + uchanges [{:type :mod-obj + :page-id page-id + :id (:id mask) + :operations [{:type :set + :attr :masked-group? + :val (:masked-group? mask)}]} + {:type :reg-objects + :page-id page-id + :shapes [(:id mask)]}]] + [rchanges uchanges])) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; GROUPS @@ -194,16 +216,15 @@ (watch [it state _] (let [page-id (:current-page-id state) objects (wsh/lookup-page-objects state page-id) - selected (wsh/lookup-selected state) - group-id (first selected) - group (get objects group-id)] - (when (and (= 1 (count selected)) - (contains? #{:group :bool} (:type group))) - (let [[rchanges uchanges] - (prepare-remove-group page-id group objects)] - (rx/of (dch/commit-changes {:redo-changes rchanges - :undo-changes uchanges - :origin it})))))))) + changes-in-bulk (->> (wsh/lookup-selected state) + (map #(get objects %)) + (filter #(or (= :bool (:type %)) (= :group (:type %)))) + (map #(prepare-remove-group page-id % objects))) + rchanges-in-bulk (into [] (mapcat first) changes-in-bulk) + uchanges-in-bulk (into [] (mapcat second) changes-in-bulk)] + (rx/of (dch/commit-changes {:redo-changes rchanges-in-bulk + :undo-changes uchanges-in-bulk + :origin it})))))) (def mask-group (ptk/reify ::mask-group @@ -268,33 +289,15 @@ (watch [it state _] (let [page-id (:current-page-id state) objects (wsh/lookup-page-objects state page-id) - selected (wsh/lookup-selected state)] - (when (= (count selected) 1) - (let [group (get objects (first selected)) - - rchanges [{:type :mod-obj - :page-id page-id - :id (:id group) - :operations [{:type :set - :attr :masked-group? - :val nil}]} - {:type :reg-objects - :page-id page-id - :shapes [(:id group)]}] - - uchanges [{:type :mod-obj - :page-id page-id - :id (:id group) - :operations [{:type :set - :attr :masked-group? - :val (:masked-group? group)}]} - {:type :reg-objects - :page-id page-id - :shapes [(:id group)]}]] - - (rx/of (dch/commit-changes {:redo-changes rchanges - :undo-changes uchanges - :origin it}) - (dwc/select-shapes (d/ordered-set (:id group)))))))))) + changes-in-bulk (->> (wsh/lookup-selected state) + (map #(get objects %)) + (filter #(or (= :bool (:type %)) (= :group (:type %)))) + (map #(prepare-remove-mask page-id %))) + rchanges-in-bulk (into [] (mapcat first) changes-in-bulk) + uchanges-in-bulk (into [] (mapcat second) changes-in-bulk)] + (rx/of (dch/commit-changes {:redo-changes rchanges-in-bulk + :undo-changes uchanges-in-bulk + :origin it})))))) + \ No newline at end of file diff --git a/frontend/src/app/main/ui/workspace/context_menu.cljs b/frontend/src/app/main/ui/workspace/context_menu.cljs index abe4ed606..31f6689b0 100644 --- a/frontend/src/app/main/ui/workspace/context_menu.cljs +++ b/frontend/src/app/main/ui/workspace/context_menu.cljs @@ -98,8 +98,13 @@ is-bool? (and (some? shape) (= :bool type)) options (mf/deref refs/workspace-page-options) + selected-objects (mf/deref refs/selected-objects) flows (:flows options) + has-group? (some #(= :group (:type %)) selected-objects) + has-bool? (some #(= :bool (:type %)) selected-objects) + has-mask-group? (some #(:masked-group? %) selected-objects) + options-mode (mf/deref refs/options-mode) set-bool @@ -196,6 +201,13 @@ :shortcut (sc/get-tooltip :bring-back) :on-click do-send-to-back}] [:& menu-separator] + [:& menu-entry {:title (tr "workspace.shape.menu.flip-vertical") + :shortcut (sc/get-tooltip :flip-vertical) + :on-click do-flip-vertical}] + [:& menu-entry {:title (tr "workspace.shape.menu.flip-horizontal") + :shortcut (sc/get-tooltip :flip-horizontal) + :on-click do-flip-horizontal}] + [:& menu-separator] (when multiple? [:* @@ -204,31 +216,26 @@ :on-click do-create-group}] [:& menu-entry {:title (tr "workspace.shape.menu.mask") :shortcut (sc/get-tooltip :mask) - :on-click do-mask-group}] - [:& menu-separator]]) + :on-click do-mask-group}]]) - (when (or single? multiple?) - [:* - [:& menu-entry {:title (tr "workspace.shape.menu.flip-vertical") - :shortcut (sc/get-tooltip :flip-vertical) - :on-click do-flip-vertical}] - [:& menu-entry {:title (tr "workspace.shape.menu.flip-horizontal") - :shortcut (sc/get-tooltip :flip-horizontal) - :on-click do-flip-horizontal}] - [:& menu-separator]]) + (when (and single? (and (not has-mask-group?) (or has-bool? has-group?))) + [:& menu-entry {:title (tr "workspace.shape.menu.mask") + :shortcut (sc/get-tooltip :mask) + :on-click do-mask-group}]) - (when (and single? (or is-bool? is-group?)) - [:* - [:& menu-entry {:title (tr "workspace.shape.menu.ungroup") - :shortcut (sc/get-tooltip :ungroup) - :on-click do-remove-group}] - (if (:masked-group? shape) - [:& menu-entry {:title (tr "workspace.shape.menu.unmask") - :shortcut (sc/get-tooltip :unmask) - :on-click do-unmask-group}] - [:& menu-entry {:title (tr "workspace.shape.menu.mask") - :shortcut (sc/get-tooltip :group) - :on-click do-mask-group}])]) + (when (or has-bool? has-group?) + [:& menu-entry {:title (tr "workspace.shape.menu.ungroup") + :shortcut (sc/get-tooltip :ungroup) + :on-click do-remove-group}]) + + (when has-mask-group? + [:& menu-entry {:title (tr "workspace.shape.menu.unmask") + :shortcut (sc/get-tooltip :unmask) + :on-click do-unmask-group}] + ) + + (when (or multiple? has-mask-group? (or is-bool? has-group?) (and single? (or has-bool? has-group?)) ) + [:& menu-separator]) (when (and single? editable-shape?) [:& menu-entry {:title (tr "workspace.shape.menu.edit")