From b5be938480663d10b485b69b49af29aaf8db5bc7 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Mon, 6 Mar 2023 17:45:01 +0100 Subject: [PATCH] :bug: Improve behavior for undo on text edition --- CHANGES.md | 1 + .../src/app/common/pages/changes_builder.cljc | 4 +++ .../src/app/main/data/workspace/changes.cljs | 13 +++---- .../app/main/data/workspace/modifiers.cljs | 3 +- .../app/main/data/workspace/shape_layout.cljs | 3 +- .../src/app/main/data/workspace/texts.cljs | 6 ++-- .../src/app/main/data/workspace/undo.cljs | 34 ++++++++++++------- 7 files changed, 41 insertions(+), 23 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 3a6c4d33d..b46412d2e 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -20,6 +20,7 @@ - Fix selecting children from hidden parent layers [Taiga #4934](https://tree.taiga.io/project/penpot/issue/4934) - Fix problem when undoing multiple selected colors [Taiga #4920](https://tree.taiga.io/project/penpot/issue/4920) - Allow selection of empty board by partial rect [Taiga #4806](https://tree.taiga.io/project/penpot/issue/4806) +- Improve behavior for undo on text edition [Taiga #4693](https://tree.taiga.io/project/penpot/issue/4693) ### :arrow_up: Deps updates diff --git a/common/src/app/common/pages/changes_builder.cljc b/common/src/app/common/pages/changes_builder.cljc index b45ab53f1..919c9e90c 100644 --- a/common/src/app/common/pages/changes_builder.cljc +++ b/common/src/app/common/pages/changes_builder.cljc @@ -35,6 +35,10 @@ [changes save-undo?] (assoc changes :save-undo? save-undo?)) +(defn set-stack-undo? + [changes stack-undo?] + (assoc changes :stack-undo? stack-undo?)) + (defn with-page [changes page] (vary-meta changes assoc diff --git a/frontend/src/app/main/data/workspace/changes.cljs b/frontend/src/app/main/data/workspace/changes.cljs index 6623b0821..43a520b27 100644 --- a/frontend/src/app/main/data/workspace/changes.cljs +++ b/frontend/src/app/main/data/workspace/changes.cljs @@ -55,9 +55,8 @@ (defn update-shapes ([ids update-fn] (update-shapes ids update-fn nil)) - ([ids update-fn {:keys [reg-objects? save-undo? attrs ignore-tree page-id] - :or {reg-objects? false save-undo? true}}] - + ([ids update-fn {:keys [reg-objects? save-undo? stack-undo? attrs ignore-tree page-id] + :or {reg-objects? false save-undo? true stack-undo? false}}] (us/assert ::coll-of-uuid ids) (us/assert fn? update-fn) @@ -80,6 +79,7 @@ (pcb/update-shapes changes [id] update-fn opts))) (-> (pcb/empty-changes it page-id) (pcb/set-save-undo? save-undo?) + (pcb/set-stack-undo? stack-undo?) (pcb/with-objects objects)) ids) changes (add-group-id changes state)] @@ -165,8 +165,8 @@ (defn commit-changes [{:keys [redo-changes undo-changes - origin save-undo? file-id group-id] - :or {save-undo? true}}] + origin save-undo? file-id group-id stack-undo?] + :or {save-undo? true stack-undo? false}}] (log/debug :msg "commit-changes" :js/redo-changes redo-changes :js/undo-changes undo-changes) @@ -183,6 +183,7 @@ :page-id page-id :frames frames :save-undo? save-undo? + :stack-undo? stack-undo? :group-id group-id}) ptk/UpdateEvent @@ -233,4 +234,4 @@ (let [entry {:undo-changes undo-changes :redo-changes redo-changes :group-id group-id}] - (rx/of (dwu/append-undo entry))))))))))) + (rx/of (dwu/append-undo entry stack-undo?))))))))))) diff --git a/frontend/src/app/main/data/workspace/modifiers.cljs b/frontend/src/app/main/data/workspace/modifiers.cljs index e73441f6c..9662800ba 100644 --- a/frontend/src/app/main/data/workspace/modifiers.cljs +++ b/frontend/src/app/main/data/workspace/modifiers.cljs @@ -374,7 +374,7 @@ ([] (apply-modifiers nil)) - ([{:keys [undo-transation? modifiers] :or {undo-transation? true}}] + ([{:keys [modifiers undo-transation? stack-undo?] :or {undo-transation? true stack-undo? false}}] (ptk/reify ::apply-modifiers ptk/WatchEvent (watch [_ state _] @@ -412,6 +412,7 @@ (cond-> text-shape? (update-grow-type shape))))) {:reg-objects? true + :stack-undo? stack-undo? :ignore-tree ignore-tree ;; Attributes that can change in the transform. This way we don't have to check ;; all the attributes diff --git a/frontend/src/app/main/data/workspace/shape_layout.cljs b/frontend/src/app/main/data/workspace/shape_layout.cljs index 026b72144..3ca9f11ce 100644 --- a/frontend/src/app/main/data/workspace/shape_layout.cljs +++ b/frontend/src/app/main/data/workspace/shape_layout.cljs @@ -202,7 +202,8 @@ ids (->> ids (filter #(contains? objects %)))] (if (d/not-empty? ids) (let [modif-tree (dwm/create-modif-tree ids (ctm/reflow-modifiers))] - (rx/of (dwm/apply-modifiers {:modifiers modif-tree}))) + (rx/of (dwm/apply-modifiers {:modifiers modif-tree + :stack-undo? true}))) (rx/empty)))))) (defn initialize diff --git a/frontend/src/app/main/data/workspace/texts.cljs b/frontend/src/app/main/data/workspace/texts.cljs index dd3d79cb0..12abce5d6 100644 --- a/frontend/src/app/main/data/workspace/texts.cljs +++ b/frontend/src/app/main/data/workspace/texts.cljs @@ -414,7 +414,7 @@ (let [ids (->> (keys props) (filter changed-text?))] (rx/of (dwu/start-undo-transaction undo-id) - (dch/update-shapes ids update-fn {:reg-objects? true :save-undo? true}) + (dch/update-shapes ids update-fn {:reg-objects? true :stack-undo? true}) (ptk/data-event :layout/update ids) (dwu/commit-undo-transaction undo-id)))))))) @@ -539,7 +539,7 @@ ptk/WatchEvent (watch [_ _ _] - (rx/of (dwm/apply-modifiers))))) + (rx/of (dwm/apply-modifiers {:stack-undo? true}))))) (defn commit-position-data [] @@ -558,7 +558,7 @@ (fn [shape] (-> shape (assoc :position-data (get position-data (:id shape))))) - {:save-undo? false :reg-objects? false})) + {:stack-undo? true :reg-objects? false})) (rx/of (fn [state] (dissoc state ::update-position-data-debounce ::update-position-data)))))))) diff --git a/frontend/src/app/main/data/workspace/undo.cljs b/frontend/src/app/main/data/workspace/undo.cljs index b0872fa47..108d5f9fb 100644 --- a/frontend/src/app/main/data/workspace/undo.cljs +++ b/frontend/src/app/main/data/workspace/undo.cljs @@ -6,6 +6,7 @@ (ns app.main.data.workspace.undo (:require + [app.common.data :as d] [app.common.pages.changes-spec :as pcs] [app.common.spec :as us] [cljs.spec.alpha :as s] @@ -54,6 +55,17 @@ (dec MAX-UNDO-SIZE))))) state)) +(defn- stack-undo-entry + [state {:keys [undo-changes redo-changes] :as entry}] + (let [index (get-in state [:workspace-undo :index] -1)] + (if (>= index 0) + (update-in state [:workspace-undo :items index] + (fn [item] + (-> item + (update :undo-changes #(into undo-changes %)) + (update :redo-changes #(into % redo-changes))))) + (add-undo-entry state entry)))) + (defn- accumulate-undo-entry [state {:keys [undo-changes redo-changes group-id]}] (-> state @@ -62,13 +74,21 @@ (assoc-in [:workspace-undo :transaction :group-id] group-id))) (defn append-undo - [entry] + [entry stack?] (us/assert ::undo-entry entry) (ptk/reify ::append-undo ptk/UpdateEvent (update [_ state] - (if (get-in state [:workspace-undo :transaction]) + (cond + (and (get-in state [:workspace-undo :transaction]) + (or (d/not-empty? (get-in state [:workspace-undo :transaction :undo-changes])) + (d/not-empty? (get-in state [:workspace-undo :transaction :redo-changes])))) (accumulate-undo-entry state entry) + + stack? + (stack-undo-entry state entry) + + :else (add-undo-entry state entry))))) (def empty-tx @@ -103,16 +123,6 @@ (update :workspace-undo dissoc :transaction)) state))))) -(def pop-undo-into-transaction - (ptk/reify ::last-undo-into-transaction - ptk/UpdateEvent - (update [_ state] - (let [index (get-in state [:workspace-undo :index] -1)] - - (cond-> state - (>= index 0) (accumulate-undo-entry (get-in state [:workspace-undo :items index])) - (>= index 0) (update-in [:workspace-undo :index] dec)))))) - (def reinitialize-undo (ptk/reify ::reset-undo ptk/UpdateEvent