1
0
mirror of https://github.com/Artemis-RGB/Artemis synced 2025-12-13 05:48:35 +00:00

Cleaned up setting service, lol old approach was dumb

Made PluginSetting<T> act as a singleton
This commit is contained in:
SpoinkyNL 2019-11-04 21:36:46 +01:00
parent 05eed5ba00
commit 54fcbdb732
6 changed files with 70 additions and 55 deletions

View File

@ -8,12 +8,13 @@ using Stylet;
namespace Artemis.Core.Plugins.Models namespace Artemis.Core.Plugins.Models
{ {
public class PluginSetting<T> : PropertyChangedBase public class PluginSetting<T>
{ {
// ReSharper disable once NotAccessedField.Local // ReSharper disable once NotAccessedField.Local
private readonly PluginInfo _pluginInfo; private readonly PluginInfo _pluginInfo;
private readonly PluginSettingEntity _pluginSettingEntity; private readonly PluginSettingEntity _pluginSettingEntity;
private readonly IPluginSettingRepository _pluginSettingRepository; private readonly IPluginSettingRepository _pluginSettingRepository;
private T _value;
internal PluginSetting(PluginInfo pluginInfo, IPluginSettingRepository pluginSettingRepository, PluginSettingEntity pluginSettingEntity) internal PluginSetting(PluginInfo pluginInfo, IPluginSettingRepository pluginSettingRepository, PluginSettingEntity pluginSettingEntity)
{ {
@ -23,15 +24,6 @@ namespace Artemis.Core.Plugins.Models
Name = pluginSettingEntity.Name; Name = pluginSettingEntity.Name;
Value = JsonConvert.DeserializeObject<T>(pluginSettingEntity.Value); Value = JsonConvert.DeserializeObject<T>(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();
} }
/// <summary> /// <summary>
@ -42,7 +34,15 @@ namespace Artemis.Core.Plugins.Models
/// <summary> /// <summary>
/// The value of the setting /// The value of the setting
/// </summary> /// </summary>
public T Value { get; set; } public T Value
{
get => _value;
set
{
_value = value;
OnSettingChanged();
}
}
/// <summary> /// <summary>
/// Determines whether the setting has been changed /// Determines whether the setting has been changed

View File

@ -1,5 +1,4 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using Artemis.Storage.Entities; using Artemis.Storage.Entities;
using Artemis.Storage.Repositories.Interfaces; using Artemis.Storage.Repositories.Interfaces;
using Newtonsoft.Json; using Newtonsoft.Json;
@ -14,13 +13,13 @@ namespace Artemis.Core.Plugins.Models
{ {
private readonly PluginInfo _pluginInfo; private readonly PluginInfo _pluginInfo;
private readonly IPluginSettingRepository _pluginSettingRepository; private readonly IPluginSettingRepository _pluginSettingRepository;
private readonly Dictionary<string, PluginSettingEntity> _settingEntities; private readonly Dictionary<string, object> _settingEntities;
internal PluginSettings(PluginInfo pluginInfo, IPluginSettingRepository pluginSettingRepository) internal PluginSettings(PluginInfo pluginInfo, IPluginSettingRepository pluginSettingRepository)
{ {
_pluginInfo = pluginInfo; _pluginInfo = pluginInfo;
_pluginSettingRepository = pluginSettingRepository; _pluginSettingRepository = pluginSettingRepository;
_settingEntities = pluginSettingRepository.GetByPluginGuid(_pluginInfo.Guid).ToDictionary(se => se.Name); _settingEntities = new Dictionary<string, object>();
} }
/// <summary> /// <summary>
@ -34,15 +33,22 @@ namespace Artemis.Core.Plugins.Models
{ {
lock (_settingEntities) lock (_settingEntities)
{ {
// Return cached value if available
if (_settingEntities.ContainsKey(name)) if (_settingEntities.ContainsKey(name))
return new PluginSetting<T>(_pluginInfo, _pluginSettingRepository, _settingEntities[name]); return (PluginSetting<T>) _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)}; var pluginSetting = new PluginSetting<T>(_pluginInfo, _pluginSettingRepository, settingEntity);
_pluginSettingRepository.Add(settingEntity); _settingEntities.Add(name, pluginSetting);
_pluginSettingRepository.Save(); return pluginSetting;
_settingEntities.Add(name, settingEntity);
return new PluginSetting<T>(_pluginInfo, _pluginSettingRepository, _settingEntities[name]);
} }
} }
} }

View File

@ -1,5 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using Artemis.Core.Events; using Artemis.Core.Events;
using Artemis.Core.Plugins.Models; using Artemis.Core.Plugins.Models;
using Artemis.Core.RGB.NET; using Artemis.Core.RGB.NET;
@ -21,21 +22,25 @@ namespace Artemis.Core.Services
private readonly ILogger _logger; private readonly ILogger _logger;
private readonly TimerUpdateTrigger _updateTrigger; private readonly TimerUpdateTrigger _updateTrigger;
private ListLedGroup _background; private ListLedGroup _background;
private PluginSetting<double> _renderScaleSetting; private readonly PluginSetting<double> _renderScaleSetting;
private readonly PluginSetting<int> _targetFrameRateSetting;
internal RgbService(ILogger logger, ISettingsService settingsService) internal RgbService(ILogger logger, ISettingsService settingsService)
{ {
_logger = logger; _logger = logger;
_renderScaleSetting = settingsService.GetSetting("RenderScale", 1.0); _renderScaleSetting = settingsService.GetSetting("RenderScale", 1.0);
_targetFrameRateSetting = settingsService.GetSetting("TargetFrameRate", 25);
Surface = RGBSurface.Instance; Surface = RGBSurface.Instance;
// Let's throw these for now // Let's throw these for now
Surface.Exception += SurfaceOnException; Surface.Exception += SurfaceOnException;
_renderScaleSetting.SettingChanged += RenderScaleSettingOnSettingChanged; _renderScaleSetting.SettingChanged += RenderScaleSettingOnSettingChanged;
_targetFrameRateSetting.SettingChanged += TargetFrameRateSettingOnSettingChanged;
_loadedDevices = new List<IRGBDevice>(); _loadedDevices = new List<IRGBDevice>();
_updateTrigger = new TimerUpdateTrigger {UpdateFrequency = 1.0 / 25}; _updateTrigger = new TimerUpdateTrigger {UpdateFrequency = 1.0 / _targetFrameRateSetting.Value};
Surface.RegisterUpdateTrigger(_updateTrigger); Surface.RegisterUpdateTrigger(_updateTrigger);
} }
/// <inheritdoc /> /// <inheritdoc />
@ -82,6 +87,11 @@ namespace Artemis.Core.Services
UpdateGraphicsDecorator(); UpdateGraphicsDecorator();
} }
private void TargetFrameRateSettingOnSettingChanged(object sender, EventArgs e)
{
_updateTrigger.UpdateFrequency = 1.0 / _targetFrameRateSetting.Value;
}
private void SurfaceOnException(ExceptionEventArgs args) private void SurfaceOnException(ExceptionEventArgs args)
{ {
throw args.Exception; throw args.Exception;

View File

@ -1,43 +1,24 @@
using System; using System;
using System.Collections.Generic;
using System.Linq;
using Artemis.Core.Plugins.Models; using Artemis.Core.Plugins.Models;
using Artemis.Core.Services.Interfaces; using Artemis.Core.Services.Interfaces;
using Artemis.Storage.Entities;
using Artemis.Storage.Repositories.Interfaces; using Artemis.Storage.Repositories.Interfaces;
using Newtonsoft.Json;
namespace Artemis.Core.Services namespace Artemis.Core.Services
{ {
/// <inheritdoc /> /// <inheritdoc />
public class SettingsService : ISettingsService public class SettingsService : ISettingsService
{ {
private readonly PluginInfo _buildInPluginInfo; private readonly PluginSettings _pluginSettings;
private readonly IPluginSettingRepository _pluginSettingRepository;
private readonly Dictionary<string, PluginSettingEntity> _settingEntities;
internal SettingsService(IPluginSettingRepository pluginSettingRepository) internal SettingsService(IPluginSettingRepository pluginSettingRepository)
{ {
_pluginSettingRepository = pluginSettingRepository; var pluginInfo = new PluginInfo {Guid = Guid.Parse("ffffffff-ffff-ffff-ffff-ffffffffffff"), Name = "Artemis Core"};
_buildInPluginInfo = new PluginInfo {Guid = Guid.Parse("ffffffff-ffff-ffff-ffff-ffffffffffff"), Name = "Artemis Core"}; _pluginSettings = new PluginSettings(pluginInfo, pluginSettingRepository);
_settingEntities = pluginSettingRepository.GetByPluginGuid(_buildInPluginInfo.Guid).ToDictionary(se => se.Name);
} }
public PluginSetting<T> GetSetting<T>(string name, T defaultValue = default(T)) public PluginSetting<T> GetSetting<T>(string name, T defaultValue = default(T))
{ {
lock (_settingEntities) return _pluginSettings.GetSetting(name, defaultValue);
{
if (_settingEntities.ContainsKey(name))
return new PluginSetting<T>(_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<T>(_buildInPluginInfo, _pluginSettingRepository, _settingEntities[name]);
}
} }
} }

View File

@ -36,6 +36,9 @@ namespace Artemis.UI.ViewModels.Screens
private void CoreServiceOnFrameRendered(object sender, FrameRenderedEventArgs e) private void CoreServiceOnFrameRendered(object sender, FrameRenderedEventArgs e)
{ {
if (e.Bitmap == null)
return;
var imageSource = ImageSourceFromBitmap(e.Bitmap); var imageSource = ImageSourceFromBitmap(e.Bitmap);
imageSource.Freeze(); imageSource.Freeze();
Execute.OnUIThread(() => Execute.OnUIThread(() =>

View File

@ -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.Interfaces;
using Artemis.Core.Services.Storage; using Artemis.Core.Services.Storage;
using Artemis.UI.ViewModels.Controls.Settings; using Artemis.UI.ViewModels.Controls.Settings;
@ -11,11 +10,11 @@ namespace Artemis.UI.ViewModels.Screens
{ {
public class SettingsViewModel : Screen, ISettingsViewModel public class SettingsViewModel : Screen, ISettingsViewModel
{ {
private readonly IKernel _kernel;
private readonly ICoreService _coreService; private readonly ICoreService _coreService;
private readonly IKernel _kernel;
private readonly ISettingsService _settingsService;
private readonly ISurfaceService _surfaceService; private readonly ISurfaceService _surfaceService;
private readonly IWindowManager _windowManager; private readonly IWindowManager _windowManager;
private readonly ISettingsService _settingsService;
public SettingsViewModel(IKernel kernel, ICoreService coreService, ISurfaceService surfaceService, IWindowManager windowManager, 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; _settingsService = settingsService;
DeviceSettingsViewModels = new BindableCollection<DeviceSettingsViewModel>(); DeviceSettingsViewModels = new BindableCollection<DeviceSettingsViewModel>();
RenderScale = _settingsService.GetSetting("RenderScale", 1.0).Value;
TargetFrameRate = _settingsService.GetSetting("FrameRate", 25).Value;
} }
public BindableCollection<DeviceSettingsViewModel> DeviceSettingsViewModels { get; set; } public BindableCollection<DeviceSettingsViewModel> DeviceSettingsViewModels { get; set; }
public string Title => "Settings";
public double RenderScale { get; set; } public double RenderScale
public int TargetFrameRate { get; set; } {
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() protected override void OnActivate()
{ {