diff --git a/AudioCuesheetEditor.Tests/Services/AudioCuesheet/AudiofileManagerTests.cs b/AudioCuesheetEditor.Tests/Services/AudioCuesheet/AudiofileManagerTests.cs index 9674ae6e..6f30d296 100644 --- a/AudioCuesheetEditor.Tests/Services/AudioCuesheet/AudiofileManagerTests.cs +++ b/AudioCuesheetEditor.Tests/Services/AudioCuesheet/AudiofileManagerTests.cs @@ -267,7 +267,7 @@ public void AddTrack_FirstTrack_AddsNewTrackWithCalulatedTrackProperties() { Audiofiles = [audiofile] }; - _sessionStateContainer.Setup(x => x.GetActiveCuesheet()).Returns(cuesheet); + _sessionStateContainer.Setup(x => x.ActiveCuesheet).Returns(cuesheet); var track = new Track(); // Act _audiofileManager.AddTrack(audiofile, track); @@ -302,7 +302,7 @@ public void AddTrack_AddToPreviousTracks_AddsNewTrackWithCalulatedTrackPropertie { Audiofiles = [audiofile] }; - _sessionStateContainer.Setup(x => x.GetActiveCuesheet()).Returns(cuesheet); + _sessionStateContainer.Setup(x => x.ActiveCuesheet).Returns(cuesheet); var track = new Track() { IsLinkedToPreviousTrack = true @@ -343,7 +343,7 @@ public void AddTrack_DuringRecording_AddsNewTrackWithCalulatedTrackProperties() RecordingStart = DateTime.UtcNow, Audiofiles = [audiofile] }; - _sessionStateContainer.Setup(x => x.GetActiveCuesheet()).Returns(cuesheet); + _sessionStateContainer.Setup(x => x.ActiveCuesheet).Returns(cuesheet); var track = new Track() { IsLinkedToPreviousTrack = true @@ -372,7 +372,7 @@ public void AddTrack_FirstTrackImporting_AddsNewTrackWithCalulatedTrackPropertie { Audiofiles = [audiofile] }; - _sessionStateContainer.Setup(x => x.GetActiveCuesheet()).Returns(importCuesheet); + _sessionStateContainer.Setup(x => x.ActiveCuesheet).Returns(importCuesheet); var track = new Track(); // Act _audiofileManager.AddTrack(audiofile, track); @@ -441,7 +441,7 @@ public void RemoveTracks_WithAttachedTracks_RemovesTracksAndRecalculatesRemainin track3.Cuesheet = cuesheet; track4.Cuesheet = cuesheet; track5.Cuesheet = cuesheet; - _sessionStateContainer.Setup(x => x.GetActiveCuesheet()).Returns(cuesheet); + _sessionStateContainer.Setup(x => x.ActiveCuesheet).Returns(cuesheet); // Act _audiofileManager.RemoveTracks(audiofile, [track2, track4]); // Assert @@ -519,7 +519,7 @@ public void RemoveTracks_DuringImport_RemovesTracksAndRecalculatesRemainingTrack track3.Audiofile = audiofile; track4.Audiofile = audiofile; track5.Audiofile = audiofile; - _sessionStateContainer.Setup(x => x.GetActiveCuesheet()).Returns(importCuesheet); + _sessionStateContainer.Setup(x => x.ActiveCuesheet).Returns(importCuesheet); // Act _audiofileManager.RemoveTracks(audiofile, [track2, track4]); // Assert diff --git a/AudioCuesheetEditor.Tests/Services/AudioCuesheet/CuesheetManagerTests.cs b/AudioCuesheetEditor.Tests/Services/AudioCuesheet/CuesheetManagerTests.cs index 48b0dc0b..39a36e29 100644 --- a/AudioCuesheetEditor.Tests/Services/AudioCuesheet/CuesheetManagerTests.cs +++ b/AudioCuesheetEditor.Tests/Services/AudioCuesheet/CuesheetManagerTests.cs @@ -64,7 +64,7 @@ public void SetProperty_NewValue_ChangesPropertyAndSetsTracedChange() { // Arrange var cuesheet = new Cuesheet(); - _sessionStateContainer.Setup(x => x.GetActiveCuesheet()).Returns(cuesheet); + _sessionStateContainer.Setup(x => x.ActiveCuesheet).Returns(cuesheet); // Act _cuesheetManager.SetProperty(x => x.Artist, "Artist"); // Assert @@ -80,7 +80,7 @@ public void SetProperty_EqualValue_DoesntChangeProperty() { Artist = "Artist" }; - _sessionStateContainer.Setup(x => x.GetActiveCuesheet()).Returns(cuesheet); + _sessionStateContainer.Setup(x => x.ActiveCuesheet).Returns(cuesheet); // Act _cuesheetManager.SetProperty(x => x.Artist, cuesheet.Artist); // Assert @@ -107,7 +107,7 @@ public void SetProperty_DeletedAudiofile_RevokesObjectURLs() { Audiofiles = [audiofile1, audiofile2] }; - _sessionStateContainer.Setup(x => x.GetActiveCuesheet()).Returns(cuesheet); + _sessionStateContainer.Setup(x => x.ActiveCuesheet).Returns(cuesheet); var files = new List(cuesheet.Audiofiles); files.Remove(audiofile2); // Act @@ -390,7 +390,7 @@ public void IsMoveUpPossible_AudiofilesAbove_ReturnsTrue() { Audiofiles = [file1, file2, file3], }; - _sessionStateContainer.Setup(x => x.GetActiveCuesheet()).Returns(cuesheet); + _sessionStateContainer.Setup(x => x.ActiveCuesheet).Returns(cuesheet); // Act var result = _cuesheetManager.IsMoveUpPossible([file2, file3]); // Assert @@ -408,7 +408,7 @@ public void IsMoveUpPossible_NoAudiofilesAbove_ReturnsFalse() { Audiofiles = [file1, file2, file3], }; - _sessionStateContainer.Setup(x => x.GetActiveCuesheet()).Returns(cuesheet); + _sessionStateContainer.Setup(x => x.ActiveCuesheet).Returns(cuesheet); // Act var result = _cuesheetManager.IsMoveUpPossible([file1, file2]); // Assert @@ -461,7 +461,7 @@ public void IsMoveDownPossible_TracksBelow_ReturnsTrue() track1.Cuesheet = cuesheet; track2.Cuesheet = cuesheet; track3.Cuesheet = cuesheet; - _sessionStateContainer.Setup(x => x.GetActiveCuesheet()).Returns(cuesheet); + _sessionStateContainer.Setup(x => x.ActiveCuesheet).Returns(cuesheet); // Act var result = _cuesheetManager.IsMoveDownPossible([track2, track1]); // Assert @@ -531,7 +531,7 @@ public void IsMoveDownPossible_AudiofilesBelow_ReturnsTrue() { Audiofiles = [file1, file2, file3], }; - _sessionStateContainer.Setup(x => x.GetActiveCuesheet()).Returns(cuesheet); + _sessionStateContainer.Setup(x => x.ActiveCuesheet).Returns(cuesheet); // Act var result = _cuesheetManager.IsMoveDownPossible([file2, file1]); // Assert @@ -549,7 +549,7 @@ public void IsMoveDownPossible_NoAudiofilesBelow_ReturnsFalse() { Audiofiles = [file1, file2, file3], }; - _sessionStateContainer.Setup(x => x.GetActiveCuesheet()).Returns(cuesheet); + _sessionStateContainer.Setup(x => x.ActiveCuesheet).Returns(cuesheet); // Act var result = _cuesheetManager.IsMoveDownPossible([file3, file2]); // Assert @@ -610,7 +610,7 @@ public void MoveUp_TracksSwitchingAudiofile_ReturnsSuccess() track1.Audiofile = cuesheet.Audiofiles.First(); track2.Audiofile = cuesheet.Audiofiles.Last(); track3.Audiofile = cuesheet.Audiofiles.Last(); - _sessionStateContainer.Setup(x => x.GetActiveCuesheet()).Returns(cuesheet); + _sessionStateContainer.Setup(x => x.ActiveCuesheet).Returns(cuesheet); // Act var result = _cuesheetManager.MoveUp([track2, track3]); // Assert @@ -672,7 +672,7 @@ public void MoveUp_TracksAbove_ReturnsSuccess() track1.Audiofile = cuesheet.Audiofiles.First(); track2.Audiofile = cuesheet.Audiofiles.First(); track3.Audiofile = cuesheet.Audiofiles.First(); - _sessionStateContainer.Setup(x => x.GetActiveCuesheet()).Returns(cuesheet); + _sessionStateContainer.Setup(x => x.ActiveCuesheet).Returns(cuesheet); // Act var result = _cuesheetManager.MoveUp([track2, track3]); // Assert @@ -850,19 +850,18 @@ public void MoveUp_AudiofilesAbove_ReturnsSuccess() { Audiofiles = [file1, file2, file3], }; - _sessionStateContainer.Setup(x => x.GetActiveCuesheet()).Returns(cuesheet); + _sessionStateContainer.Setup(x => x.ActiveCuesheet).Returns(cuesheet); track1.Cuesheet = cuesheet; track2.Cuesheet = cuesheet; track3.Cuesheet = cuesheet; track1.Audiofile = file2; track2.Audiofile = file2; track3.Audiofile = file3; - _sessionStateContainer.Setup(x => x.GetActiveCuesheet()).Returns(cuesheet); // Act var result = _cuesheetManager.MoveUp([file2, file3]); // Assert Assert.IsTrue(result.IsSuccess); - CollectionAssert.AreEquivalent(new List([file2, file3, file1]), cuesheet.Audiofiles.ToList()); + Assert.AreSequenceEqual(new List([file2, file3, file1]), cuesheet.Audiofiles); Assert.IsEmpty(file1.Tracks); Assert.AreEqual((ushort?)1, track1.Position); Assert.AreEqual(TimeSpan.Zero, track1.Begin); @@ -890,7 +889,7 @@ public void MoveUp_NoAudiofilesAbove_ReturnsFailure() { Audiofiles = [file1, file2, file3], }; - _sessionStateContainer.Setup(x => x.GetActiveCuesheet()).Returns(cuesheet); + _sessionStateContainer.Setup(x => x.ActiveCuesheet).Returns(cuesheet); // Act var result = _cuesheetManager.MoveUp([file1, file2]); // Assert @@ -911,7 +910,7 @@ public void MoveUp_NoAudiofilesSelected_ReturnsFailure() { Audiofiles = [file1, file2, file3], }; - _sessionStateContainer.Setup(x => x.GetActiveCuesheet()).Returns(cuesheet); + _sessionStateContainer.Setup(x => x.ActiveCuesheet).Returns(cuesheet); // Act var result = _cuesheetManager.MoveUp(new HashSet()); // Assert @@ -965,7 +964,7 @@ public void MoveDown_TracksSwitchingAudiofile_ReturnsSuccess() track1.Audiofile = cuesheet.Audiofiles.First(); track2.Audiofile = cuesheet.Audiofiles.First(); track3.Audiofile = cuesheet.Audiofiles.Last(); - _sessionStateContainer.Setup(x => x.GetActiveCuesheet()).Returns(cuesheet); + _sessionStateContainer.Setup(x => x.ActiveCuesheet).Returns(cuesheet); // Act var result = _cuesheetManager.MoveDown([track2, track1]); // Assert @@ -1027,7 +1026,7 @@ public void MoveDown_TracksBelow_ReturnsSuccess() track1.Audiofile = cuesheet.Audiofiles.First(); track2.Audiofile = cuesheet.Audiofiles.First(); track3.Audiofile = cuesheet.Audiofiles.First(); - _sessionStateContainer.Setup(x => x.GetActiveCuesheet()).Returns(cuesheet); + _sessionStateContainer.Setup(x => x.ActiveCuesheet).Returns(cuesheet); // Act var result = _cuesheetManager.MoveDown([track2, track1]); // Assert @@ -1205,19 +1204,18 @@ public void MoveDown_AudiofilesBelow_ReturnsSuccess() { Audiofiles = [file1, file2, file3], }; - _sessionStateContainer.Setup(x => x.GetActiveCuesheet()).Returns(cuesheet); + _sessionStateContainer.Setup(x => x.ActiveCuesheet).Returns(cuesheet); track1.Cuesheet = cuesheet; track2.Cuesheet = cuesheet; track3.Cuesheet = cuesheet; track1.Audiofile = file2; track2.Audiofile = file2; track3.Audiofile = file3; - _sessionStateContainer.Setup(x => x.GetActiveCuesheet()).Returns(cuesheet); // Act var result = _cuesheetManager.MoveDown([file2, file1]); // Assert Assert.IsTrue(result.IsSuccess); - CollectionAssert.AreEquivalent(new List([file3, file2, file1]), cuesheet.Audiofiles.ToList()); + Assert.AreSequenceEqual(new List([file3, file1, file2]), cuesheet.Audiofiles); Assert.AreEqual((ushort?)1, track1.Position); Assert.AreEqual(TimeSpan.Zero, track1.Begin); Assert.AreEqual(track1End, track1.End); @@ -1244,7 +1242,7 @@ public void MoveDown_NoAudiofilesBelow_ReturnsFailure() { Audiofiles = [file1, file2, file3], }; - _sessionStateContainer.Setup(x => x.GetActiveCuesheet()).Returns(cuesheet); + _sessionStateContainer.Setup(x => x.ActiveCuesheet).Returns(cuesheet); // Act var result = _cuesheetManager.MoveDown([file2, file3]); // Assert @@ -1265,7 +1263,7 @@ public void MoveDown_NoAudiofilesSelected_ReturnsFailure() { Audiofiles = [file1, file2, file3], }; - _sessionStateContainer.Setup(x => x.GetActiveCuesheet()).Returns(cuesheet); + _sessionStateContainer.Setup(x => x.ActiveCuesheet).Returns(cuesheet); // Act var result = _cuesheetManager.MoveDown(new HashSet()); // Assert diff --git a/AudioCuesheetEditor.Tests/Services/UI/SessionStateContainerTests.cs b/AudioCuesheetEditor.Tests/Services/UI/SessionStateContainerTests.cs index 93a7028a..0ba87be4 100644 --- a/AudioCuesheetEditor.Tests/Services/UI/SessionStateContainerTests.cs +++ b/AudioCuesheetEditor.Tests/Services/UI/SessionStateContainerTests.cs @@ -38,12 +38,15 @@ public SessionStateContainerTests() } [TestMethod] - public void Cuesheet_SetNewValue_ShouldTriggerCuesheetChangedEvent() + public async Task Cuesheet_SetNewValueInDetailView_ShouldTriggerActiveCuesheetChangedEventAsync() { // Arrange var newCuesheet = new Cuesheet(); + var viewOptions = new ViewOptions(); + _localStorageOptionsProvider.Setup(x => x.GetOptionsAsync()).ReturnsAsync(viewOptions); + await _sessionStateContainer.InitializeAsync(); bool eventTriggered = false; - _sessionStateContainer.CuesheetChanged += (sender, args) => eventTriggered = true; + _sessionStateContainer.ActiveCuesheetChanged += (sender, args) => eventTriggered = true; // Act _sessionStateContainer.Cuesheet = newCuesheet; @@ -53,12 +56,39 @@ public void Cuesheet_SetNewValue_ShouldTriggerCuesheetChangedEvent() } [TestMethod] - public void ImportCuesheet_SetNewValue_ShouldTriggerImportCuesheetChangedEvent() + public async Task Cuesheet_SetNewValueInImportView_ShouldNotTriggerActiveCuesheetChangedEventAsync() + { + // Arrange + var newCuesheet = new Cuesheet(); + var viewOptions = new ViewOptions() + { + ActiveTab = ViewMode.ImportView + }; + _localStorageOptionsProvider.Setup(x => x.GetOptionsAsync()).ReturnsAsync(viewOptions); + await _sessionStateContainer.InitializeAsync(); + bool eventTriggered = false; + _sessionStateContainer.ActiveCuesheetChanged += (sender, args) => eventTriggered = true; + + // Act + _sessionStateContainer.Cuesheet = newCuesheet; + + // Assert + Assert.IsFalse(eventTriggered); + } + + [TestMethod] + public async Task ImportCuesheet_SetNewValueInImportView_ShouldTriggerActiveCuesheetChangedEventAsync() { // Arrange var newImportCuesheet = new Cuesheet(); + var viewOptions = new ViewOptions() + { + ActiveTab = ViewMode.ImportView + }; + _localStorageOptionsProvider.Setup(x => x.GetOptionsAsync()).ReturnsAsync(viewOptions); + await _sessionStateContainer.InitializeAsync(); bool eventTriggered = false; - _sessionStateContainer.ImportCuesheetChanged += (sender, args) => eventTriggered = true; + _sessionStateContainer.ActiveCuesheetChanged += (sender, args) => eventTriggered = true; // Act _sessionStateContainer.ImportCuesheet = newImportCuesheet; @@ -68,11 +98,33 @@ public void ImportCuesheet_SetNewValue_ShouldTriggerImportCuesheetChangedEvent() } [TestMethod] - public void ResetImport_ShouldClearImportProperties() + public async Task ImportCuesheet_SetNewValueInDetailView_ShouldTriggerActiveCuesheetChangedEventAsync() + { + // Arrange + var newImportCuesheet = new Cuesheet(); + var viewOptions = new ViewOptions(); + _localStorageOptionsProvider.Setup(x => x.GetOptionsAsync()).ReturnsAsync(viewOptions); + await _sessionStateContainer.InitializeAsync(); + bool eventTriggered = false; + _sessionStateContainer.ActiveCuesheetChanged += (sender, args) => eventTriggered = true; + + // Act + _sessionStateContainer.ImportCuesheet = newImportCuesheet; + + // Assert + Assert.IsFalse(eventTriggered); + } + + [TestMethod] + public async Task ResetImport_InitializedService_ShouldClearPropertiesAsync() { // Arrange + var viewOptions = new ViewOptions(); + _localStorageOptionsProvider.Setup(x => x.GetOptionsAsync()).ReturnsAsync(viewOptions); + await _sessionStateContainer.InitializeAsync(); _sessionStateContainer.Importfile = Mock.Of(); _sessionStateContainer.ImportCuesheet = new Cuesheet(); + _sessionStateContainer.ImportIsAnalyzed = true; // Act _sessionStateContainer.ResetImport(); @@ -81,6 +133,7 @@ public void ResetImport_ShouldClearImportProperties() Assert.IsNull(_sessionStateContainer.Importfile); Assert.IsEmpty(_sessionStateContainer.ImportAudiofiles); Assert.IsNull(_sessionStateContainer.ImportCuesheet); + Assert.IsFalse(_sessionStateContainer.ImportIsAnalyzed); } [TestMethod] @@ -96,7 +149,7 @@ public async Task InitializeAsync_NotInitialized_ShouldInitializeAsync() } [TestMethod] - public async Task InitializeAsync_Initialized_ShouldNoptInitializeAsync() + public async Task InitializeAsync_Initialized_ShouldNotInitializeAsync() { // Arrange var viewOptions = new ViewOptions(); @@ -109,20 +162,83 @@ public async Task InitializeAsync_Initialized_ShouldNoptInitializeAsync() } [TestMethod] - public async Task GetActiveCuesheet_Initialized_ReturnsDetailViewCuesheeetAsync() + public async Task ActiveCuesheet_Initialized_ReturnsDetailViewCuesheet() + { + // Arrange + var viewOptions = new ViewOptions(); + _localStorageOptionsProvider.Setup(x => x.GetOptionsAsync()).ReturnsAsync(viewOptions); + await _sessionStateContainer.InitializeAsync(); + // Act + var cuesheet = _sessionStateContainer.ActiveCuesheet; + // Assert + Assert.AreEqual(_sessionStateContainer.Cuesheet, cuesheet); + } + + [TestMethod] + public async Task ActiveCuesheet_SwitchViewSignalesUpdate_ReturnsImportViewCuesheet() + { + // Arrange + var viewOptions = new ViewOptions(); + _localStorageOptionsProvider.Setup(x => x.GetOptionsAsync()).ReturnsAsync(viewOptions); + await _sessionStateContainer.InitializeAsync(); + viewOptions.ActiveTab = ViewMode.ImportView; + + _localStorageOptionsProvider.Setup(x => x.SaveOptionsAsync(viewOptions)).Callback(() => + { + _localStorageOptionsProvider.Raise(x => x.OptionSaved += null, _localStorageOptionsProvider.Object, viewOptions); + }); + + Boolean activeCuesheetChangedEventTriggered = false; + _sessionStateContainer.ActiveCuesheetChanged += delegate + { + activeCuesheetChangedEventTriggered = true; + }; + _sessionStateContainer.Cuesheet.Title = "Cuesheet"; + _sessionStateContainer.ImportCuesheet = new() + { + Title = "ImportCuesheet" + }; + await _localStorageOptionsProvider.Object.SaveOptionsAsync(viewOptions); + // Act + var cuesheet = _sessionStateContainer.ActiveCuesheet; + // Assert + Assert.AreEqual(_sessionStateContainer.ImportCuesheet, cuesheet); + Assert.IsTrue(activeCuesheetChangedEventTriggered); + } + + [TestMethod] + public async Task ActiveCuesheet_SaveOptionsSetsActiveCuesheetOnce_ReturnsDetailViewCuesheet() { // Arrange var viewOptions = new ViewOptions(); _localStorageOptionsProvider.Setup(x => x.GetOptionsAsync()).ReturnsAsync(viewOptions); await _sessionStateContainer.InitializeAsync(); + _localStorageOptionsProvider.Setup(x => x.SaveOptionsAsync(viewOptions)).Callback(() => + { + _localStorageOptionsProvider.Raise(x => x.OptionSaved += null, _localStorageOptionsProvider.Object, viewOptions); + }); + _sessionStateContainer.Cuesheet.Title = "Cuesheet"; + _sessionStateContainer.ImportCuesheet = new() + { + Title = "ImportCuesheet" + }; + viewOptions.ActiveTab = ViewMode.ImportView; + await _localStorageOptionsProvider.Object.SaveOptionsAsync(viewOptions); + Boolean activeCuesheetChangedEventTriggered = false; + _sessionStateContainer.ActiveCuesheetChanged += delegate + { + activeCuesheetChangedEventTriggered = true; + }; + await _localStorageOptionsProvider.Object.SaveOptionsAsync(viewOptions); // Act - var result = _sessionStateContainer.GetActiveCuesheet(); + var cuesheet = _sessionStateContainer.ActiveCuesheet; // Assert - Assert.AreEqual(_sessionStateContainer.Cuesheet, result); + Assert.AreEqual(_sessionStateContainer.ImportCuesheet, cuesheet); + Assert.IsFalse(activeCuesheetChangedEventTriggered); } [TestMethod] - public async Task GetActiveCuesheet_InitializedWithImportView_ReturnsDetailViewCuesheeetAsync() + public async Task ActiveCuesheet_InitializedWithImportView_ReturnsDetailViewCuesheet() { // Arrange var viewOptions = new ViewOptions() @@ -132,19 +248,19 @@ public async Task GetActiveCuesheet_InitializedWithImportView_ReturnsDetailViewC _localStorageOptionsProvider.Setup(x => x.GetOptionsAsync()).ReturnsAsync(viewOptions); await _sessionStateContainer.InitializeAsync(); // Act - var result = _sessionStateContainer.GetActiveCuesheet(); + var result = _sessionStateContainer.ActiveCuesheet; // Assert Assert.AreEqual(_sessionStateContainer.ImportCuesheet, result); } [TestMethod] - public void GetActiveCuesheet_NotInitialized_ThrowsException() + public void ActiveCuesheet_NotInitialized_ReturnsNull() { // Arrange // Act - var exception = Assert.Throws(() => _sessionStateContainer.GetActiveCuesheet()); + var cuesheet = _sessionStateContainer.ActiveCuesheet; // Assert - Assert.AreEqual("Not initialized!", exception.Message); + Assert.IsNull(cuesheet); } } } \ No newline at end of file diff --git a/AudioCuesheetEditor/Services/AudioCuesheet/AudiofileManager.cs b/AudioCuesheetEditor/Services/AudioCuesheet/AudiofileManager.cs index a169a3cb..5f101ac4 100644 --- a/AudioCuesheetEditor/Services/AudioCuesheet/AudiofileManager.cs +++ b/AudioCuesheetEditor/Services/AudioCuesheet/AudiofileManager.cs @@ -80,7 +80,7 @@ public void AddTrack(Audiofile audiofile, Track track, Boolean setTracing = true { _traceChangeManager.BulkEdit = true; } - var cuesheet = _sessionStateContainer.GetActiveCuesheet(); + var cuesheet = _sessionStateContainer.ActiveCuesheet; track.Cuesheet = cuesheet; track.Audiofile = audiofile; if ((cuesheet?.IsRecording == true) && cuesheet.Audiofiles.SelectMany(x => x.Tracks).Any(x => x.Position >= 1)) @@ -107,7 +107,7 @@ public void AddTrack(Audiofile audiofile, Track track, Boolean setTracing = true /// public void RemoveTracks(Audiofile audiofile, IEnumerable tracksToRemove, Boolean setTracing = true) { - var cuesheet = _sessionStateContainer.GetActiveCuesheet(); + var cuesheet = _sessionStateContainer.ActiveCuesheet; var intersection = audiofile.Tracks.Intersect(tracksToRemove); foreach (var track in intersection) { @@ -194,7 +194,7 @@ void RecalculateTrackProperties(Cuesheet cuesheet) } } - Track? GetLastTrack(Audiofile audiofile) + static Track? GetLastTrack(Audiofile audiofile) { return audiofile.Tracks.OrderByDescending(x => x.Position.HasValue).ThenBy(x => x.Position) .ThenByDescending(x => x.Begin.HasValue).ThenBy(x => x.Begin) diff --git a/AudioCuesheetEditor/Services/AudioCuesheet/CuesheetManager.cs b/AudioCuesheetEditor/Services/AudioCuesheet/CuesheetManager.cs index 5ba287d8..2cc9153c 100644 --- a/AudioCuesheetEditor/Services/AudioCuesheet/CuesheetManager.cs +++ b/AudioCuesheetEditor/Services/AudioCuesheet/CuesheetManager.cs @@ -37,7 +37,7 @@ public class CuesheetManager(ITraceChangeManager traceChangeManager, ISessionSta public void SetProperty(Expression> propertyExpression, TProperty value) { _traceChangeManager.BulkEdit = true; - var cuesheet = _sessionStateContainer.GetActiveCuesheet(); + var cuesheet = _sessionStateContainer.ActiveCuesheet; SetValue(cuesheet!, propertyExpression, value); _traceChangeManager.BulkEdit = false; } @@ -107,7 +107,7 @@ public bool IsMoveUpPossible(HashSet selectedAudiofiles) { return false; } - var cuesheet = _sessionStateContainer.GetActiveCuesheet(); + var cuesheet = _sessionStateContainer.ActiveCuesheet; if (cuesheet?.Audiofiles.Count > 0) { return !selectedAudiofiles.Contains(cuesheet.Audiofiles.First()); @@ -116,7 +116,7 @@ public bool IsMoveUpPossible(HashSet selectedAudiofiles) } /// - public bool IsMoveDownPossible(HashSet selectedTracks) => selectedTracks.Count > 0 && selectedTracks.Max(x => x.Position) < _sessionStateContainer.GetActiveCuesheet()?.Audiofiles.SelectMany(x => x.Tracks).Max(x => x.Position); + public bool IsMoveDownPossible(HashSet selectedTracks) => selectedTracks.Count > 0 && selectedTracks.Max(x => x.Position) < _sessionStateContainer.ActiveCuesheet?.Audiofiles.SelectMany(x => x.Tracks).Max(x => x.Position); /// public bool IsMoveDownPossible(HashSet selectedAudiofiles) @@ -125,7 +125,7 @@ public bool IsMoveDownPossible(HashSet selectedAudiofiles) { return false; } - var cuesheet = _sessionStateContainer.GetActiveCuesheet(); + var cuesheet = _sessionStateContainer.ActiveCuesheet; if (cuesheet?.Audiofiles.Count > 0) { return !selectedAudiofiles.Contains(cuesheet.Audiofiles.Last()); @@ -141,7 +141,7 @@ public Result MoveUp(HashSet selectedTracks) return Result.Failure(new Error(ErrorType.NotPossible, "Moving tracks up is not possible!")); } _traceChangeManager.BulkEdit = true; - var cuesheet = _sessionStateContainer.GetActiveCuesheet(); + var cuesheet = _sessionStateContainer.ActiveCuesheet; foreach (var selectedTrack in selectedTracks.OrderBy(x => x.Position)) { var previousTrack = cuesheet?.Audiofiles.SelectMany(x => x.Tracks).FirstOrDefault(x => x.Position == selectedTrack.Position - 1); @@ -181,7 +181,7 @@ public Result MoveUp(HashSet selectedAudiofiles) { return Result.Failure(new Error(ErrorType.NotPossible, "Moving audiofiles up is not possible!")); } - var cuesheet = _sessionStateContainer.GetActiveCuesheet(); + var cuesheet = _sessionStateContainer.ActiveCuesheet; _traceChangeManager.BulkEdit = true; var newAudiofiles = new List(cuesheet!.Audiofiles); foreach (var audiofile in selectedAudiofiles) @@ -216,7 +216,7 @@ public Result MoveDown(HashSet selectedTracks) return Result.Failure(new Error(ErrorType.NotPossible, "Moving tracks down is not possible!")); } _traceChangeManager.BulkEdit = true; - var cuesheet = _sessionStateContainer.GetActiveCuesheet(); + var cuesheet = _sessionStateContainer.ActiveCuesheet; foreach (var selectedTrack in selectedTracks.OrderByDescending(x => x.Position)) { var nextTrack = cuesheet?.Audiofiles.SelectMany(x => x.Tracks).FirstOrDefault(x => x.Position == selectedTrack.Position + 1); @@ -255,7 +255,7 @@ public Result MoveDown(HashSet selectedAudiofiles) { return Result.Failure(new Error(ErrorType.NotPossible, "Moving audiofiles down is not possible!")); } - var cuesheet = _sessionStateContainer.GetActiveCuesheet(); + var cuesheet = _sessionStateContainer.ActiveCuesheet; _traceChangeManager.BulkEdit = true; var newAudiofiles = new List(cuesheet!.Audiofiles); foreach (var audiofile in selectedAudiofiles) diff --git a/AudioCuesheetEditor/Services/UI/ISessionStateContainer.cs b/AudioCuesheetEditor/Services/UI/ISessionStateContainer.cs index 24ed1896..a4ea5331 100644 --- a/AudioCuesheetEditor/Services/UI/ISessionStateContainer.cs +++ b/AudioCuesheetEditor/Services/UI/ISessionStateContainer.cs @@ -21,8 +21,7 @@ namespace AudioCuesheetEditor.Services.UI { public interface ISessionStateContainer { - public event EventHandler? CuesheetChanged; - public event EventHandler? ImportCuesheetChanged; + public event EventHandler? ActiveCuesheetChanged; public Cuesheet Cuesheet { get; set; } public Cuesheet? ImportCuesheet { get; set; } public IList ImportAudiofiles { get; set; } @@ -37,7 +36,6 @@ public interface ISessionStateContainer /// /// Get current cuesheet based on current view /// - /// - public Cuesheet? GetActiveCuesheet(); + public Cuesheet? ActiveCuesheet { get; } } } diff --git a/AudioCuesheetEditor/Services/UI/SessionStateContainer.cs b/AudioCuesheetEditor/Services/UI/SessionStateContainer.cs index 97cb8361..d177360c 100644 --- a/AudioCuesheetEditor/Services/UI/SessionStateContainer.cs +++ b/AudioCuesheetEditor/Services/UI/SessionStateContainer.cs @@ -27,11 +27,11 @@ public class SessionStateContainer : ISessionStateContainer, IDisposable private Cuesheet _cuesheet = new(); private Cuesheet? _importCuesheet; + private Cuesheet? _activeCuesheet; private ViewOptions? _viewOptions; private bool disposedValue; - public event EventHandler? CuesheetChanged; - public event EventHandler? ImportCuesheetChanged; + public event EventHandler? ActiveCuesheetChanged; public SessionStateContainer(ILocalStorageOptionsProvider localStorageOptionsProvider) { @@ -51,7 +51,7 @@ public Cuesheet Cuesheet set { _cuesheet = value; - CuesheetChanged?.Invoke(this, EventArgs.Empty); + SetActiveCuesheet(); } } public Cuesheet? ImportCuesheet @@ -60,17 +60,18 @@ public Cuesheet? ImportCuesheet set { _importCuesheet = value; - ImportCuesheetChanged?.Invoke(this, EventArgs.Empty); + SetActiveCuesheet(); } } public IList ImportAudiofiles { get; set; } = []; - public IImportfile? Importfile{ get; set; } + public IImportfile? Importfile { get; set; } public Boolean ImportIsAnalyzed { get; set; } = false; /// public async Task InitializeAsync() { _viewOptions ??= await _localStorageOptionsProvider.GetOptionsAsync(); + SetActiveCuesheet(); } public void ResetImport() @@ -78,21 +79,11 @@ public void ResetImport() Importfile = null; ImportAudiofiles = []; ImportCuesheet = null; + ImportIsAnalyzed = false; } /// - public Cuesheet? GetActiveCuesheet() - { - if (_viewOptions == null) - { - throw new InvalidOperationException("Not initialized!"); - } - if (_viewOptions.ActiveTab == ViewMode.ImportView) - { - return ImportCuesheet; - } - return Cuesheet; - } + public Cuesheet? ActiveCuesheet => _activeCuesheet; protected virtual void Dispose(bool disposing) { @@ -106,11 +97,36 @@ protected virtual void Dispose(bool disposing) } } - private void LocalStorageOptionsProvider_OptionSaved(object? sender, IOptions options) + void LocalStorageOptionsProvider_OptionSaved(object? sender, IOptions options) { if (options is ViewOptions viewOptions) { _viewOptions = viewOptions; + SetActiveCuesheet(); + } + } + + void SetActiveCuesheet() + { + if (_viewOptions == null) + { + throw new InvalidOperationException("Not initialized!"); + } + if (_viewOptions.ActiveTab == ViewMode.ImportView) + { + if (_activeCuesheet != ImportCuesheet) + { + _activeCuesheet = ImportCuesheet; + ActiveCuesheetChanged?.Invoke(this, EventArgs.Empty); + } + } + else + { + if (_activeCuesheet != Cuesheet) + { + _activeCuesheet = Cuesheet; + ActiveCuesheetChanged?.Invoke(this, EventArgs.Empty); + } } } } diff --git a/AudioCuesheetEditor/Shared/Cuesheet/Audiofiles.razor b/AudioCuesheetEditor/Shared/Cuesheet/Audiofiles.razor index c422360c..29222814 100644 --- a/AudioCuesheetEditor/Shared/Cuesheet/Audiofiles.razor +++ b/AudioCuesheetEditor/Shared/Cuesheet/Audiofiles.razor @@ -19,8 +19,6 @@ along with Foobar. If not, see @inject IStringLocalizer _localizer @inject IStringLocalizer _validationMessageLocalizer -@inject ISessionStateContainer _sessionStateContainer -@inject ICuesheetManager _cuesheetManager @inject IAudiofileManager _audiofileManager @inject IDialogService _dialogService @@ -28,7 +26,7 @@ along with Foobar. If not, see { case ViewMode.DetailView: case ViewMode.ImportView: - var validationResult = _cuesheet?.Validate(nameof(Cuesheet.Audiofiles)); + var validationResult = Cuesheet?.Validate(nameof(Cuesheet.Audiofiles)); if (validationResult?.Status == ValidationStatus.Error) { @@ -66,7 +64,9 @@ along with Foobar. If not, see @code { - Cuesheet? _cuesheet => _sessionStateContainer.GetActiveCuesheet(); + [Parameter] + [EditorRequired] + public Cuesheet? Cuesheet { get; set; } [Parameter] [EditorRequired] diff --git a/AudioCuesheetEditor/Shared/Cuesheet/CuesheetData.razor b/AudioCuesheetEditor/Shared/Cuesheet/CuesheetData.razor index 097d8ee1..f42de74b 100644 --- a/AudioCuesheetEditor/Shared/Cuesheet/CuesheetData.razor +++ b/AudioCuesheetEditor/Shared/Cuesheet/CuesheetData.razor @@ -24,20 +24,20 @@ along with Foobar. If not, see @inject ISessionStateContainer _sessionStateContainer @inject ICuesheetManager _cuesheetManager -@if (_cuesheet != null) +@if (Cuesheet != null) { - - + - @switch(CurrentViewMode) { case ViewMode.ImportView: case ViewMode.DetailView: - - + break; @@ -46,10 +46,13 @@ along with Foobar. If not, see } @code { + [Parameter] + [EditorRequired] + public Cuesheet? Cuesheet { get; set; } + [CascadingParameter] public ViewMode CurrentViewMode { get; set; } - Cuesheet? _cuesheet => _sessionStateContainer.GetActiveCuesheet(); string? _catalogueNumber; MudForm? _form; MudTextField? _catalogueNumberTextField; @@ -59,8 +62,6 @@ along with Foobar. If not, see base.OnInitialized(); TraceChangeManager.UndoDone += TraceChangeManager_UndoDone; TraceChangeManager.RedoDone += TraceChangeManager_RedoDone; - _sessionStateContainer.CuesheetChanged += SessionStateContainer_CuesheetChanged; - _sessionStateContainer.ImportCuesheetChanged += SessionStateContainer_ImportCuesheetChanged; } protected override void Dispose(bool disposing) @@ -68,19 +69,17 @@ along with Foobar. If not, see base.Dispose(disposing); TraceChangeManager.UndoDone -= TraceChangeManager_UndoDone; TraceChangeManager.RedoDone -= TraceChangeManager_RedoDone; - _sessionStateContainer.CuesheetChanged -= SessionStateContainer_CuesheetChanged; - _sessionStateContainer.ImportCuesheetChanged -= SessionStateContainer_ImportCuesheetChanged; } protected override void OnParametersSet() { base.OnParametersSet(); - _catalogueNumber = _cuesheet?.Cataloguenumber; + _catalogueNumber = Cuesheet?.Cataloguenumber; } void OnCDTextfileSelected(IBrowserFile? browserFile) { - if (_cuesheet == null) + if (Cuesheet == null) { return; } @@ -94,10 +93,10 @@ along with Foobar. If not, see async Task CDTextFileRename() { - var newFileName = await ShowInputDialog(_cuesheet?.CDTextfile?.Name); + var newFileName = await ShowInputDialog(Cuesheet?.CDTextfile?.Name); if (String.IsNullOrEmpty(newFileName) == false) { - var cdTextFile = _cuesheet?.CDTextfile; + var cdTextFile = Cuesheet?.CDTextfile; if (cdTextFile != null) { cdTextFile.Name = newFileName; @@ -135,23 +134,13 @@ along with Foobar. If not, see void TraceChangeManager_RedoDone(object? sender, EventArgs e) { - _catalogueNumber = _cuesheet?.Cataloguenumber; + _catalogueNumber = Cuesheet?.Cataloguenumber; _catalogueNumberTextField?.ResetAsync(); } void TraceChangeManager_UndoDone(object? sender, EventArgs e) { - _catalogueNumber = _cuesheet?.Cataloguenumber; + _catalogueNumber = Cuesheet?.Cataloguenumber; _catalogueNumberTextField?.ResetAsync(); } - - void SessionStateContainer_CuesheetChanged(object? sender, EventArgs args) - { - StateHasChanged(); - } - - void SessionStateContainer_ImportCuesheetChanged(object? sender, EventArgs args) - { - StateHasChanged(); - } } diff --git a/AudioCuesheetEditor/Shared/Import/DisplayAnalyzedResult.razor b/AudioCuesheetEditor/Shared/Import/DisplayAnalyzedResult.razor index 99cee2d2..c7d5889e 100644 --- a/AudioCuesheetEditor/Shared/Import/DisplayAnalyzedResult.razor +++ b/AudioCuesheetEditor/Shared/Import/DisplayAnalyzedResult.razor @@ -36,22 +36,25 @@ along with Foobar. If not, see } else { - - - @_localizer["Common data"] - - - - - - - - @_localizer["Files"] - - - - - + @if (_sessionStateContainer.ImportCuesheet != null) + { + + + @_localizer["Common data"] + + + + + + + + @_localizer["Files"] + + + + + + } } @code { diff --git a/AudioCuesheetEditor/Shared/ViewModes/ViewModeFull.razor b/AudioCuesheetEditor/Shared/ViewModes/ViewModeFull.razor index 9ca20ac7..dd1e6010 100644 --- a/AudioCuesheetEditor/Shared/ViewModes/ViewModeFull.razor +++ b/AudioCuesheetEditor/Shared/ViewModes/ViewModeFull.razor @@ -27,7 +27,7 @@ along with Foobar. If not, see @_localizer["Common data"] - + @@ -65,7 +65,7 @@ along with Foobar. If not, see - + @@ -80,10 +80,22 @@ along with Foobar. If not, see @code { - Cuesheet? _cuesheet => _sessionStateContainer.GetActiveCuesheet(); + Cuesheet? _cuesheet => _sessionStateContainer.ActiveCuesheet; ICollection _audiofiles => _cuesheet != null ? _cuesheet.Audiofiles : []; HashSet _selectedAudiofiles = []; + protected override void OnInitialized() + { + base.OnInitialized(); + _sessionStateContainer.ActiveCuesheetChanged += SessionStateContainer_ActiveCuesheetChanged; + } + + protected override void Dispose(bool disposing) + { + base.Dispose(disposing); + _sessionStateContainer.ActiveCuesheetChanged -= SessionStateContainer_ActiveCuesheetChanged; + } + void AddButtonClicked() { var files = new List(_audiofiles); @@ -113,4 +125,9 @@ along with Foobar. If not, see _cuesheetManager.SetProperty(x => x.Audiofiles, files); } } + + void SessionStateContainer_ActiveCuesheetChanged(object? sender, EventArgs args) + { + StateHasChanged(); + } } \ No newline at end of file diff --git a/AudioCuesheetEditor/Shared/ViewModes/ViewModeRecord.razor b/AudioCuesheetEditor/Shared/ViewModes/ViewModeRecord.razor index c8c589b0..b993b1d8 100644 --- a/AudioCuesheetEditor/Shared/ViewModes/ViewModeRecord.razor +++ b/AudioCuesheetEditor/Shared/ViewModes/ViewModeRecord.razor @@ -38,7 +38,7 @@ along with Foobar. If not, see @_localizer["Common data"] - +