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\PluginSettings.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\Profile.cs" />
<Compile Include="Ninject\CoreModule.cs" />

View File

@ -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
{
/// <summary>
/// The element's children
/// </summary>
List<IProfileElement> Children { get; set; }
public List<ProfileElement> Children { get; set; }
/// <summary>
/// The order in which this element appears in the update loop and editor
/// </summary>
int Order { get; set; }
public int Order { get; set; }
/// <summary>
/// The name which appears in the editor
/// </summary>
string Name { get; set; }
public string Name { get; set; }
/// <summary>
/// Updates the element
/// </summary>
/// <param name="deltaTime"></param>
void Update(double deltaTime);
public abstract void Update(double deltaTime);
/// <summary>
/// Renders the element
/// </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.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<IProfileElement>();
ParentFolder = folder;
Name = name;
Children = new List<ProfileElement>();
}
public Profile Profile { get; }
public List<IProfileElement> 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<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
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()

View File

@ -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<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 Folder ParentFolder { get; }
public LayerType LayerType { get; private 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)
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)

View File

@ -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<IProfileElement>();
Children = new List<ProfileElement> {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<IProfileElement> {Folder.FromFolderEntity(this, profileEntity.RootFolder, pluginService)};
Children = new List<ProfileElement> {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<IProfileElement> 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}";

View File

@ -44,18 +44,20 @@ namespace Artemis.Core.Services.Storage
public async Task<Profile> 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();
}
}
}
}
}

View File

@ -15,5 +15,6 @@ namespace Artemis.Storage.Entities
public int Order { 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.AddRange(profiles);
if (!profiles.Any())
{
var profile = new Profile(Module.PluginInfo, "Default");
}
// if (!profiles.Any())
// {
// var profile = new Profile(Module.PluginInfo, "Default");
// }
}
}
}

View File

@ -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);
}