diff --git a/src/Artemis.Core/Models/Surface/SurfaceDeviceConfiguration.cs b/src/Artemis.Core/Models/Surface/SurfaceDeviceConfiguration.cs index 93a743718..7cc2eea85 100644 --- a/src/Artemis.Core/Models/Surface/SurfaceDeviceConfiguration.cs +++ b/src/Artemis.Core/Models/Surface/SurfaceDeviceConfiguration.cs @@ -64,7 +64,7 @@ namespace Artemis.Core.Models.Surface /// /// Applies the configuration to the device /// - public void ApplyToDevice() + internal void ApplyToDevice() { if (Device != null) { diff --git a/src/Artemis.Core/Services/Storage/ISurfaceService.cs b/src/Artemis.Core/Services/Storage/ISurfaceService.cs index f7e965d3f..5876b0dda 100644 --- a/src/Artemis.Core/Services/Storage/ISurfaceService.cs +++ b/src/Artemis.Core/Services/Storage/ISurfaceService.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; using System.Collections.ObjectModel; using Artemis.Core.Events; using Artemis.Core.Models.Surface; @@ -10,9 +9,9 @@ namespace Artemis.Core.Services.Storage public interface ISurfaceService : IArtemisService { /// - /// Gets or sets the currently active surface configuration + /// Gets the currently active surface configuration, to change config use /// - SurfaceConfiguration ActiveSurfaceConfiguration { get; set; } + SurfaceConfiguration ActiveSurfaceConfiguration { get; } /// /// Gets a read-only list of all surface configurations @@ -26,26 +25,25 @@ namespace Artemis.Core.Services.Storage /// SurfaceConfiguration CreateSurfaceConfiguration(string name); + /// + /// Sets the provided configuration as active and applies it to the surface + /// + /// The configuration to activate and apply + void SetActiveSurfaceConfiguration(SurfaceConfiguration surfaceConfiguration); + + /// + /// Saves the provided surface configuration to permanent storage and if config is active, applies it to the surface + /// + /// The configuration to save (and apply if active) + /// Whether to also save devices. If false, devices changes won't be applied either + void UpdateSurfaceConfiguration(SurfaceConfiguration surfaceConfiguration, bool includeDevices); + /// /// Deletes the supplied surface configuration, surface configuration may not be the active surface configuration /// /// The surface configuration to delete, may not be the active surface configuration void DeleteSurfaceConfiguration(SurfaceConfiguration surfaceConfiguration); - /// - /// Saves the provided surface configurations to permanent storage - /// - /// The configurations to save - /// Whether to also save devices - void SaveToRepository(List surfaceConfigurations, bool includeDevices); - - /// - /// Saves the provided surface configuration to permanent storage - /// - /// The configuration to save - /// Whether to also save devices - void SaveToRepository(SurfaceConfiguration surfaceConfiguration, bool includeDevices); - /// /// Occurs when the active device configuration has been changed /// diff --git a/src/Artemis.Core/Services/Storage/SurfaceService.cs b/src/Artemis.Core/Services/Storage/SurfaceService.cs index d1cc90715..fc78c4c2e 100644 --- a/src/Artemis.Core/Services/Storage/SurfaceService.cs +++ b/src/Artemis.Core/Services/Storage/SurfaceService.cs @@ -18,7 +18,6 @@ namespace Artemis.Core.Services.Storage private readonly IRgbService _rgbService; private readonly List _surfaceConfigurations; private readonly ISurfaceRepository _surfaceRepository; - private SurfaceConfiguration _activeSurfaceConfiguration; public SurfaceService(ILogger logger, ISurfaceRepository surfaceRepository, IRgbService rgbService) { @@ -32,37 +31,7 @@ namespace Artemis.Core.Services.Storage _rgbService.DeviceLoaded += RgbServiceOnDeviceLoaded; } - public SurfaceConfiguration ActiveSurfaceConfiguration - { - get => _activeSurfaceConfiguration; - set - { - if (_activeSurfaceConfiguration == value) - return; - - _activeSurfaceConfiguration = value; - lock (_surfaceConfigurations) - { - // Mark only the new value as active - foreach (var surfaceConfiguration in _surfaceConfigurations) - surfaceConfiguration.IsActive = false; - _activeSurfaceConfiguration.IsActive = true; - - SaveToRepository(_surfaceConfigurations, true); - } - - // Apply the active surface configuration to the devices - if (ActiveSurfaceConfiguration != null) - { - foreach (var deviceConfiguration in ActiveSurfaceConfiguration.DeviceConfigurations) - deviceConfiguration.ApplyToDevice(); - } - // Update the RGB service's graphics decorator to work with the new surface configuration - _rgbService.UpdateGraphicsDecorator(); - - OnActiveSurfaceConfigurationChanged(new SurfaceConfigurationEventArgs(_activeSurfaceConfiguration)); - } - } + public SurfaceConfiguration ActiveSurfaceConfiguration { get; private set; } public ReadOnlyCollection SurfaceConfigurations { @@ -90,11 +59,62 @@ namespace Artemis.Core.Services.Storage lock (_surfaceConfigurations) { _surfaceRepository.Add(configuration.SurfaceEntity); - SaveToRepository(configuration, true); + UpdateSurfaceConfiguration(configuration, true); return configuration; } } + public void SetActiveSurfaceConfiguration(SurfaceConfiguration surfaceConfiguration) + { + if (ActiveSurfaceConfiguration == surfaceConfiguration) + return; + + // Set the new configuration + ActiveSurfaceConfiguration = surfaceConfiguration; + + // Ensure only the new configuration is marked as active + lock (_surfaceConfigurations) + { + // Mark only the new surfaceConfiguration as active + foreach (var configuration in _surfaceConfigurations) + { + configuration.IsActive = configuration == ActiveSurfaceConfiguration; + configuration.ApplyToEntity(); + } + + _surfaceRepository.Save(); + } + + // Apply the active surface configuration to the devices + if (ActiveSurfaceConfiguration != null) + { + foreach (var deviceConfiguration in ActiveSurfaceConfiguration.DeviceConfigurations) + deviceConfiguration.ApplyToDevice(); + } + + // Update the RGB service's graphics decorator to work with the new surface configuration + _rgbService.UpdateGraphicsDecorator(); + OnActiveSurfaceConfigurationChanged(new SurfaceConfigurationEventArgs(ActiveSurfaceConfiguration)); + } + + public void UpdateSurfaceConfiguration(SurfaceConfiguration surfaceConfiguration, bool includeDevices) + { + surfaceConfiguration.ApplyToEntity(); + if (includeDevices) + { + foreach (var deviceConfiguration in surfaceConfiguration.DeviceConfigurations) + { + deviceConfiguration.ApplyToEntity(); + if (surfaceConfiguration.IsActive) + deviceConfiguration.ApplyToDevice(); + } + } + + _surfaceRepository.Save(); + _rgbService.UpdateGraphicsDecorator(); + OnSurfaceConfigurationUpdated(new SurfaceConfigurationEventArgs(surfaceConfiguration)); + } + public void DeleteSurfaceConfiguration(SurfaceConfiguration surfaceConfiguration) { if (surfaceConfiguration == ActiveSurfaceConfiguration) @@ -120,7 +140,7 @@ namespace Artemis.Core.Services.Storage MatchDeviceConfiguration(e.Device, surfaceConfiguration); } - foreach (var deviceConfiguration in ActiveSurfaceConfiguration.DeviceConfigurations) + foreach (var deviceConfiguration in ActiveSurfaceConfiguration.DeviceConfigurations) deviceConfiguration.ApplyToDevice(); } @@ -152,33 +172,6 @@ namespace Artemis.Core.Services.Storage ActiveSurfaceConfiguration = active; } - public void SaveToRepository(List surfaceConfigurations, bool includeDevices) - { - foreach (var surfaceConfiguration in surfaceConfigurations) - { - surfaceConfiguration.ApplyToEntity(); - if (!includeDevices) - { - foreach (var deviceConfiguration in surfaceConfiguration.DeviceConfigurations) - deviceConfiguration.ApplyToEntity(); - } - } - - _surfaceRepository.Save(); - } - - public void SaveToRepository(SurfaceConfiguration surfaceConfiguration, bool includeDevices) - { - surfaceConfiguration.ApplyToEntity(); - if (includeDevices) - { - foreach (var deviceConfiguration in surfaceConfiguration.DeviceConfigurations) - deviceConfiguration.ApplyToEntity(); - } - - _surfaceRepository.Save(); - } - #endregion #region Utilities @@ -217,12 +210,18 @@ namespace Artemis.Core.Services.Storage #region Events public event EventHandler ActiveSurfaceConfigurationChanged; + public event EventHandler SurfaceConfigurationUpdated; protected virtual void OnActiveSurfaceConfigurationChanged(SurfaceConfigurationEventArgs e) { ActiveSurfaceConfigurationChanged?.Invoke(this, e); } + protected virtual void OnSurfaceConfigurationUpdated(SurfaceConfigurationEventArgs e) + { + SurfaceConfigurationUpdated?.Invoke(this, e); + } + #endregion } } \ No newline at end of file diff --git a/src/Artemis.UI/Artemis.UI.csproj b/src/Artemis.UI/Artemis.UI.csproj index 5781d1bc1..c98b1afcc 100644 --- a/src/Artemis.UI/Artemis.UI.csproj +++ b/src/Artemis.UI/Artemis.UI.csproj @@ -152,6 +152,11 @@ + + True + True + Resources.resx + @@ -214,11 +219,6 @@ Code - - True - True - Resources.resx - True Settings.settings @@ -226,6 +226,7 @@ ResXFileCodeGenerator + Designer Resources.Designer.cs diff --git a/src/Artemis.UI/ViewModels/Screens/SurfaceEditorViewModel.cs b/src/Artemis.UI/ViewModels/Screens/SurfaceEditorViewModel.cs index a077ed44a..c6d0a3576 100644 --- a/src/Artemis.UI/ViewModels/Screens/SurfaceEditorViewModel.cs +++ b/src/Artemis.UI/ViewModels/Screens/SurfaceEditorViewModel.cs @@ -70,7 +70,7 @@ namespace Artemis.UI.ViewModels.Screens if (activeConfig == null) { activeConfig = AddSurfaceConfiguration("Default"); - _surfaceService.ActiveSurfaceConfiguration = activeConfig; + _surfaceService.SetActiveSurfaceConfiguration(activeConfig); } Execute.OnUIThread(() => @@ -106,7 +106,7 @@ namespace Artemis.UI.ViewModels.Screens }); }); - _surfaceService.ActiveSurfaceConfiguration = SelectedSurfaceConfiguration; + _surfaceService.SetActiveSurfaceConfiguration(SelectedSurfaceConfiguration); } #region Overrides of Screen @@ -275,9 +275,7 @@ namespace Artemis.UI.ViewModels.Screens } else { - foreach (var device in Devices) - device.DeviceConfiguration.ApplyToDevice(); - _surfaceService.SaveToRepository(SelectedSurfaceConfiguration, true); + _surfaceService.UpdateSurfaceConfiguration(SelectedSurfaceConfiguration, true); } Mouse.OverrideCursor = null;