diff --git a/Mystify/App.axaml.cs b/Mystify/App.axaml.cs index 05450d4..f408826 100644 --- a/Mystify/App.axaml.cs +++ b/Mystify/App.axaml.cs @@ -14,6 +14,7 @@ using Lib.Logging.Loggers.Interfaces; using Lib.NotifyIcon; using Lib.ProcessManaging.Interfaces; using LightweightIocContainer.Interfaces; +using Mystify.Settings.Interfaces; using Mystify.ViewModels; using Mystify.Views; using ReactiveUI; @@ -28,6 +29,8 @@ namespace Mystify private IProcessManager? _processManager; private INotifyIcon? _notifyIcon; + private ISettingsManager? _settingsManager; + private MainModel? _mainModel; private MainWindow? _mainWindow; private MainWindowViewModel? _mainWindowViewModel; @@ -52,6 +55,8 @@ namespace Mystify _processManager = _kernel.Resolve(); _processManager.Initialize(); + + _settingsManager = _kernel.Resolve(); _mainModel = _kernel.Resolve(); _mainWindow = new MainWindow(); @@ -92,8 +97,11 @@ namespace Mystify private async void OnExit(object? sender, ControlledApplicationLifetimeExitEventArgs args) //TODO: return Task? { + _settingsManager?.Save(); + _mainWindow?.Close(); _mainModel?.Dispose(); + _notifyIcon?.Remove(); _processManager?.Dispose(); diff --git a/Mystify/Installers/MainInstaller.cs b/Mystify/Installers/MainInstaller.cs index be2dffd..b94c0cc 100644 --- a/Mystify/Installers/MainInstaller.cs +++ b/Mystify/Installers/MainInstaller.cs @@ -2,8 +2,11 @@ // Created: 2021-04-09 // Copyright(c) 2021 SimonG. All Rights Reserved. +using LightweightIocContainer; using LightweightIocContainer.Interfaces; using LightweightIocContainer.Interfaces.Installers; +using Mystify.Settings; +using Mystify.Settings.Interfaces; namespace Mystify.Installers { @@ -12,6 +15,7 @@ namespace Mystify.Installers public void Install(IIocContainer container) { container.Register(); + container.Register(Lifestyle.Singleton); } } } \ No newline at end of file diff --git a/Mystify/MainModel.cs b/Mystify/MainModel.cs index 968b4dc..2f5ef15 100644 --- a/Mystify/MainModel.cs +++ b/Mystify/MainModel.cs @@ -8,6 +8,7 @@ using Lib.Audio.Factories; using Lib.Audio.Interfaces; using Lib.Driver.Factories; using Lib.Driver.Interfaces; +using Mystify.Settings.Interfaces; namespace Mystify { @@ -16,16 +17,27 @@ namespace Mystify private readonly IDriverLoader _driverLoader; private readonly IDeviceFactory _deviceFactory; private readonly IControllableCollectorFactory _controllableCollectorFactory; + + private readonly ISettings _settings; private IDevice? _device; private IControllableCollector? _controllableCollector; - public MainModel(IDriverLoaderFactory driverLoaderFactory, IDeviceFactory deviceFactory, IControllableCollectorFactory controllableCollectorFactory, IControllableFactory controllableFactory) + public MainModel(IDriverLoaderFactory driverLoaderFactory, + ISettingsManager settingsManager, + IDeviceFactory deviceFactory, + IControllableCollectorFactory controllableCollectorFactory, + IControllableFactory controllableFactory) { _driverLoader = driverLoaderFactory.Create(); _deviceFactory = deviceFactory; _controllableCollectorFactory = controllableCollectorFactory; ControllableFactory = controllableFactory; + + _settings = settingsManager.Settings; + + if (!string.IsNullOrEmpty(_settings.LastDriverPath)) + LoadDriverAndDevice(_settings.LastDriverPath); } public string? DeviceName => _device?.Name; @@ -42,6 +54,8 @@ namespace Mystify if (driver == null) throw new Exception("Driver could not be loaded."); + + _settings.LastDriverPath = driverPath; _controllableCollector = _controllableCollectorFactory.Create(); _device = _deviceFactory.Create(driver, _controllableCollector); diff --git a/Mystify/Settings/Interfaces/ISettings.cs b/Mystify/Settings/Interfaces/ISettings.cs new file mode 100644 index 0000000..ff9fcd0 --- /dev/null +++ b/Mystify/Settings/Interfaces/ISettings.cs @@ -0,0 +1,11 @@ +// Author: Gockner, Simon +// Created: 2021-04-26 +// Copyright(c) 2021 SimonG. All Rights Reserved. + +namespace Mystify.Settings.Interfaces +{ + public interface ISettings + { + string? LastDriverPath { get; set; } + } +} \ No newline at end of file diff --git a/Mystify/Settings/Interfaces/ISettingsManager.cs b/Mystify/Settings/Interfaces/ISettingsManager.cs new file mode 100644 index 0000000..3dd35bd --- /dev/null +++ b/Mystify/Settings/Interfaces/ISettingsManager.cs @@ -0,0 +1,15 @@ +// Author: Gockner, Simon +// Created: 2021-04-26 +// Copyright(c) 2021 SimonG. All Rights Reserved. + +using System; + +namespace Mystify.Settings.Interfaces +{ + public interface ISettingsManager + { + ISettings Settings { get; } + + void Save(); + } +} \ No newline at end of file diff --git a/Mystify/Settings/SettingsManager.cs b/Mystify/Settings/SettingsManager.cs new file mode 100644 index 0000000..7b877ca --- /dev/null +++ b/Mystify/Settings/SettingsManager.cs @@ -0,0 +1,49 @@ +// Author: Gockner, Simon +// Created: 2021-04-26 +// Copyright(c) 2021 SimonG. All Rights Reserved. + +using System; +using System.IO; +using System.Xml; +using System.Xml.Serialization; +using Mystify.Settings.Interfaces; +using Mystify.Settings.Xml; + +namespace Mystify.Settings +{ + public class SettingsManager : ISettingsManager + { + private const string SETTINGS_FILE_EXTENSION = "mys"; + private readonly string _settingsFilePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Mystify", $"Settings.{SETTINGS_FILE_EXTENSION}"); + + private ISettings? _settings; + + public ISettings Settings => _settings ??= Load(); + + public void Save() + { + FileStream file = File.OpenWrite(_settingsFilePath); + + XmlWriter xmlWriter = XmlWriter.Create(file, new XmlWriterSettings {Indent = true}); + XmlSerializer xmlSerializer = new(typeof(XmlSettings)); + + XmlSerializerNamespaces xmlSerializerNamespaces = new(); + xmlSerializerNamespaces.Add("", ""); + + xmlSerializer.Serialize(xmlWriter, Settings, xmlSerializerNamespaces); + } + + private ISettings Load() + { + if (!File.Exists(_settingsFilePath)) + return new XmlSettings(); + + FileStream file = File.OpenRead(_settingsFilePath); + + XmlReader xmlReader = XmlReader.Create(file); + XmlSerializer xmlSerializer = new(typeof(XmlSettings)); + + return (XmlSettings?) xmlSerializer.Deserialize(xmlReader) ?? new XmlSettings(); + } + } +} \ No newline at end of file diff --git a/Mystify/Settings/Xml/XmlSettings.cs b/Mystify/Settings/Xml/XmlSettings.cs new file mode 100644 index 0000000..31a9f38 --- /dev/null +++ b/Mystify/Settings/Xml/XmlSettings.cs @@ -0,0 +1,16 @@ +// Author: Gockner, Simon +// Created: 2021-04-26 +// Copyright(c) 2021 SimonG. All Rights Reserved. + +using System.Xml.Serialization; +using Mystify.Settings.Interfaces; + +namespace Mystify.Settings.Xml +{ + [XmlRoot("MystifySettings")] + public class XmlSettings : ISettings + { + [XmlElement] + public string? LastDriverPath { get; set; } + } +} \ No newline at end of file