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:
parent
8e04fa1a01
commit
d4dd371a50
@ -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" />
|
||||||
|
|||||||
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -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()
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
@ -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}";
|
||||||
|
|||||||
@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -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; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -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");
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user