History improvements (#337)

* Simplified redoOnce.

* Help mental model.

* Move clear redo stack where it belongs.

* Not needed anymore as we check for same state.
This commit is contained in:
Enzo Ferey 2020-01-12 12:19:24 +01:00 committed by Christopher Chedeau
parent ba8bc10431
commit 88a9cee8bb
2 changed files with 12 additions and 8 deletions

View File

@ -22,13 +22,14 @@ class SceneHistory {
// If the last entry is the same as this one, ignore it // If the last entry is the same as this one, ignore it
return; return;
} }
this.stateHistory.push(newEntry); this.stateHistory.push(newEntry);
// As a new entry was pushed, we invalidate the redo stack
this.clearRedoStack();
} }
restoreEntry(entry: string) { restoreEntry(entry: string) {
// When restoring, we shouldn't add an history entry otherwise we'll be stuck with it and can't go back
this.skipRecording();
try { try {
return JSON.parse(entry); return JSON.parse(entry);
} catch { } catch {
@ -40,11 +41,15 @@ class SceneHistory {
this.redoStack.splice(0, this.redoStack.length); this.redoStack.splice(0, this.redoStack.length);
} }
redoOnce(elements: readonly ExcalidrawElement[]) { redoOnce() {
const currentEntry = this.generateCurrentEntry(elements); if (this.redoStack.length === 0) {
return null;
}
const entryToRestore = this.redoStack.pop(); const entryToRestore = this.redoStack.pop();
if (entryToRestore !== undefined) { if (entryToRestore !== undefined) {
this.stateHistory.push(currentEntry); this.stateHistory.push(entryToRestore);
return this.restoreEntry(entryToRestore); return this.restoreEntry(entryToRestore);
} }

View File

@ -291,7 +291,7 @@ export class App extends React.Component<{}, AppState> {
} else if (event[META_KEY] && event.code === "KeyZ") { } else if (event[META_KEY] && event.code === "KeyZ") {
if (event.shiftKey) { if (event.shiftKey) {
// Redo action // Redo action
const data = history.redoOnce(elements); const data = history.redoOnce();
if (data !== null) { if (data !== null) {
elements = data; elements = data;
} }
@ -1026,7 +1026,6 @@ export class App extends React.Component<{}, AppState> {
this.saveDebounced(); this.saveDebounced();
if (history.isRecording()) { if (history.isRecording()) {
history.pushEntry(history.generateCurrentEntry(elements)); history.pushEntry(history.generateCurrentEntry(elements));
history.clearRedoStack();
} }
} }
} }