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;