From 54fcbdb73262e52a5b153c733c6a9719cfd02a9b Mon Sep 17 00:00:00 2001 From: SpoinkyNL Date: Mon, 4 Nov 2019 21:36:46 +0100 Subject: [PATCH] Cleaned up setting service, lol old approach was dumb Made PluginSetting act as a singleton --- .../Plugins/Models/PluginSetting.cs | 22 ++++++------- .../Plugins/Models/PluginSettings.cs | 26 +++++++++------ src/Artemis.Core/Services/RgbService.cs | 14 ++++++-- src/Artemis.Core/Services/SettingsService.cs | 27 +++------------ .../ViewModels/Screens/DebugViewModel.cs | 3 ++ .../ViewModels/Screens/SettingsViewModel.cs | 33 ++++++++++++++----- 6 files changed, 70 insertions(+), 55 deletions(-) diff --git a/src/Artemis.Core/Plugins/Models/PluginSetting.cs b/src/Artemis.Core/Plugins/Models/PluginSetting.cs index 219234956..f2608249d 100644 --- a/src/Artemis.Core/Plugins/Models/PluginSetting.cs +++ b/src/Artemis.Core/Plugins/Models/PluginSetting.cs @@ -8,12 +8,13 @@ using Stylet; namespace Artemis.Core.Plugins.Models { - public class PluginSetting : PropertyChangedBase + public class PluginSetting { // ReSharper disable once NotAccessedField.Local private readonly PluginInfo _pluginInfo; private readonly PluginSettingEntity _pluginSettingEntity; private readonly IPluginSettingRepository _pluginSettingRepository; + private T _value; internal PluginSetting(PluginInfo pluginInfo, IPluginSettingRepository pluginSettingRepository, PluginSettingEntity pluginSettingEntity) { @@ -23,15 +24,6 @@ namespace Artemis.Core.Plugins.Models Name = pluginSettingEntity.Name; Value = JsonConvert.DeserializeObject(pluginSettingEntity.Value); - - // PropertyChanged is for bindings, but we can use it here to create a easy to use SettingsChanged event - PropertyChanged += OnPropertyChanged; - } - - private void OnPropertyChanged(object sender, PropertyChangedEventArgs e) - { - if (e.PropertyName == nameof(Value)) - OnSettingChanged(); } /// @@ -42,7 +34,15 @@ namespace Artemis.Core.Plugins.Models /// /// The value of the setting /// - public T Value { get; set; } + public T Value + { + get => _value; + set + { + _value = value; + OnSettingChanged(); + } + } /// /// Determines whether the setting has been changed diff --git a/src/Artemis.Core/Plugins/Models/PluginSettings.cs b/src/Artemis.Core/Plugins/Models/PluginSettings.cs index dd1c1b967..f495c9e08 100644 --- a/src/Artemis.Core/Plugins/Models/PluginSettings.cs +++ b/src/Artemis.Core/Plugins/Models/PluginSettings.cs @@ -1,5 +1,4 @@ using System.Collections.Generic; -using System.Linq; using Artemis.Storage.Entities; using Artemis.Storage.Repositories.Interfaces; using Newtonsoft.Json; @@ -14,13 +13,13 @@ namespace Artemis.Core.Plugins.Models { private readonly PluginInfo _pluginInfo; private readonly IPluginSettingRepository _pluginSettingRepository; - private readonly Dictionary _settingEntities; + private readonly Dictionary _settingEntities; internal PluginSettings(PluginInfo pluginInfo, IPluginSettingRepository pluginSettingRepository) { _pluginInfo = pluginInfo; _pluginSettingRepository = pluginSettingRepository; - _settingEntities = pluginSettingRepository.GetByPluginGuid(_pluginInfo.Guid).ToDictionary(se => se.Name); + _settingEntities = new Dictionary(); } /// @@ -34,15 +33,22 @@ namespace Artemis.Core.Plugins.Models { lock (_settingEntities) { + // Return cached value if available if (_settingEntities.ContainsKey(name)) - return new PluginSetting(_pluginInfo, _pluginSettingRepository, _settingEntities[name]); + return (PluginSetting) _settingEntities[name]; + // Try to find in database + var settingEntity = _pluginSettingRepository.GetByNameAndPluginGuid(name, _pluginInfo.Guid); + // If not found, create a new one + if (settingEntity == null) + { + settingEntity = new PluginSettingEntity {Name = name, PluginGuid = _pluginInfo.Guid, Value = JsonConvert.SerializeObject(defaultValue)}; + _pluginSettingRepository.Add(settingEntity); + _pluginSettingRepository.Save(); + } - var settingEntity = new PluginSettingEntity {Name = name, PluginGuid = _pluginInfo.Guid, Value = JsonConvert.SerializeObject(defaultValue)}; - _pluginSettingRepository.Add(settingEntity); - _pluginSettingRepository.Save(); - - _settingEntities.Add(name, settingEntity); - return new PluginSetting(_pluginInfo, _pluginSettingRepository, _settingEntities[name]); + var pluginSetting = new PluginSetting(_pluginInfo, _pluginSettingRepository, settingEntity); + _settingEntities.Add(name, pluginSetting); + return pluginSetting; } } } diff --git a/src/Artemis.Core/Services/RgbService.cs b/src/Artemis.Core/Services/RgbService.cs index 47ee3d9e4..b968091b2 100644 --- a/src/Artemis.Core/Services/RgbService.cs +++ b/src/Artemis.Core/Services/RgbService.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using Artemis.Core.Events; using Artemis.Core.Plugins.Models; using Artemis.Core.RGB.NET; @@ -21,21 +22,25 @@ namespace Artemis.Core.Services private readonly ILogger _logger; private readonly TimerUpdateTrigger _updateTrigger; private ListLedGroup _background; - private PluginSetting _renderScaleSetting; + private readonly PluginSetting _renderScaleSetting; + private readonly PluginSetting _targetFrameRateSetting; internal RgbService(ILogger logger, ISettingsService settingsService) { _logger = logger; _renderScaleSetting = settingsService.GetSetting("RenderScale", 1.0); + _targetFrameRateSetting = settingsService.GetSetting("TargetFrameRate", 25); Surface = RGBSurface.Instance; // Let's throw these for now Surface.Exception += SurfaceOnException; _renderScaleSetting.SettingChanged += RenderScaleSettingOnSettingChanged; + _targetFrameRateSetting.SettingChanged += TargetFrameRateSettingOnSettingChanged; _loadedDevices = new List(); - _updateTrigger = new TimerUpdateTrigger {UpdateFrequency = 1.0 / 25}; + _updateTrigger = new TimerUpdateTrigger {UpdateFrequency = 1.0 / _targetFrameRateSetting.Value}; Surface.RegisterUpdateTrigger(_updateTrigger); + } /// @@ -82,6 +87,11 @@ namespace Artemis.Core.Services UpdateGraphicsDecorator(); } + private void TargetFrameRateSettingOnSettingChanged(object sender, EventArgs e) + { + _updateTrigger.UpdateFrequency = 1.0 / _targetFrameRateSetting.Value; + } + private void SurfaceOnException(ExceptionEventArgs args) { throw args.Exception; diff --git a/src/Artemis.Core/Services/SettingsService.cs b/src/Artemis.Core/Services/SettingsService.cs index 9c59763ef..1a1366d45 100644 --- a/src/Artemis.Core/Services/SettingsService.cs +++ b/src/Artemis.Core/Services/SettingsService.cs @@ -1,43 +1,24 @@ using System; -using System.Collections.Generic; -using System.Linq; using Artemis.Core.Plugins.Models; using Artemis.Core.Services.Interfaces; -using Artemis.Storage.Entities; using Artemis.Storage.Repositories.Interfaces; -using Newtonsoft.Json; namespace Artemis.Core.Services { /// public class SettingsService : ISettingsService { - private readonly PluginInfo _buildInPluginInfo; - private readonly IPluginSettingRepository _pluginSettingRepository; - private readonly Dictionary _settingEntities; + private readonly PluginSettings _pluginSettings; internal SettingsService(IPluginSettingRepository pluginSettingRepository) { - _pluginSettingRepository = pluginSettingRepository; - _buildInPluginInfo = new PluginInfo {Guid = Guid.Parse("ffffffff-ffff-ffff-ffff-ffffffffffff"), Name = "Artemis Core"}; - - _settingEntities = pluginSettingRepository.GetByPluginGuid(_buildInPluginInfo.Guid).ToDictionary(se => se.Name); + var pluginInfo = new PluginInfo {Guid = Guid.Parse("ffffffff-ffff-ffff-ffff-ffffffffffff"), Name = "Artemis Core"}; + _pluginSettings = new PluginSettings(pluginInfo, pluginSettingRepository); } public PluginSetting GetSetting(string name, T defaultValue = default(T)) { - lock (_settingEntities) - { - if (_settingEntities.ContainsKey(name)) - return new PluginSetting(_buildInPluginInfo, _pluginSettingRepository, _settingEntities[name]); - - var settingEntity = new PluginSettingEntity {Name = name, PluginGuid = _buildInPluginInfo.Guid, Value = JsonConvert.SerializeObject(defaultValue)}; - _pluginSettingRepository.Add(settingEntity); - _pluginSettingRepository.Save(); - - _settingEntities.Add(name, settingEntity); - return new PluginSetting(_buildInPluginInfo, _pluginSettingRepository, _settingEntities[name]); - } + return _pluginSettings.GetSetting(name, defaultValue); } } diff --git a/src/Artemis.UI/ViewModels/Screens/DebugViewModel.cs b/src/Artemis.UI/ViewModels/Screens/DebugViewModel.cs index c7b85f262..04b1263f7 100644 --- a/src/Artemis.UI/ViewModels/Screens/DebugViewModel.cs +++ b/src/Artemis.UI/ViewModels/Screens/DebugViewModel.cs @@ -36,6 +36,9 @@ namespace Artemis.UI.ViewModels.Screens private void CoreServiceOnFrameRendered(object sender, FrameRenderedEventArgs e) { + if (e.Bitmap == null) + return; + var imageSource = ImageSourceFromBitmap(e.Bitmap); imageSource.Freeze(); Execute.OnUIThread(() => diff --git a/src/Artemis.UI/ViewModels/Screens/SettingsViewModel.cs b/src/Artemis.UI/ViewModels/Screens/SettingsViewModel.cs index e14733ffc..a167aac62 100644 --- a/src/Artemis.UI/ViewModels/Screens/SettingsViewModel.cs +++ b/src/Artemis.UI/ViewModels/Screens/SettingsViewModel.cs @@ -1,5 +1,4 @@ -using System.Windows.Media; -using Artemis.Core.Services; +using Artemis.Core.Services; using Artemis.Core.Services.Interfaces; using Artemis.Core.Services.Storage; using Artemis.UI.ViewModels.Controls.Settings; @@ -11,11 +10,11 @@ namespace Artemis.UI.ViewModels.Screens { public class SettingsViewModel : Screen, ISettingsViewModel { - private readonly IKernel _kernel; private readonly ICoreService _coreService; + private readonly IKernel _kernel; + private readonly ISettingsService _settingsService; private readonly ISurfaceService _surfaceService; private readonly IWindowManager _windowManager; - private readonly ISettingsService _settingsService; public SettingsViewModel(IKernel kernel, ICoreService coreService, ISurfaceService surfaceService, IWindowManager windowManager, ISettingsService settingsService) { @@ -26,15 +25,31 @@ namespace Artemis.UI.ViewModels.Screens _settingsService = settingsService; DeviceSettingsViewModels = new BindableCollection(); - RenderScale = _settingsService.GetSetting("RenderScale", 1.0).Value; - TargetFrameRate = _settingsService.GetSetting("FrameRate", 25).Value; } public BindableCollection DeviceSettingsViewModels { get; set; } - public string Title => "Settings"; - public double RenderScale { get; set; } - public int TargetFrameRate { get; set; } + public double RenderScale + { + get => _settingsService.GetSetting("RenderScale", 1.0).Value; + set + { + _settingsService.GetSetting("RenderScale", 1.0).Value = value; + _settingsService.GetSetting("RenderScale", 1.0).Save(); + } + } + + public int TargetFrameRate + { + get => _settingsService.GetSetting("TargetFrameRate", 25).Value; + set + { + _settingsService.GetSetting("TargetFrameRate", 25).Value = value; + _settingsService.GetSetting("TargetFrameRate", 25).Save(); + } + } + + public string Title => "Settings"; protected override void OnActivate() {