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

Added profile deserialization

This commit is contained in:
Robert 2019-11-19 22:19:35 +01:00
parent 8e04fa1a01
commit d4dd371a50
9 changed files with 132 additions and 73 deletions

View File

@ -173,7 +173,7 @@
<Compile Include="Plugins\Models\PluginSetting.cs" /> <Compile Include="Plugins\Models\PluginSetting.cs" />
<Compile Include="Plugins\Models\PluginSettings.cs" /> <Compile Include="Plugins\Models\PluginSettings.cs" />
<Compile Include="Models\Profile\Folder.cs" /> <Compile Include="Models\Profile\Folder.cs" />
<Compile Include="Models\Profile\Interfaces\IProfileElement.cs" /> <Compile Include="Models\Profile\Abstract\IProfileElement.cs" />
<Compile Include="Models\Profile\Layer.cs" /> <Compile Include="Models\Profile\Layer.cs" />
<Compile Include="Models\Profile\Profile.cs" /> <Compile Include="Models\Profile\Profile.cs" />
<Compile Include="Ninject\CoreModule.cs" /> <Compile Include="Ninject\CoreModule.cs" />

View File

@ -1,34 +1,39 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Drawing; using System.Drawing;
namespace Artemis.Core.Models.Profile.Interfaces namespace Artemis.Core.Models.Profile.Abstract
{ {
public interface IProfileElement public abstract class ProfileElement
{ {
/// <summary> /// <summary>
/// The element's children /// The element's children
/// </summary> /// </summary>
List<IProfileElement> Children { get; set; } public List<ProfileElement> Children { get; set; }
/// <summary> /// <summary>
/// The order in which this element appears in the update loop and editor /// The order in which this element appears in the update loop and editor
/// </summary> /// </summary>
int Order { get; set; } public int Order { get; set; }
/// <summary> /// <summary>
/// The name which appears in the editor /// The name which appears in the editor
/// </summary> /// </summary>
string Name { get; set; } public string Name { get; set; }
/// <summary> /// <summary>
/// Updates the element /// Updates the element
/// </summary> /// </summary>
/// <param name="deltaTime"></param> /// <param name="deltaTime"></param>
void Update(double deltaTime); public abstract void Update(double deltaTime);
/// <summary> /// <summary>
/// Renders the element /// Renders the element
/// </summary> /// </summary>
void Render(double deltaTime, Surface.Surface surface, Graphics graphics); public abstract void Render(double deltaTime, Surface.Surface surface, Graphics graphics);
/// <summary>
/// Applies the profile element's properties to the underlying storage entity
/// </summary>
internal abstract void ApplyToEntity();
} }
} }

View File

@ -1,54 +1,83 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Drawing; using System.Drawing;
using Artemis.Core.Models.Profile.Interfaces; using Artemis.Core.Models.Profile.Abstract;
using Artemis.Core.Services.Interfaces; using Artemis.Core.Services.Interfaces;
using Artemis.Storage.Entities; using Artemis.Storage.Entities;
namespace Artemis.Core.Models.Profile 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; Profile = profile;
Children = new List<IProfileElement>(); ParentFolder = folder;
Name = name;
Children = new List<ProfileElement>();
} }
public Profile Profile { get; } public Folder(Profile profile, Folder folder, FolderEntity folderEntity, IPluginService pluginService)
public List<IProfileElement> Children { get; set; } {
public int Order { get; set; } FolderEntity = folderEntity;
public string Name { get; set; } Guid = folderEntity.Guid;
public void Update(double deltaTime) Profile = profile;
ParentFolder = folder;
Children = new List<ProfileElement>();
// 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 // Folders don't update but their children do
foreach (var profileElement in Children) foreach (var profileElement in Children)
profileElement.Update(deltaTime); 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 // Folders don't render but their children do
foreach (var profileElement in Children) foreach (var profileElement in Children)
profileElement.Render(deltaTime, surface, graphics); 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, profileElement.ApplyToEntity();
Order = folderEntity.Order // Add missing children
}; if (profileElement is Folder folder)
{
// TODO
}
else if (profileElement is Layer layer)
{
// TODO
}
// Load child folders // Remove extra childen
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;
} }
public override string ToString() public override string ToString()

View File

@ -1,7 +1,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Drawing; using System.Drawing;
using Artemis.Core.Models.Profile.Interfaces; using Artemis.Core.Models.Profile.Abstract;
using Artemis.Core.Plugins.Abstract; using Artemis.Core.Plugins.Abstract;
using Artemis.Core.Plugins.Interfaces; using Artemis.Core.Plugins.Interfaces;
using Artemis.Core.Services.Interfaces; using Artemis.Core.Services.Interfaces;
@ -9,22 +9,38 @@ using Artemis.Storage.Entities;
namespace Artemis.Core.Models.Profile 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; Profile = profile;
Children = new List<IProfileElement>(); 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 Profile Profile { get; }
public Folder ParentFolder { get; }
public LayerType LayerType { get; private set; } public LayerType LayerType { get; private set; }
public ILayerTypeConfiguration LayerTypeConfiguration { get; set; } public ILayerTypeConfiguration LayerTypeConfiguration { get; set; }
public List<IProfileElement> 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) if (LayerType == null)
return; 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) if (LayerType == null)
return; 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) LayerEntity.Guid = Guid;
{ LayerEntity.Order = Order;
Name = layerEntity.Name, LayerEntity.Name = Name;
Order = layerEntity.Order, LayerEntity.LayerTypeGuid = LayerType?.PluginInfo.Guid.ToString();
LayerType = pluginService.GetLayerTypeByGuid(Guid.Parse(layerEntity.Guid))
};
return layer; // TODO: Settings
} }
public void UpdateLayerType(LayerType layerType) public void UpdateLayerType(LayerType layerType)

View File

@ -1,15 +1,16 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Drawing; using System.Drawing;
using System.Linq;
using Artemis.Core.Exceptions; using Artemis.Core.Exceptions;
using Artemis.Core.Models.Profile.Interfaces; using Artemis.Core.Models.Profile.Abstract;
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.Entities;
namespace Artemis.Core.Models.Profile namespace Artemis.Core.Models.Profile
{ {
public class Profile : IProfileElement public class Profile : ProfileElement
{ {
internal Profile(PluginInfo pluginInfo, string name) internal Profile(PluginInfo pluginInfo, string name)
{ {
@ -19,7 +20,7 @@ namespace Artemis.Core.Models.Profile
PluginInfo = pluginInfo; PluginInfo = pluginInfo;
Name = name; Name = name;
Children = new List<IProfileElement>(); Children = new List<ProfileElement> {new Folder(this, null, "Root folder")};
} }
internal Profile(PluginInfo pluginInfo, ProfileEntity profileEntity, IPluginService pluginService) internal Profile(PluginInfo pluginInfo, ProfileEntity profileEntity, IPluginService pluginService)
@ -31,7 +32,7 @@ namespace Artemis.Core.Models.Profile
Name = profileEntity.Name; Name = profileEntity.Name;
// Populate the profile starting at the root, the rest is populated recursively // Populate the profile starting at the root, the rest is populated recursively
Children = new List<IProfileElement> {Folder.FromFolderEntity(this, profileEntity.RootFolder, pluginService)}; Children = new List<ProfileElement> {new Folder(this, null, profileEntity.RootFolder, pluginService)};
} }
public PluginInfo PluginInfo { get; } public PluginInfo PluginInfo { get; }
@ -39,11 +40,8 @@ namespace Artemis.Core.Models.Profile
internal ProfileEntity ProfileEntity { get; set; } internal ProfileEntity ProfileEntity { get; set; }
internal string Guid { get; set; } internal string Guid { get; set; }
public int Order { get; set; }
public string Name { get; set; }
public List<IProfileElement> Children { get; set; }
public void Update(double deltaTime) public override void Update(double deltaTime)
{ {
lock (this) 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) 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) lock (this)
{ {
@ -78,7 +85,7 @@ namespace Artemis.Core.Models.Profile
} }
} }
public void Deactivate() internal void Deactivate()
{ {
lock (this) lock (this)
{ {
@ -88,7 +95,7 @@ namespace Artemis.Core.Models.Profile
OnDeactivated(); OnDeactivated();
} }
} }
public override string ToString() public override string ToString()
{ {
return $"{nameof(Order)}: {Order}, {nameof(Name)}: {Name}, {nameof(PluginInfo)}: {PluginInfo}"; return $"{nameof(Order)}: {Order}, {nameof(Name)}: {Name}, {nameof(PluginInfo)}: {PluginInfo}";

View File

@ -44,18 +44,20 @@ namespace Artemis.Core.Services.Storage
public async Task<Profile> CreateProfile(ProfileModule module, string name) public async Task<Profile> CreateProfile(ProfileModule module, string name)
{ {
var profile = new Profile(module.PluginInfo, name); var profile = new Profile(module.PluginInfo, name);
await SaveProfile(profile);
return profile; return profile;
} }
public async Task SaveProfile(Profile profile) public async Task UpdateProfile(Profile profile, bool includeChildren)
{ {
// Find a matching profile entity to update profile.ApplyToEntity();
var existing = await _profileRepository.GetByGuidAsync(profile.) if (includeChildren)
// If not found, create a new one {
foreach (var profileElement in profile.Children)
await _profileRepository.SaveAsync(); {
profileElement.ApplyToEntity();
}
}
} }
} }
} }

View File

@ -15,5 +15,6 @@ namespace Artemis.Storage.Entities
public int Order { get; set; } public int Order { get; set; }
public string Name { get; set; } public string Name { get; set; }
public string LayerTypeGuid { get; set; }
} }
} }

View File

@ -72,10 +72,10 @@ namespace Artemis.UI.Screens.Module.ProfileEditor
Profiles.Clear(); Profiles.Clear();
Profiles.AddRange(profiles); Profiles.AddRange(profiles);
if (!profiles.Any()) // if (!profiles.Any())
{ // {
var profile = new Profile(Module.PluginInfo, "Default"); // var profile = new Profile(Module.PluginInfo, "Default");
} // }
} }
} }
} }

View File

@ -74,13 +74,14 @@ namespace Artemis.UI.Screens.SurfaceEditor
private void LoadSurfaceConfigurations() private void LoadSurfaceConfigurations()
{ {
// Get surface configs // Get surface configs
var configs = _surfaceService.SurfaceConfigurations; var configs = _surfaceService.SurfaceConfigurations.ToList();
// Get the active config, if empty, create a default config // Get the active config, if empty, create a default config
var activeConfig = _surfaceService.ActiveSurface; var activeConfig = _surfaceService.ActiveSurface;
if (activeConfig == null) if (activeConfig == null)
{ {
activeConfig = CreateSurfaceConfiguration("Default"); activeConfig = CreateSurfaceConfiguration("Default");
configs.Add(activeConfig);
_surfaceService.SetActiveSurfaceConfiguration(activeConfig); _surfaceService.SetActiveSurfaceConfiguration(activeConfig);
} }