diff --git a/src/Artemis.Core/Artemis.Core.csproj b/src/Artemis.Core/Artemis.Core.csproj
index 2080d665d..7a774b98b 100644
--- a/src/Artemis.Core/Artemis.Core.csproj
+++ b/src/Artemis.Core/Artemis.Core.csproj
@@ -173,7 +173,7 @@
-
+
diff --git a/src/Artemis.Core/Models/Profile/Interfaces/IProfileElement.cs b/src/Artemis.Core/Models/Profile/Abstract/IProfileElement.cs
similarity index 51%
rename from src/Artemis.Core/Models/Profile/Interfaces/IProfileElement.cs
rename to src/Artemis.Core/Models/Profile/Abstract/IProfileElement.cs
index 95f79832c..963ce31a8 100644
--- a/src/Artemis.Core/Models/Profile/Interfaces/IProfileElement.cs
+++ b/src/Artemis.Core/Models/Profile/Abstract/IProfileElement.cs
@@ -1,34 +1,39 @@
using System.Collections.Generic;
using System.Drawing;
-namespace Artemis.Core.Models.Profile.Interfaces
+namespace Artemis.Core.Models.Profile.Abstract
{
- public interface IProfileElement
+ public abstract class ProfileElement
{
///
/// The element's children
///
- List Children { get; set; }
+ public List Children { get; set; }
///
/// The order in which this element appears in the update loop and editor
///
- int Order { get; set; }
+ public int Order { get; set; }
///
/// The name which appears in the editor
///
- string Name { get; set; }
+ public string Name { get; set; }
///
/// Updates the element
///
///
- void Update(double deltaTime);
+ public abstract void Update(double deltaTime);
///
/// Renders the element
///
- void Render(double deltaTime, Surface.Surface surface, Graphics graphics);
+ public abstract void Render(double deltaTime, Surface.Surface surface, Graphics graphics);
+
+ ///
+ /// Applies the profile element's properties to the underlying storage entity
+ ///
+ internal abstract void ApplyToEntity();
}
}
\ No newline at end of file
diff --git a/src/Artemis.Core/Models/Profile/Folder.cs b/src/Artemis.Core/Models/Profile/Folder.cs
index 8198b11c5..c90dd1a05 100644
--- a/src/Artemis.Core/Models/Profile/Folder.cs
+++ b/src/Artemis.Core/Models/Profile/Folder.cs
@@ -1,54 +1,83 @@
using System.Collections.Generic;
using System.Drawing;
-using Artemis.Core.Models.Profile.Interfaces;
+using Artemis.Core.Models.Profile.Abstract;
using Artemis.Core.Services.Interfaces;
using Artemis.Storage.Entities;
namespace Artemis.Core.Models.Profile
{
- public class Folder : IProfileElement
+ public class Folder : ProfileElement
{
- public Folder(Profile profile)
+ public Folder(Profile profile, Folder folder, string name)
{
+ FolderEntity = new FolderEntity();
+ Guid = System.Guid.NewGuid().ToString();
+
Profile = profile;
- Children = new List();
+ ParentFolder = folder;
+ Name = name;
+ Children = new List();
}
- public Profile Profile { get; }
- public List Children { get; set; }
- public int Order { get; set; }
- public string Name { get; set; }
+ public Folder(Profile profile, Folder folder, FolderEntity folderEntity, IPluginService pluginService)
+ {
+ FolderEntity = folderEntity;
+ Guid = folderEntity.Guid;
- public void Update(double deltaTime)
+ Profile = profile;
+ ParentFolder = folder;
+ Children = new List();
+
+ // Load child folders
+ foreach (var childFolder in folderEntity.Folders)
+ folder.Children.Add(new Folder(profile, this, childFolder, pluginService));
+ // Load child layers
+ foreach (var childLayer in folderEntity.Layers)
+ folder.Children.Add(new Layer(profile, this, childLayer, pluginService));
+ }
+
+ internal FolderEntity FolderEntity { get; set; }
+ internal string Guid { get; set; }
+
+ public Profile Profile { get; }
+ public Folder ParentFolder { get; }
+
+
+ public override void Update(double deltaTime)
{
// Folders don't update but their children do
foreach (var profileElement in Children)
profileElement.Update(deltaTime);
}
- public void Render(double deltaTime, Surface.Surface surface, Graphics graphics)
+ public override void Render(double deltaTime, Surface.Surface surface, Graphics graphics)
{
// Folders don't render but their children do
foreach (var profileElement in Children)
profileElement.Render(deltaTime, surface, graphics);
}
- public static Folder FromFolderEntity(Profile profile, FolderEntity folderEntity, IPluginService pluginService)
+ internal override void ApplyToEntity()
{
- var folder = new Folder(profile)
+ FolderEntity.Guid = Guid;
+ FolderEntity.Order = Order;
+ FolderEntity.Name = Name;
+
+ foreach (var profileElement in Children)
{
- Name = folderEntity.Name,
- Order = folderEntity.Order
- };
+ profileElement.ApplyToEntity();
+ // Add missing children
+ if (profileElement is Folder folder)
+ {
+ // TODO
+ }
+ else if (profileElement is Layer layer)
+ {
+ // TODO
+ }
- // Load child folders
- foreach (var childFolder in folderEntity.Folders)
- folder.Children.Add(FromFolderEntity(profile, childFolder, pluginService));
- // Load child layers
- foreach (var childLayer in folderEntity.Layers)
- folder.Children.Add(Layer.FromLayerEntity(profile, childLayer, pluginService));
-
- return folder;
+ // Remove extra childen
+ }
}
public override string ToString()
diff --git a/src/Artemis.Core/Models/Profile/Layer.cs b/src/Artemis.Core/Models/Profile/Layer.cs
index 1724b9ca0..7bea7cb2c 100644
--- a/src/Artemis.Core/Models/Profile/Layer.cs
+++ b/src/Artemis.Core/Models/Profile/Layer.cs
@@ -1,7 +1,7 @@
using System;
using System.Collections.Generic;
using System.Drawing;
-using Artemis.Core.Models.Profile.Interfaces;
+using Artemis.Core.Models.Profile.Abstract;
using Artemis.Core.Plugins.Abstract;
using Artemis.Core.Plugins.Interfaces;
using Artemis.Core.Services.Interfaces;
@@ -9,22 +9,38 @@ using Artemis.Storage.Entities;
namespace Artemis.Core.Models.Profile
{
- public class Layer : IProfileElement
+ public class Layer : ProfileElement
{
- public Layer(Profile profile)
+ internal Layer(Profile profile, Folder folder, string name)
{
+ LayerEntity = new LayerEntity();
+ Guid = System.Guid.NewGuid().ToString();
+
Profile = profile;
- Children = new List();
+ ParentFolder = folder;
+ Name = name;
}
+ internal Layer(Profile profile, Folder folder, LayerEntity layerEntity, IPluginService pluginService)
+ {
+ LayerEntity = layerEntity;
+ Guid = layerEntity.Guid;
+
+ Profile = profile;
+ ParentFolder = folder;
+ LayerType = pluginService.GetLayerTypeByGuid(System.Guid.Parse(layerEntity.LayerTypeGuid));
+ }
+
+ internal LayerEntity LayerEntity { get; set; }
+ internal string Guid { get; set; }
+
public Profile Profile { get; }
+ public Folder ParentFolder { get; }
+
public LayerType LayerType { get; private set; }
public ILayerTypeConfiguration LayerTypeConfiguration { get; set; }
- public List Children { get; set; }
- public int Order { get; set; }
- public string Name { get; set; }
- public void Update(double deltaTime)
+ public override void Update(double deltaTime)
{
if (LayerType == null)
return;
@@ -35,7 +51,7 @@ namespace Artemis.Core.Models.Profile
}
}
- public void Render(double deltaTime, Surface.Surface surface, Graphics graphics)
+ public override void Render(double deltaTime, Surface.Surface surface, Graphics graphics)
{
if (LayerType == null)
return;
@@ -46,16 +62,14 @@ namespace Artemis.Core.Models.Profile
}
}
- public static Layer FromLayerEntity(Profile profile, LayerEntity layerEntity, IPluginService pluginService)
+ internal override void ApplyToEntity()
{
- var layer = new Layer(profile)
- {
- Name = layerEntity.Name,
- Order = layerEntity.Order,
- LayerType = pluginService.GetLayerTypeByGuid(Guid.Parse(layerEntity.Guid))
- };
+ LayerEntity.Guid = Guid;
+ LayerEntity.Order = Order;
+ LayerEntity.Name = Name;
+ LayerEntity.LayerTypeGuid = LayerType?.PluginInfo.Guid.ToString();
- return layer;
+ // TODO: Settings
}
public void UpdateLayerType(LayerType layerType)
diff --git a/src/Artemis.Core/Models/Profile/Profile.cs b/src/Artemis.Core/Models/Profile/Profile.cs
index 51a3a4e30..27af026da 100644
--- a/src/Artemis.Core/Models/Profile/Profile.cs
+++ b/src/Artemis.Core/Models/Profile/Profile.cs
@@ -1,15 +1,16 @@
using System;
using System.Collections.Generic;
using System.Drawing;
+using System.Linq;
using Artemis.Core.Exceptions;
-using Artemis.Core.Models.Profile.Interfaces;
+using Artemis.Core.Models.Profile.Abstract;
using Artemis.Core.Plugins.Models;
using Artemis.Core.Services.Interfaces;
using Artemis.Storage.Entities;
namespace Artemis.Core.Models.Profile
{
- public class Profile : IProfileElement
+ public class Profile : ProfileElement
{
internal Profile(PluginInfo pluginInfo, string name)
{
@@ -19,7 +20,7 @@ namespace Artemis.Core.Models.Profile
PluginInfo = pluginInfo;
Name = name;
- Children = new List();
+ Children = new List {new Folder(this, null, "Root folder")};
}
internal Profile(PluginInfo pluginInfo, ProfileEntity profileEntity, IPluginService pluginService)
@@ -31,7 +32,7 @@ namespace Artemis.Core.Models.Profile
Name = profileEntity.Name;
// Populate the profile starting at the root, the rest is populated recursively
- Children = new List {Folder.FromFolderEntity(this, profileEntity.RootFolder, pluginService)};
+ Children = new List {new Folder(this, null, profileEntity.RootFolder, pluginService)};
}
public PluginInfo PluginInfo { get; }
@@ -39,11 +40,8 @@ namespace Artemis.Core.Models.Profile
internal ProfileEntity ProfileEntity { get; set; }
internal string Guid { get; set; }
- public int Order { get; set; }
- public string Name { get; set; }
- public List Children { get; set; }
- public void Update(double deltaTime)
+ public override void Update(double deltaTime)
{
lock (this)
{
@@ -55,7 +53,7 @@ namespace Artemis.Core.Models.Profile
}
}
- public void Render(double deltaTime, Surface.Surface surface, Graphics graphics)
+ public override void Render(double deltaTime, Surface.Surface surface, Graphics graphics)
{
lock (this)
{
@@ -67,7 +65,16 @@ namespace Artemis.Core.Models.Profile
}
}
- public void Activate()
+ internal override void ApplyToEntity()
+ {
+ ProfileEntity.Guid = Guid;
+ ProfileEntity.Name = Name;
+ ProfileEntity.IsActive = IsActivated;
+
+ var rootFolder = Children.Single();
+ }
+
+ internal void Activate()
{
lock (this)
{
@@ -78,7 +85,7 @@ namespace Artemis.Core.Models.Profile
}
}
- public void Deactivate()
+ internal void Deactivate()
{
lock (this)
{
@@ -88,7 +95,7 @@ namespace Artemis.Core.Models.Profile
OnDeactivated();
}
}
-
+
public override string ToString()
{
return $"{nameof(Order)}: {Order}, {nameof(Name)}: {Name}, {nameof(PluginInfo)}: {PluginInfo}";
diff --git a/src/Artemis.Core/Services/Storage/ProfileService.cs b/src/Artemis.Core/Services/Storage/ProfileService.cs
index f5dab97d8..a95c0e945 100644
--- a/src/Artemis.Core/Services/Storage/ProfileService.cs
+++ b/src/Artemis.Core/Services/Storage/ProfileService.cs
@@ -44,18 +44,20 @@ namespace Artemis.Core.Services.Storage
public async Task CreateProfile(ProfileModule module, string name)
{
var profile = new Profile(module.PluginInfo, name);
- await SaveProfile(profile);
-
+
return profile;
}
- public async Task SaveProfile(Profile profile)
+ public async Task UpdateProfile(Profile profile, bool includeChildren)
{
- // Find a matching profile entity to update
- var existing = await _profileRepository.GetByGuidAsync(profile.)
- // If not found, create a new one
-
- await _profileRepository.SaveAsync();
+ profile.ApplyToEntity();
+ if (includeChildren)
+ {
+ foreach (var profileElement in profile.Children)
+ {
+ profileElement.ApplyToEntity();
+ }
+ }
}
}
}
\ No newline at end of file
diff --git a/src/Artemis.Storage/Entities/LayerEntity.cs b/src/Artemis.Storage/Entities/LayerEntity.cs
index c44d8839e..c91056bd5 100644
--- a/src/Artemis.Storage/Entities/LayerEntity.cs
+++ b/src/Artemis.Storage/Entities/LayerEntity.cs
@@ -15,5 +15,6 @@ namespace Artemis.Storage.Entities
public int Order { get; set; }
public string Name { get; set; }
+ public string LayerTypeGuid { get; set; }
}
}
\ No newline at end of file
diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/ProfileEditorViewModel.cs b/src/Artemis.UI/Screens/Module/ProfileEditor/ProfileEditorViewModel.cs
index 3b73b18d2..709210a3b 100644
--- a/src/Artemis.UI/Screens/Module/ProfileEditor/ProfileEditorViewModel.cs
+++ b/src/Artemis.UI/Screens/Module/ProfileEditor/ProfileEditorViewModel.cs
@@ -72,10 +72,10 @@ namespace Artemis.UI.Screens.Module.ProfileEditor
Profiles.Clear();
Profiles.AddRange(profiles);
- if (!profiles.Any())
- {
- var profile = new Profile(Module.PluginInfo, "Default");
- }
+// if (!profiles.Any())
+// {
+// var profile = new Profile(Module.PluginInfo, "Default");
+// }
}
}
}
\ No newline at end of file
diff --git a/src/Artemis.UI/Screens/SurfaceEditor/SurfaceEditorViewModel.cs b/src/Artemis.UI/Screens/SurfaceEditor/SurfaceEditorViewModel.cs
index 1931fc00e..ae877afd9 100644
--- a/src/Artemis.UI/Screens/SurfaceEditor/SurfaceEditorViewModel.cs
+++ b/src/Artemis.UI/Screens/SurfaceEditor/SurfaceEditorViewModel.cs
@@ -74,13 +74,14 @@ namespace Artemis.UI.Screens.SurfaceEditor
private void LoadSurfaceConfigurations()
{
// Get surface configs
- var configs = _surfaceService.SurfaceConfigurations;
+ var configs = _surfaceService.SurfaceConfigurations.ToList();
// Get the active config, if empty, create a default config
var activeConfig = _surfaceService.ActiveSurface;
if (activeConfig == null)
{
activeConfig = CreateSurfaceConfiguration("Default");
+ configs.Add(activeConfig);
_surfaceService.SetActiveSurfaceConfiguration(activeConfig);
}