From e218a8823d014965cb6721c957172db9511f3cc0 Mon Sep 17 00:00:00 2001 From: defclass Date: Sun, 11 Apr 2021 23:41:33 +0800 Subject: [PATCH] feat(undo): add multiple repo support --- .../frontend/modules/editor/undo_redo.cljs | 45 ++++++++++++++----- 1 file changed, 34 insertions(+), 11 deletions(-) diff --git a/src/main/frontend/modules/editor/undo_redo.cljs b/src/main/frontend/modules/editor/undo_redo.cljs index f836896c5..b85414b6a 100644 --- a/src/main/frontend/modules/editor/undo_redo.cljs +++ b/src/main/frontend/modules/editor/undo_redo.cljs @@ -7,32 +7,55 @@ ;;;; APIs -(def undo-stack (atom [])) -(def redo-stack (atom [])) +(def ^:private undo-redo-states (atom {})) + +(defn- get-state + [] + (let [repo (state/get-current-repo)] + (assert (string? repo) "Repo should satisfy string?") + (if-let [state (get @undo-redo-states repo)] + state + (let [new-state {:undo-stack (atom []) + :redo-stack (atom [])}] + (swap! undo-redo-states assoc repo new-state) + new-state)))) + +(defn- get-undo-stack + [] + (-> (get-state) :undo-stack)) + +(defn- get-redo-stack + [] + (-> (get-state) :redo-stack)) (defn push-undo [txs] - (swap! undo-stack conj txs)) + (let [undo-stack (get-undo-stack)] + (swap! undo-stack conj txs))) (defn pop-undo [] - (when-let [removed-e (peek @undo-stack)] - (swap! undo-stack pop) - removed-e)) + (let [undo-stack (get-undo-stack)] + (when-let [removed-e (peek @undo-stack)] + (swap! undo-stack pop) + removed-e))) (defn push-redo [txs] - (swap! redo-stack conj txs)) + (let [redo-stack (get-redo-stack)] + (swap! redo-stack conj txs))) (defn pop-redo [] - (when-let [removed-e (peek @redo-stack)] - (swap! redo-stack pop) - removed-e)) + (let [redo-stack (get-redo-stack)] + (when-let [removed-e (peek @redo-stack)] + (swap! redo-stack pop) + removed-e))) (defn reset-redo [] - (reset! redo-stack [])) + (let [redo-stack (get-redo-stack)] + (reset! redo-stack []))) (defn get-txs [redo? txs]