From d4dd371a5059eb2b8daa1c85e589664fb5931220 Mon Sep 17 00:00:00 2001 From: Robert Date: Tue, 19 Nov 2019 22:19:35 +0100 Subject: [PATCH] Added profile deserialization --- src/Artemis.Core/Artemis.Core.csproj | 2 +- .../IProfileElement.cs | 19 +++-- src/Artemis.Core/Models/Profile/Folder.cs | 75 +++++++++++++------ src/Artemis.Core/Models/Profile/Layer.cs | 48 +++++++----- src/Artemis.Core/Models/Profile/Profile.cs | 31 +++++--- .../Services/Storage/ProfileService.cs | 18 +++-- src/Artemis.Storage/Entities/LayerEntity.cs | 1 + .../ProfileEditor/ProfileEditorViewModel.cs | 8 +- .../SurfaceEditor/SurfaceEditorViewModel.cs | 3 +- 9 files changed, 132 insertions(+), 73 deletions(-) rename src/Artemis.Core/Models/Profile/{Interfaces => Abstract}/IProfileElement.cs (51%) 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); }