From 7d040f0b901a57872fbc24d6dc807575bbc7c27a Mon Sep 17 00:00:00 2001 From: Sven <40752681+NeoCoderMatrix86@users.noreply.github.com> Date: Mon, 29 Dec 2025 13:40:19 +0100 Subject: [PATCH 1/5] add possibility to remove traced changes --- .../Services/UI/ITraceChangeManager.cs | 1 + .../Services/UI/TraceChangeManager.cs | 40 +++++++++++++------ 2 files changed, 28 insertions(+), 13 deletions(-) diff --git a/AudioCuesheetEditor/Services/UI/ITraceChangeManager.cs b/AudioCuesheetEditor/Services/UI/ITraceChangeManager.cs index 09852d03..3c22dbed 100644 --- a/AudioCuesheetEditor/Services/UI/ITraceChangeManager.cs +++ b/AudioCuesheetEditor/Services/UI/ITraceChangeManager.cs @@ -24,5 +24,6 @@ public interface ITraceChangeManager public void Undo(); public void Redo(); public void MergeLastEditWithEdit(Func targetEdit); + public void RemoveTracedChanges(ITraceable traceable); } } diff --git a/AudioCuesheetEditor/Services/UI/TraceChangeManager.cs b/AudioCuesheetEditor/Services/UI/TraceChangeManager.cs index 21575fad..e7fb1061 100644 --- a/AudioCuesheetEditor/Services/UI/TraceChangeManager.cs +++ b/AudioCuesheetEditor/Services/UI/TraceChangeManager.cs @@ -50,8 +50,8 @@ public class TraceChangeManager(ILogger logger) : ITraceChan { private readonly ILogger _logger = logger; - private readonly Stack undoStack = new(); - private readonly Stack redoStack = new(); + private readonly List undoStack = []; + private readonly List redoStack = []; private List? bulkEditTracedChanges; @@ -84,8 +84,8 @@ public void TraceChanges(ITraceable traceable) public void Reset() { - ResetStack(redoStack); - ResetStack(undoStack); + Reset(redoStack); + Reset(undoStack); } public void Undo() @@ -97,7 +97,8 @@ public void Undo() TracedChanges? changes = null; while (undoStack.Count > 0 && changes == null) { - changes = undoStack.Pop(); + changes = undoStack[^1]; + undoStack.Remove(changes); if (changes.HasTraceableObject == false) { changes = null; @@ -133,7 +134,7 @@ public void Undo() } } //Push the old value to redo stack - redoStack.Push(new TracedChanges(redoChanges)); + redoStack.Add(new TracedChanges(redoChanges)); } CurrentlyHandlingRedoOrUndoChanges = false; UndoDone?.Invoke(this, EventArgs.Empty); @@ -149,7 +150,8 @@ public void Redo() TracedChanges? changes = null; while (redoStack.Count > 0 && changes == null) { - changes = redoStack.Pop(); + changes = redoStack[^1]; + redoStack.Remove(changes); if (changes.HasTraceableObject == false) { changes = null; @@ -185,7 +187,7 @@ public void Redo() } } //Push the old value to redo stack - undoStack.Push(new TracedChanges(undoChanges)); + undoStack.Add(new TracedChanges(undoChanges)); } CurrentlyHandlingRedoOrUndoChanges = false; RedoDone?.Invoke(this, EventArgs.Empty); @@ -206,7 +208,7 @@ public bool BulkEdit { if (bulkEditTracedChanges != null) { - undoStack.Push(new TracedChanges(bulkEditTracedChanges)); + undoStack.Add(new TracedChanges(bulkEditTracedChanges)); TracedObjectHistoryChanged?.Invoke(this, EventArgs.Empty); bulkEditTracedChanges = null; } @@ -219,17 +221,29 @@ public void MergeLastEditWithEdit(Func targetEdit) var edit = undoStack.FirstOrDefault(targetEdit); if ((edit != null) && (undoStack.Count > 0)) { - var lastEdits = undoStack.Pop(); + var lastEdits = undoStack[^1]; + undoStack.Remove(lastEdits); edit.Changes.AddRange(lastEdits.Changes); UndoDone?.Invoke(this, EventArgs.Empty); } } - private void ResetStack(Stack stack) + //TODO: Tests + public void RemoveTracedChanges(ITraceable traceable) + { + undoStack.RemoveAll(x => x.HasTraceableObject == false); + undoStack.RemoveAll(x => x.Changes.Any(y => y.TraceableObject == traceable)); + redoStack.RemoveAll(x => x.HasTraceableObject == false); + redoStack.RemoveAll(x => x.Changes.Any(y => y.TraceableObject == traceable)); + TracedObjectHistoryChanged?.Invoke(this, EventArgs.Empty); + } + + private void Reset(List stack) { while (stack.Count > 0) { - var tracedChange = stack.Pop(); + var tracedChange = stack[^1]; + stack.Remove(tracedChange); foreach (var change in tracedChange.Changes) { if (change.TraceableObject != null) @@ -254,7 +268,7 @@ private void Traceable_TraceablePropertyChanged(object? sender, TraceablePropert { //Single change var changes = new TracedChanges([new((ITraceable)sender, e.TraceableChange)]); - undoStack.Push(changes); + undoStack.Add(changes); redoStack.Clear(); TracedObjectHistoryChanged?.Invoke(this, EventArgs.Empty); } From 199ff1b1f4071cedcbc1269133ae8a97477cdbaf Mon Sep 17 00:00:00 2001 From: Sven <40752681+NeoCoderMatrix86@users.noreply.github.com> Date: Mon, 29 Dec 2025 13:40:33 +0100 Subject: [PATCH 2/5] trace import for changes --- .../Services/IO/ImportManager.cs | 31 +++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/AudioCuesheetEditor/Services/IO/ImportManager.cs b/AudioCuesheetEditor/Services/IO/ImportManager.cs index 97b6e860..c4ef27f6 100644 --- a/AudioCuesheetEditor/Services/IO/ImportManager.cs +++ b/AudioCuesheetEditor/Services/IO/ImportManager.cs @@ -88,9 +88,10 @@ public async Task ImportFilesAsync(IEnumerable files) stopwatch.Stop(); _logger.LogDebug("ImportFilesAsync duration: {stopwatch.Elapsed}", stopwatch.Elapsed); } - + //TODO: Tests public async Task AnalyseImportfile() { + ResetTracing(); var stopwatch = Stopwatch.StartNew(); var fileContent = _sessionStateContainer.Importfile?.FileContent; if (String.IsNullOrEmpty(fileContent) == false) @@ -116,6 +117,7 @@ public async Task AnalyseImportfile() var importCuesheet = new Cuesheet(); CopyCuesheet(importCuesheet, _sessionStateContainer.Importfile.AnalyzedCuesheet); _sessionStateContainer.ImportCuesheet = importCuesheet; + StartTracing(); break; case ImportFileType.Cuesheet: _traceChangeManager.BulkEdit = true; @@ -127,10 +129,11 @@ public async Task AnalyseImportfile() stopwatch.Stop(); _logger.LogDebug("ImportTextAsync duration: {stopwatch.Elapsed}", stopwatch.Elapsed); } - + //TODO: Tests public void ImportCuesheet() { var stopwatch = Stopwatch.StartNew(); + ResetTracing(); if (_sessionStateContainer.ImportCuesheet != null) { _traceChangeManager.BulkEdit = true; @@ -217,5 +220,29 @@ private static void CopyCuesheet(Cuesheet target, ICuesheet cuesheetToCopy) } target.IsImporting = false; } + + private void StartTracing() + { + if (_sessionStateContainer.ImportCuesheet != null) + { + _traceChangeManager.TraceChanges(_sessionStateContainer.ImportCuesheet); + foreach (var track in _sessionStateContainer.ImportCuesheet.Tracks) + { + _traceChangeManager.TraceChanges(track); + } + } + } + + private void ResetTracing() + { + if (_sessionStateContainer.ImportCuesheet != null) + { + _traceChangeManager.RemoveTracedChanges(_sessionStateContainer.ImportCuesheet); + foreach (var track in _sessionStateContainer.ImportCuesheet.Tracks) + { + _traceChangeManager.RemoveTracedChanges(track); + } + } + } } } From 93c5076e407333a05407edcc683ba720604e4bcb Mon Sep 17 00:00:00 2001 From: Sven <40752681+NeoCoderMatrix86@users.noreply.github.com> Date: Mon, 29 Dec 2025 13:50:43 +0100 Subject: [PATCH 3/5] add tests --- .../Services/UI/TraceChangeManagerTests.cs | 54 +++++++++++++++++++ .../Services/UI/TraceChangeManager.cs | 1 - 2 files changed, 54 insertions(+), 1 deletion(-) diff --git a/AudioCuesheetEditor.Tests/Services/UI/TraceChangeManagerTests.cs b/AudioCuesheetEditor.Tests/Services/UI/TraceChangeManagerTests.cs index 51433b04..94a9a2bd 100644 --- a/AudioCuesheetEditor.Tests/Services/UI/TraceChangeManagerTests.cs +++ b/AudioCuesheetEditor.Tests/Services/UI/TraceChangeManagerTests.cs @@ -354,5 +354,59 @@ public void BulkEditTracksLengthTest() Assert.IsNull(track3.End); Assert.IsNull(track4.End); } + + [TestMethod()] + public void RemoveTracedChanges_RemovesChanges_WhenChangesAvailable() + { + // Arrange + var manager = new TraceChangeManager(TestHelper.CreateLogger()); + var cuesheet1 = new Cuesheet(); + var cuesheet2 = new Cuesheet(); + manager.TraceChanges(cuesheet1); + manager.TraceChanges(cuesheet2); + cuesheet1.Artist = "Test Artist Cuesheet 1"; + cuesheet1.Title = "Test Title Cuesheet 1"; + cuesheet2.CDTextfile = new("CD Testfile.cdt"); + cuesheet2.AddSection(); + var tracedObjectHistoryChangedFired = false; + manager.TracedObjectHistoryChanged += delegate + { + tracedObjectHistoryChangedFired = true; + }; + // Act + manager.RemoveTracedChanges(cuesheet1); + // Assert + Assert.IsTrue(tracedObjectHistoryChangedFired); + Assert.IsTrue(manager.CanUndo); + manager.Undo(); + manager.Undo(); + Assert.IsFalse(manager.CanUndo); + } + + [TestMethod()] + public void RemoveTracedChanges_RemovesNoChanges_WhenNoChangesAvailable() + { + // Arrange + var manager = new TraceChangeManager(TestHelper.CreateLogger()); + var cuesheet1 = new Cuesheet(); + var cuesheet2 = new Cuesheet(); + manager.TraceChanges(cuesheet1); + manager.TraceChanges(cuesheet2); + cuesheet2.CDTextfile = new("CD Testfile.cdt"); + cuesheet2.AddSection(); + var tracedObjectHistoryChangedFired = false; + manager.TracedObjectHistoryChanged += delegate + { + tracedObjectHistoryChangedFired = true; + }; + // Act + manager.RemoveTracedChanges(cuesheet1); + // Assert + Assert.IsTrue(tracedObjectHistoryChangedFired); + Assert.IsTrue(manager.CanUndo); + manager.Undo(); + manager.Undo(); + Assert.IsFalse(manager.CanUndo); + } } } \ No newline at end of file diff --git a/AudioCuesheetEditor/Services/UI/TraceChangeManager.cs b/AudioCuesheetEditor/Services/UI/TraceChangeManager.cs index e7fb1061..aa85816c 100644 --- a/AudioCuesheetEditor/Services/UI/TraceChangeManager.cs +++ b/AudioCuesheetEditor/Services/UI/TraceChangeManager.cs @@ -228,7 +228,6 @@ public void MergeLastEditWithEdit(Func targetEdit) } } - //TODO: Tests public void RemoveTracedChanges(ITraceable traceable) { undoStack.RemoveAll(x => x.HasTraceableObject == false); From d51af906e759800e521ef565ced5495fa566c53f Mon Sep 17 00:00:00 2001 From: Sven <40752681+NeoCoderMatrix86@users.noreply.github.com> Date: Mon, 29 Dec 2025 14:46:40 +0100 Subject: [PATCH 4/5] add unit tests --- .../Services/IO/ImportManagerTests.cs | 55 +++++++++++++++++-- .../Services/IO/ImportManager.cs | 4 +- 2 files changed, 52 insertions(+), 7 deletions(-) diff --git a/AudioCuesheetEditor.Tests/Services/IO/ImportManagerTests.cs b/AudioCuesheetEditor.Tests/Services/IO/ImportManagerTests.cs index 691116fe..c8f9d926 100644 --- a/AudioCuesheetEditor.Tests/Services/IO/ImportManagerTests.cs +++ b/AudioCuesheetEditor.Tests/Services/IO/ImportManagerTests.cs @@ -43,8 +43,8 @@ public async Task AnalyseImportfile_WithTextfile_SetsImportCuesheet() { // Arrange var fileContent = "This is just a test"; - var traceChangeManager = new TraceChangeManager(TestHelper.CreateLogger()); - var sessionStateContainer = new SessionStateContainer(traceChangeManager); + var traceChangeManagerMock = new Mock(); + var sessionStateContainer = new SessionStateContainer(traceChangeManagerMock.Object); var fileInputManagerMock = new Mock(); var textImportServiceMock = new Mock(); var importCuesheet = new ImportCuesheet() @@ -74,8 +74,7 @@ public async Task AnalyseImportfile_WithTextfile_SetsImportCuesheet() }; textImportServiceMock.Setup(x => x.AnalyseAsync(fileContent)).ReturnsAsync(importfile); var loggerMock = new Mock>(); - var importManager = new ImportManager(sessionStateContainer, traceChangeManager, fileInputManagerMock.Object, textImportServiceMock.Object, loggerMock.Object); - var testHelper = new TestHelper(); + var importManager = new ImportManager(sessionStateContainer, traceChangeManagerMock.Object, fileInputManagerMock.Object, textImportServiceMock.Object, loggerMock.Object); sessionStateContainer.Importfile = new Importfile() { FileContent = "This is just a test", @@ -101,6 +100,8 @@ public async Task AnalyseImportfile_WithTextfile_SetsImportCuesheet() Assert.AreEqual(importCuesheet.Tracks.First().Position, sessionStateContainer.ImportCuesheet.Tracks.First().Position); Assert.AreEqual(importCuesheet.Tracks.First().PreGap, sessionStateContainer.ImportCuesheet.Tracks.First().PreGap); Assert.AreEqual(importCuesheet.Tracks.First().PostGap, sessionStateContainer.ImportCuesheet.Tracks.First().PostGap); + traceChangeManagerMock.Verify(x => x.TraceChanges(It.IsAny())); + traceChangeManagerMock.Verify(x => x.TraceChanges(It.IsAny())); } [TestMethod()] @@ -120,7 +121,6 @@ public async Task AnalyseImportfile_WithoutAnalysedCuesheet_DoesNothing() textImportServiceMock.Setup(x => x.AnalyseAsync(fileContent)).ReturnsAsync(importfile); var loggerMock = new Mock>(); var importManager = new ImportManager(sessionStateContainer, traceChangeManager, fileInputManagerMock.Object, textImportServiceMock.Object, loggerMock.Object); - var testHelper = new TestHelper(); sessionStateContainer.Importfile = importfile; // Act await importManager.AnalyseImportfile(); @@ -207,6 +207,51 @@ public async Task ImportFilesAsync_TextFile_ImportsCorrectly() Assert.AreEqual(ImportFileType.Textfile, sessionStateContainer.Importfile.FileType); } + [TestMethod] + public void ImportCuesheet_WithImportCuesheetAvailable_ImportsCuesheetData() + { + // Arrange + var traceChangeManagerMock = new Mock(); + var sessionStateContainer = new SessionStateContainer(traceChangeManagerMock.Object); + var analyzedCuesheet = new Cuesheet() + { + Artist = "Artist 123", + Title = "Title 456" + }; + analyzedCuesheet.AddTrack(new() + { + Artist = "Track Artist 1", + Title = "Track Title 1", + End = new TimeSpan(0, 4, 23), + }); + analyzedCuesheet.AddTrack(new() + { + Artist = "Track Artist 2", + Title = "Track Title 2", + End = new TimeSpan(0, 8, 54), + }); + sessionStateContainer.ImportCuesheet = analyzedCuesheet; + var fileInputManagerMock = new Mock(); + var textImportServiceMock = new Mock(); + var loggerMock = new Mock>(); + var importManager = new ImportManager(sessionStateContainer, traceChangeManagerMock.Object, fileInputManagerMock.Object, textImportServiceMock.Object, loggerMock.Object); + // Act + importManager.ImportCuesheet(); + // Assert + Assert.AreEqual(analyzedCuesheet.Artist, sessionStateContainer.Cuesheet.Artist); + Assert.AreEqual(analyzedCuesheet.Title, sessionStateContainer.Cuesheet.Title); + Assert.AreEqual(analyzedCuesheet.Tracks.First().Artist, sessionStateContainer.Cuesheet.Tracks.First().Artist); + Assert.AreEqual(analyzedCuesheet.Tracks.First().Title, sessionStateContainer.Cuesheet.Tracks.First().Title); + Assert.AreEqual(analyzedCuesheet.Tracks.First().Begin, sessionStateContainer.Cuesheet.Tracks.First().Begin); + Assert.AreEqual(analyzedCuesheet.Tracks.First().End, sessionStateContainer.Cuesheet.Tracks.First().End); + Assert.AreEqual(analyzedCuesheet.Tracks.Last().Artist, sessionStateContainer.Cuesheet.Tracks.Last().Artist); + Assert.AreEqual(analyzedCuesheet.Tracks.Last().Title, sessionStateContainer.Cuesheet.Tracks.Last().Title); + Assert.AreEqual(analyzedCuesheet.Tracks.Last().Begin, sessionStateContainer.Cuesheet.Tracks.Last().Begin); + Assert.AreEqual(analyzedCuesheet.Tracks.Last().End, sessionStateContainer.Cuesheet.Tracks.Last().End); + traceChangeManagerMock.Verify(x => x.RemoveTracedChanges(It.IsAny())); + traceChangeManagerMock.Verify(x => x.RemoveTracedChanges(It.IsAny())); + } + private static IBrowserFile CreateBrowserFileMock(string name, string content = "TestContent") { var fileMock = new Mock(); diff --git a/AudioCuesheetEditor/Services/IO/ImportManager.cs b/AudioCuesheetEditor/Services/IO/ImportManager.cs index c4ef27f6..d5bce81f 100644 --- a/AudioCuesheetEditor/Services/IO/ImportManager.cs +++ b/AudioCuesheetEditor/Services/IO/ImportManager.cs @@ -88,7 +88,7 @@ public async Task ImportFilesAsync(IEnumerable files) stopwatch.Stop(); _logger.LogDebug("ImportFilesAsync duration: {stopwatch.Elapsed}", stopwatch.Elapsed); } - //TODO: Tests + public async Task AnalyseImportfile() { ResetTracing(); @@ -129,7 +129,7 @@ public async Task AnalyseImportfile() stopwatch.Stop(); _logger.LogDebug("ImportTextAsync duration: {stopwatch.Elapsed}", stopwatch.Elapsed); } - //TODO: Tests + public void ImportCuesheet() { var stopwatch = Stopwatch.StartNew(); From 4596b049606a9ab2a059411982b755eaf46c1f8c Mon Sep 17 00:00:00 2001 From: Sven <40752681+NeoCoderMatrix86@users.noreply.github.com> Date: Mon, 29 Dec 2025 15:26:30 +0100 Subject: [PATCH 5/5] performance boost --- .../Services/IO/ImportManagerTests.cs | 4 ++-- .../Services/UI/TraceChangeManagerTests.cs | 4 ++-- AudioCuesheetEditor/Services/IO/ImportManager.cs | 7 ++----- AudioCuesheetEditor/Services/UI/ITraceChangeManager.cs | 2 +- AudioCuesheetEditor/Services/UI/TraceChangeManager.cs | 6 +++--- 5 files changed, 10 insertions(+), 13 deletions(-) diff --git a/AudioCuesheetEditor.Tests/Services/IO/ImportManagerTests.cs b/AudioCuesheetEditor.Tests/Services/IO/ImportManagerTests.cs index c8f9d926..38a2ed33 100644 --- a/AudioCuesheetEditor.Tests/Services/IO/ImportManagerTests.cs +++ b/AudioCuesheetEditor.Tests/Services/IO/ImportManagerTests.cs @@ -18,6 +18,7 @@ using AudioCuesheetEditor.Model.AudioCuesheet.Import; using AudioCuesheetEditor.Model.IO; using AudioCuesheetEditor.Model.IO.Import; +using AudioCuesheetEditor.Model.UI; using AudioCuesheetEditor.Services.IO; using AudioCuesheetEditor.Services.UI; using AudioCuesheetEditor.Tests.Utility; @@ -248,8 +249,7 @@ public void ImportCuesheet_WithImportCuesheetAvailable_ImportsCuesheetData() Assert.AreEqual(analyzedCuesheet.Tracks.Last().Title, sessionStateContainer.Cuesheet.Tracks.Last().Title); Assert.AreEqual(analyzedCuesheet.Tracks.Last().Begin, sessionStateContainer.Cuesheet.Tracks.Last().Begin); Assert.AreEqual(analyzedCuesheet.Tracks.Last().End, sessionStateContainer.Cuesheet.Tracks.Last().End); - traceChangeManagerMock.Verify(x => x.RemoveTracedChanges(It.IsAny())); - traceChangeManagerMock.Verify(x => x.RemoveTracedChanges(It.IsAny())); + traceChangeManagerMock.Verify(x => x.RemoveTracedChanges(It.IsAny>())); } private static IBrowserFile CreateBrowserFileMock(string name, string content = "TestContent") diff --git a/AudioCuesheetEditor.Tests/Services/UI/TraceChangeManagerTests.cs b/AudioCuesheetEditor.Tests/Services/UI/TraceChangeManagerTests.cs index 94a9a2bd..5eda87dc 100644 --- a/AudioCuesheetEditor.Tests/Services/UI/TraceChangeManagerTests.cs +++ b/AudioCuesheetEditor.Tests/Services/UI/TraceChangeManagerTests.cs @@ -374,7 +374,7 @@ public void RemoveTracedChanges_RemovesChanges_WhenChangesAvailable() tracedObjectHistoryChangedFired = true; }; // Act - manager.RemoveTracedChanges(cuesheet1); + manager.RemoveTracedChanges([cuesheet1]); // Assert Assert.IsTrue(tracedObjectHistoryChangedFired); Assert.IsTrue(manager.CanUndo); @@ -400,7 +400,7 @@ public void RemoveTracedChanges_RemovesNoChanges_WhenNoChangesAvailable() tracedObjectHistoryChangedFired = true; }; // Act - manager.RemoveTracedChanges(cuesheet1); + manager.RemoveTracedChanges([cuesheet1]); // Assert Assert.IsTrue(tracedObjectHistoryChangedFired); Assert.IsTrue(manager.CanUndo); diff --git a/AudioCuesheetEditor/Services/IO/ImportManager.cs b/AudioCuesheetEditor/Services/IO/ImportManager.cs index d5bce81f..ba80e27c 100644 --- a/AudioCuesheetEditor/Services/IO/ImportManager.cs +++ b/AudioCuesheetEditor/Services/IO/ImportManager.cs @@ -18,6 +18,7 @@ using AudioCuesheetEditor.Model.IO; using AudioCuesheetEditor.Model.IO.Audio; using AudioCuesheetEditor.Model.IO.Import; +using AudioCuesheetEditor.Model.UI; using AudioCuesheetEditor.Services.UI; using Microsoft.AspNetCore.Components.Forms; using System.Diagnostics; @@ -237,11 +238,7 @@ private void ResetTracing() { if (_sessionStateContainer.ImportCuesheet != null) { - _traceChangeManager.RemoveTracedChanges(_sessionStateContainer.ImportCuesheet); - foreach (var track in _sessionStateContainer.ImportCuesheet.Tracks) - { - _traceChangeManager.RemoveTracedChanges(track); - } + _traceChangeManager.RemoveTracedChanges([_sessionStateContainer.ImportCuesheet, .. _sessionStateContainer.ImportCuesheet.Tracks]); } } } diff --git a/AudioCuesheetEditor/Services/UI/ITraceChangeManager.cs b/AudioCuesheetEditor/Services/UI/ITraceChangeManager.cs index 3c22dbed..757b64bd 100644 --- a/AudioCuesheetEditor/Services/UI/ITraceChangeManager.cs +++ b/AudioCuesheetEditor/Services/UI/ITraceChangeManager.cs @@ -24,6 +24,6 @@ public interface ITraceChangeManager public void Undo(); public void Redo(); public void MergeLastEditWithEdit(Func targetEdit); - public void RemoveTracedChanges(ITraceable traceable); + public void RemoveTracedChanges(IEnumerable traceables); } } diff --git a/AudioCuesheetEditor/Services/UI/TraceChangeManager.cs b/AudioCuesheetEditor/Services/UI/TraceChangeManager.cs index aa85816c..45e944db 100644 --- a/AudioCuesheetEditor/Services/UI/TraceChangeManager.cs +++ b/AudioCuesheetEditor/Services/UI/TraceChangeManager.cs @@ -228,12 +228,12 @@ public void MergeLastEditWithEdit(Func targetEdit) } } - public void RemoveTracedChanges(ITraceable traceable) + public void RemoveTracedChanges(IEnumerable traceables) { undoStack.RemoveAll(x => x.HasTraceableObject == false); - undoStack.RemoveAll(x => x.Changes.Any(y => y.TraceableObject == traceable)); + undoStack.RemoveAll(x => x.Changes.Any(y => traceables.Contains(y.TraceableObject))); redoStack.RemoveAll(x => x.HasTraceableObject == false); - redoStack.RemoveAll(x => x.Changes.Any(y => y.TraceableObject == traceable)); + redoStack.RemoveAll(x => x.Changes.Any(y => traceables.Contains(y.TraceableObject))); TracedObjectHistoryChanged?.Invoke(this, EventArgs.Empty); }