From 7ee43f199af97bfad7a80b579201b9c189dc74bc Mon Sep 17 00:00:00 2001 From: "5684185+vsariola@users.noreply.github.com" <5684185+vsariola@users.noreply.github.com> Date: Mon, 2 Oct 2023 15:43:52 +0300 Subject: [PATCH] fix(tracker): make sure undo & redo stack never grow beyond limit --- tracker/model.go | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/tracker/model.go b/tracker/model.go index b30343a..1d037bc 100644 --- a/tracker/model.go +++ b/tracker/model.go @@ -981,12 +981,10 @@ func (m *Model) Undo() { if !m.CanUndo() { return } - if len(m.d.RedoStack) >= maxUndo { - m.d.RedoStack = m.d.RedoStack[1:] - } m.d.RedoStack = append(m.d.RedoStack, m.d.Song.Copy()) m.setSongNoUndo(m.d.UndoStack[len(m.d.UndoStack)-1]) m.d.UndoStack = m.d.UndoStack[:len(m.d.UndoStack)-1] + m.limitUndoRedoLengths() } func (m *Model) CanUndo() bool { @@ -1006,12 +1004,10 @@ func (m *Model) Redo() { if !m.CanRedo() { return } - if len(m.d.UndoStack) >= maxUndo { - m.d.UndoStack = m.d.UndoStack[1:] - } m.d.UndoStack = append(m.d.UndoStack, m.d.Song.Copy()) m.setSongNoUndo(m.d.RedoStack[len(m.d.RedoStack)-1]) m.d.RedoStack = m.d.RedoStack[:len(m.d.RedoStack)-1] + m.limitUndoRedoLengths() } func (m *Model) CanRedo() bool { @@ -1084,6 +1080,15 @@ func (m *Model) ParamIndex() int { return m.d.ParamIndex } +func (m *Model) limitUndoRedoLengths() { + if len(m.d.UndoStack) >= maxUndo { + m.d.UndoStack = m.d.UndoStack[len(m.d.UndoStack)-maxUndo:] + } + if len(m.d.RedoStack) >= maxUndo { + m.d.RedoStack = m.d.RedoStack[len(m.d.RedoStack)-maxUndo:] + } +} + func (m *Model) clampPositions() { m.d.Cursor = m.d.Cursor.Wrap(m.d.Song.Score) m.d.SelectionCorner = m.d.SelectionCorner.Wrap(m.d.Song.Score) @@ -1377,11 +1382,9 @@ func (m *Model) saveUndo(undoType string, undoSkipping int) { m.d.ChangedSinceSave = true m.d.PrevUndoType = undoType m.d.UndoSkipCounter = 0 - if len(m.d.UndoStack) >= maxUndo { - m.d.UndoStack = m.d.UndoStack[1:] - } m.d.UndoStack = append(m.d.UndoStack, m.d.Song.Copy()) m.d.RedoStack = m.d.RedoStack[:0] + m.limitUndoRedoLengths() } func (m *Model) freeUnitIDs(units []sointu.Unit) {