mirror of
https://github.com/Artemis-RGB/Artemis
synced 2026-11-11 19:36:28 +00:00
Added profile hierarchy creation and editing (doesn't save yet)
This commit is contained in:
1 parent
ff959b6f9c
commit
1bb2d4a4f2
43 files changed
+676
-241
No files matched your search
@@ -1,4 +1,6 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
|
||||
@@ -6,15 +8,26 @@ namespace Artemis.Core.Models.Profile.Abstract
|
||||
{
|
||||
public abstract class ProfileElement
|
||||
{
|
||||
protected List<ProfileElement> _children;
|
||||
|
||||
protected ProfileElement()
|
||||
{
|
||||
_children = new List<ProfileElement>();
|
||||
}
|
||||
|
||||
public Guid EntityId { get; internal set; }
|
||||
public Profile Profile { get; internal set; }
|
||||
public ProfileElement Parent { get; internal set; }
|
||||
|
||||
/// <summary>
|
||||
/// The element's children
|
||||
/// </summary>
|
||||
public List<ProfileElement> Children { get; set; }
|
||||
public ReadOnlyCollection<ProfileElement> Children => _children.AsReadOnly();
|
||||
|
||||
/// <summary>
|
||||
/// The order in which this element appears in the update loop and editor
|
||||
/// </summary>
|
||||
public int Order { get; set; }
|
||||
public int Order { get; internal set; }
|
||||
|
||||
/// <summary>
|
||||
/// The name which appears in the editor
|
||||
@@ -60,5 +73,58 @@ namespace Artemis.Core.Models.Profile.Abstract
|
||||
|
||||
return folders;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Adds a profile element to the <see cref="Children" /> collection, optionally at the given position (1-based)
|
||||
/// </summary>
|
||||
/// <param name="child">The profile element to add</param>
|
||||
/// <param name="order">The order where to place the child (1-based), defaults to the end of the collection</param>
|
||||
public void AddChild(ProfileElement child, int? order = null)
|
||||
{
|
||||
lock (_children)
|
||||
{
|
||||
// Add to the end of the list
|
||||
if (order == null)
|
||||
{
|
||||
_children.Add(child);
|
||||
child.Order = _children.Count;
|
||||
return;
|
||||
}
|
||||
|
||||
// Shift everything after the given order
|
||||
foreach (var profileElement in _children.Where(c => c.Order >= order).ToList())
|
||||
profileElement.Order++;
|
||||
|
||||
int targetIndex;
|
||||
if (order == 0)
|
||||
targetIndex = 0;
|
||||
else if (order > _children.Count)
|
||||
targetIndex = _children.Count;
|
||||
else
|
||||
targetIndex = _children.FindIndex(c => c.Order == order + 1);
|
||||
|
||||
_children.Insert(targetIndex, child);
|
||||
child.Order = order.Value;
|
||||
child.Parent = this;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Removes a profile element from the <see cref="Children" /> collection
|
||||
/// </summary>
|
||||
/// <param name="child">The profile element to remove</param>
|
||||
public void RemoveChild(ProfileElement child)
|
||||
{
|
||||
lock (_children)
|
||||
{
|
||||
_children.Remove(child);
|
||||
|
||||
// Shift everything after the given order
|
||||
foreach (var profileElement in _children.Where(c => c.Order > child.Order).ToList())
|
||||
profileElement.Order--;
|
||||
|
||||
child.Parent = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -10,40 +10,41 @@ namespace Artemis.Core.Models.Profile
|
||||
{
|
||||
public sealed class Folder : ProfileElement
|
||||
{
|
||||
public Folder(Profile profile, Folder folder, string name)
|
||||
public Folder(Profile profile, ProfileElement parent, string name)
|
||||
{
|
||||
FolderEntity = new FolderEntity();
|
||||
EntityId = Guid.NewGuid();
|
||||
|
||||
Profile = profile;
|
||||
ParentFolder = folder;
|
||||
Parent = parent;
|
||||
Name = name;
|
||||
Children = new List<ProfileElement>();
|
||||
}
|
||||
|
||||
public Folder(Profile profile, Folder folder, FolderEntity folderEntity, IPluginService pluginService)
|
||||
public Folder(Profile profile, ProfileElement parent, FolderEntity folderEntity, IPluginService pluginService)
|
||||
{
|
||||
FolderEntity = folderEntity;
|
||||
EntityId = folderEntity.Id;
|
||||
|
||||
Profile = profile;
|
||||
ParentFolder = folder;
|
||||
Children = new List<ProfileElement>();
|
||||
Parent = parent;
|
||||
|
||||
// Load child folders
|
||||
foreach (var childFolder in Profile.ProfileEntity.Folders.Where(f => f.ParentId == EntityId))
|
||||
folder.Children.Add(new Folder(profile, this, childFolder, pluginService));
|
||||
_children.Add(new Folder(profile, this, childFolder, pluginService));
|
||||
// Load child layers
|
||||
foreach (var childLayer in Profile.ProfileEntity.Layers.Where(f => f.ParentId == EntityId))
|
||||
folder.Children.Add(new Layer(profile, this, childLayer, pluginService));
|
||||
_children.Add(new Layer(profile, this, childLayer, pluginService));
|
||||
|
||||
// Ensure order integrity, should be unnecessary but no one is perfect specially me
|
||||
_children = _children.OrderBy(c => c.Order).ToList();
|
||||
for (var index = 0; index < _children.Count; index++)
|
||||
{
|
||||
var profileElement = _children[index];
|
||||
profileElement.Order = index + 1;
|
||||
}
|
||||
}
|
||||
|
||||
internal FolderEntity FolderEntity { get; set; }
|
||||
internal Guid EntityId { get; set; }
|
||||
|
||||
public Profile Profile { get; }
|
||||
public Folder ParentFolder { get; }
|
||||
|
||||
|
||||
public override void Update(double deltaTime)
|
||||
{
|
||||
@@ -59,10 +60,24 @@ namespace Artemis.Core.Models.Profile
|
||||
profileElement.Render(deltaTime, surface, graphics);
|
||||
}
|
||||
|
||||
public Folder AddFolder(string name)
|
||||
{
|
||||
var folder = new Folder(Profile, this, name) {Order = Children.LastOrDefault()?.Order ?? 1};
|
||||
AddChild(folder);
|
||||
return folder;
|
||||
}
|
||||
|
||||
public Layer AddLayer(string name)
|
||||
{
|
||||
var layer = new Layer(Profile, this, name) {Order = Children.LastOrDefault()?.Order ?? 1};
|
||||
AddChild(layer);
|
||||
return layer;
|
||||
}
|
||||
|
||||
internal override void ApplyToEntity()
|
||||
{
|
||||
FolderEntity.Id = EntityId;
|
||||
FolderEntity.ParentId = ParentFolder?.EntityId ?? new Guid();
|
||||
FolderEntity.ParentId = Parent?.EntityId ?? new Guid();
|
||||
|
||||
FolderEntity.Order = Order;
|
||||
FolderEntity.Name = Name;
|
||||
@@ -74,7 +89,7 @@ namespace Artemis.Core.Models.Profile
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return $"{nameof(Profile)}: {Profile}, {nameof(Order)}: {Order}, {nameof(Name)}: {Name}";
|
||||
return $"Folder - {nameof(Name)}: {Name}, {nameof(Order)}: {Order}";
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3,6 +3,7 @@ using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Drawing.Drawing2D;
|
||||
using System.Linq;
|
||||
using System.Reflection.Metadata.Ecma335;
|
||||
using Artemis.Core.Extensions;
|
||||
using Artemis.Core.Models.Profile.Abstract;
|
||||
using Artemis.Core.Models.Surface;
|
||||
@@ -16,33 +17,29 @@ namespace Artemis.Core.Models.Profile
|
||||
{
|
||||
public sealed class Layer : ProfileElement
|
||||
{
|
||||
internal Layer(Profile profile, Folder folder, string name)
|
||||
internal Layer(Profile profile, ProfileElement parent, string name)
|
||||
{
|
||||
LayerEntity = new LayerEntity();
|
||||
EntityId = Guid.NewGuid();
|
||||
|
||||
Profile = profile;
|
||||
ParentFolder = folder;
|
||||
Parent = parent;
|
||||
Name = name;
|
||||
Leds = new List<DeviceLed>();
|
||||
}
|
||||
|
||||
internal Layer(Profile profile, Folder folder, LayerEntity layerEntity, IPluginService pluginService)
|
||||
internal Layer(Profile profile, ProfileElement parent, LayerEntity layerEntity, IPluginService pluginService)
|
||||
{
|
||||
LayerEntity = layerEntity;
|
||||
EntityId = layerEntity.Id;
|
||||
|
||||
Profile = profile;
|
||||
ParentFolder = folder;
|
||||
Parent = parent;
|
||||
LayerType = pluginService.GetLayerTypeByGuid(layerEntity.LayerTypeGuid);
|
||||
Leds = new List<DeviceLed>();
|
||||
}
|
||||
|
||||
internal LayerEntity LayerEntity { get; set; }
|
||||
internal Guid EntityId { get; set; }
|
||||
|
||||
public Profile Profile { get; }
|
||||
public Folder ParentFolder { get; }
|
||||
|
||||
public List<DeviceLed> Leds { get; private set; }
|
||||
public LayerType LayerType { get; private set; }
|
||||
@@ -76,7 +73,7 @@ namespace Artemis.Core.Models.Profile
|
||||
internal override void ApplyToEntity()
|
||||
{
|
||||
LayerEntity.Id = EntityId;
|
||||
LayerEntity.ParentId = ParentFolder?.EntityId ?? new Guid();
|
||||
LayerEntity.ParentId = Parent?.EntityId ?? new Guid();
|
||||
LayerEntity.LayerTypeGuid = LayerType?.PluginInfo.Guid ?? new Guid();
|
||||
|
||||
LayerEntity.Order = Order;
|
||||
@@ -135,7 +132,7 @@ namespace Artemis.Core.Models.Profile
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return $"{nameof(Profile)}: {Profile}, {nameof(Order)}: {Order}, {nameof(Name)}: {Name}";
|
||||
return $"Layer - {nameof(Name)}: {Name}, {nameof(Order)}: {Order}";
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,4 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using Artemis.Core.Exceptions;
|
||||
@@ -20,8 +19,7 @@ namespace Artemis.Core.Models.Profile
|
||||
PluginInfo = pluginInfo;
|
||||
Name = name;
|
||||
|
||||
Children = new List<ProfileElement> {new Folder(this, null, "Root folder")};
|
||||
|
||||
AddChild(new Folder(this, null, "Root folder"));
|
||||
ApplyToEntity();
|
||||
}
|
||||
|
||||
@@ -36,16 +34,15 @@ namespace Artemis.Core.Models.Profile
|
||||
// Populate the profile starting at the root, the rest is populated recursively
|
||||
var rootFolder = profileEntity.Folders.FirstOrDefault(f => f.ParentId == new Guid());
|
||||
if (rootFolder == null)
|
||||
Children = new List<ProfileElement> {new Folder(this, null, "Root folder")};
|
||||
AddChild(new Folder(this, null, "Root folder"));
|
||||
else
|
||||
Children = new List<ProfileElement> {new Folder(this, null, rootFolder, pluginService)};
|
||||
AddChild(new Folder(this, null, rootFolder, pluginService));
|
||||
}
|
||||
|
||||
public PluginInfo PluginInfo { get; }
|
||||
public bool IsActivated { get; private set; }
|
||||
|
||||
internal ProfileEntity ProfileEntity { get; set; }
|
||||
public Guid EntityId { get; set; }
|
||||
|
||||
public override void Update(double deltaTime)
|
||||
{
|
||||
@@ -116,6 +113,12 @@ namespace Artemis.Core.Models.Profile
|
||||
return $"{nameof(Order)}: {Order}, {nameof(Name)}: {Name}, {nameof(PluginInfo)}: {PluginInfo}";
|
||||
}
|
||||
|
||||
public void ApplySurface(Surface.Surface surface)
|
||||
{
|
||||
foreach (var layer in GetAllLayers())
|
||||
layer.ApplySurface(surface);
|
||||
}
|
||||
|
||||
#region Events
|
||||
|
||||
/// <summary>
|
||||
@@ -139,11 +142,5 @@ namespace Artemis.Core.Models.Profile
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
public void ApplySurface(Surface.Surface surface)
|
||||
{
|
||||
foreach (var layer in GetAllLayers())
|
||||
layer.ApplySurface(surface);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user