diff --git a/src/Gemini/Modules/Settings/ISettingsEditor.cs b/src/Gemini/Modules/Settings/ISettingsEditor.cs index f6493fa4..e758a882 100644 --- a/src/Gemini/Modules/Settings/ISettingsEditor.cs +++ b/src/Gemini/Modules/Settings/ISettingsEditor.cs @@ -1,4 +1,4 @@ -namespace Gemini.Modules.Settings +namespace Gemini.Modules.Settings { public interface ISettingsEditor { @@ -7,4 +7,4 @@ public interface ISettingsEditor void ApplyChanges(); } -} \ No newline at end of file +} diff --git a/src/Gemini/Modules/Settings/ISettingsEditorAsync.cs b/src/Gemini/Modules/Settings/ISettingsEditorAsync.cs new file mode 100644 index 00000000..9e20162a --- /dev/null +++ b/src/Gemini/Modules/Settings/ISettingsEditorAsync.cs @@ -0,0 +1,12 @@ +using System.Threading.Tasks; + +namespace Gemini.Modules.Settings +{ + public interface ISettingsEditorAsync + { + string SettingsPageName { get; } + string SettingsPagePath { get; } + + Task ApplyChangesAsync(); + } +} diff --git a/src/Gemini/Modules/Settings/ViewModels/SettingsEditorWrapper.cs b/src/Gemini/Modules/Settings/ViewModels/SettingsEditorWrapper.cs new file mode 100644 index 00000000..a493b5f5 --- /dev/null +++ b/src/Gemini/Modules/Settings/ViewModels/SettingsEditorWrapper.cs @@ -0,0 +1,26 @@ +using System.Threading.Tasks; + +namespace Gemini.Modules.Settings.ViewModels +{ + internal sealed class SettingsEditorWrapper : ISettingsEditorAsync + { + private readonly ISettingsEditor _editor; + + public SettingsEditorWrapper(ISettingsEditor editor) + { + _editor = editor; + } + + public string SettingsPageName => _editor.SettingsPageName; + + public string SettingsPagePath => _editor.SettingsPagePath; + + public ISettingsEditor ViewModel => _editor; + + public Task ApplyChangesAsync() + { + _editor.ApplyChanges(); + return Task.CompletedTask; + } + } +} diff --git a/src/Gemini/Modules/Settings/ViewModels/SettingsPageViewModel.cs b/src/Gemini/Modules/Settings/ViewModels/SettingsPageViewModel.cs index 4e7268cb..1ab2728b 100644 --- a/src/Gemini/Modules/Settings/ViewModels/SettingsPageViewModel.cs +++ b/src/Gemini/Modules/Settings/ViewModels/SettingsPageViewModel.cs @@ -7,11 +7,13 @@ public class SettingsPageViewModel public SettingsPageViewModel() { Children = new List(); - Editors = new List(); + Editors = new List(); } public string Name { get; set; } - public List Editors { get; private set; } - public List Children { get; internal set; } + + public List Editors { get; } // ISettingsEditor or ISettingsEditorAsync + + public List Children { get; } } } diff --git a/src/Gemini/Modules/Settings/ViewModels/SettingsViewModel.cs b/src/Gemini/Modules/Settings/ViewModels/SettingsViewModel.cs index 2ec4c32a..a4288ab5 100644 --- a/src/Gemini/Modules/Settings/ViewModels/SettingsViewModel.cs +++ b/src/Gemini/Modules/Settings/ViewModels/SettingsViewModel.cs @@ -4,7 +4,6 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; -using System.Windows.Input; using Caliburn.Micro; using Gemini.Framework; using Gemini.Properties; @@ -15,7 +14,7 @@ namespace Gemini.Modules.Settings.ViewModels [PartCreationPolicy (CreationPolicy.NonShared)] public class SettingsViewModel : WindowBase { - private IEnumerable _settingsEditors; + private IEnumerable _settingsEditors; private SettingsPageViewModel _selectedPage; public SettingsViewModel() @@ -40,7 +39,8 @@ protected override async Task OnInitializeAsync(CancellationToken cancellationTo await base.OnInitializeAsync(cancellationToken); var pages = new List(); - _settingsEditors = IoC.GetAll(); + + _settingsEditors = IoC.GetAll().Concat(IoC.GetAll().Select(e => new SettingsEditorWrapper(e))); foreach (var settingsEditor in _settingsEditors) { @@ -50,14 +50,11 @@ protected override async Task OnInitializeAsync(CancellationToken cancellationTo if (page == null) { - page = new SettingsPageViewModel - { - Name = settingsEditor.SettingsPageName, - }; + page = new SettingsPageViewModel { Name = settingsEditor.SettingsPageName }; parentCollection.Add(page); } - page.Editors.Add(settingsEditor); + page.Editors.Add(settingsEditor is SettingsEditorWrapper wrapper ? (object)wrapper.ViewModel : (object)settingsEditor); } Pages = pages; @@ -76,7 +73,7 @@ private static SettingsPageViewModel GetFirstLeafPageRecursive(List GetParentCollection(ISettingsEditor settingsEditor, + private List GetParentCollection(ISettingsEditorAsync settingsEditor, List pages) { if (string.IsNullOrEmpty(settingsEditor.SettingsPagePath)) @@ -92,7 +89,7 @@ private List GetParentCollection(ISettingsEditor settings if (page == null) { - page = new SettingsPageViewModel {Name = pathElement}; + page = new SettingsPageViewModel { Name = pathElement }; pages.Add(page); } @@ -106,7 +103,7 @@ public async Task SaveChanges() { foreach (var settingsEditor in _settingsEditors) { - settingsEditor.ApplyChanges(); + await settingsEditor.ApplyChangesAsync(); } await TryCloseAsync(true);