Profiles - Added toggle to enable/disable folders, layers and effects

Profiles - Fixed folders not saving they children properly
UI - Show version and frame time in window title
This commit is contained in:
SpoinkyNL committed 2020-06-18 19:08:46 +02:00
1 parent 7921a4f932
commit 0903865c7d
27 files changed
+315 -97

No files matched your search

@@ -62,7 +62,7 @@ namespace Artemis.Core.Models.Profile
if (Parent is EffectProfileElement effectParent)
shapeClip = shapeClip.Op(effectParent.CreateShapeClip(), SKPathOp.Union);
foreach (var baseLayerEffect in LayerEffects)
foreach (var baseLayerEffect in LayerEffects.Where(e => e.Enabled))
{
var effectClip = baseLayerEffect.InternalCreateShapeClip(Path);
shapeClip = shapeClip.Op(effectClip, SKPathOp.Difference);
@@ -82,6 +82,7 @@ namespace Artemis.Core.Models.Profile
PluginGuid = layerEffect.PluginInfo.Guid,
EffectType = layerEffect.GetType().Name,
Name = layerEffect.Name,
Enabled = layerEffect.Enabled,
HasBeenRenamed = layerEffect.HasBeenRenamed,
Order = layerEffect.Order
};
+41 -3
View File
@@ -17,6 +17,7 @@ namespace Artemis.Core.Models.Profile
Profile = profile;
Parent = parent;
Name = name;
Enabled = true;
_layerEffects = new List<BaseLayerEffect>();
_expandedPropertyGroups = new List<string>();
@@ -31,6 +32,7 @@ namespace Artemis.Core.Models.Profile
Profile = profile;
Parent = parent;
Name = folderEntity.Name;
Enabled = folderEntity.Enabled;
Order = folderEntity.Order;
_layerEffects = new List<BaseLayerEffect>();
@@ -58,7 +60,10 @@ namespace Artemis.Core.Models.Profile
public override void Update(double deltaTime)
{
foreach (var baseLayerEffect in LayerEffects)
if (!Enabled)
return;
foreach (var baseLayerEffect in LayerEffects.Where(e => e.Enabled))
baseLayerEffect.Update(deltaTime);
// Iterate the children in reverse because that's how they must be rendered too
@@ -71,6 +76,12 @@ namespace Artemis.Core.Models.Profile
public override void Render(double deltaTime, SKCanvas canvas, SKImageInfo canvasInfo, SKPaint paint)
{
if (!Enabled)
return;
if (Path == null)
return;
canvas.Save();
canvas.ClipPath(Path);
@@ -79,7 +90,7 @@ namespace Artemis.Core.Models.Profile
// Pre-processing only affects other pre-processors and the brushes
canvas.Save();
foreach (var baseLayerEffect in LayerEffects)
foreach (var baseLayerEffect in LayerEffects.Where(e => e.Enabled))
baseLayerEffect.InternalPreProcess(canvas, canvasInfo, new SKPath(Path), groupPaint);
// Iterate the children in reverse because the first layer must be rendered last to end up on top
@@ -91,12 +102,17 @@ namespace Artemis.Core.Models.Profile
// Restore the canvas as to not be affected by pre-processors
canvas.Restore();
foreach (var baseLayerEffect in LayerEffects)
foreach (var baseLayerEffect in LayerEffects.Where(e => e.Enabled))
baseLayerEffect.InternalPostProcess(canvas, canvasInfo, new SKPath(Path), groupPaint);
canvas.Restore();
}
/// <summary>
/// Adds a new folder to the bottom of this folder
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public Folder AddFolder(string name)
{
var folder = new Folder(Profile, this, name) {Order = Children.LastOrDefault()?.Order ?? 1};
@@ -104,6 +120,20 @@ namespace Artemis.Core.Models.Profile
return folder;
}
/// <inheritdoc />
public override void AddChild(ProfileElement child, int? order = null)
{
base.AddChild(child, order);
CalculateRenderProperties();
}
/// <inheritdoc />
public override void RemoveChild(ProfileElement child)
{
base.RemoveChild(child);
CalculateRenderProperties();
}
public override string ToString()
{
return $"[Folder] {nameof(Name)}: {Name}, {nameof(Order)}: {Order}";
@@ -134,6 +164,7 @@ namespace Artemis.Core.Models.Profile
FolderEntity.Order = Order;
FolderEntity.Name = Name;
FolderEntity.Enabled = Enabled;
FolderEntity.ProfileId = Profile.EntityId;
@@ -152,5 +183,12 @@ namespace Artemis.Core.Models.Profile
}
#endregion
internal void Deactivate()
{
var layerEffects = new List<BaseLayerEffect>(LayerEffects);
foreach (var baseLayerEffect in layerEffects)
DeactivateLayerEffect(baseLayerEffect);
}
}
}
+16 -7
View File
@@ -34,6 +34,7 @@ namespace Artemis.Core.Models.Profile
Profile = profile;
Parent = parent;
Name = name;
Enabled = true;
General = new LayerGeneralProperties {IsCorePropertyGroup = true};
Transform = new LayerTransformProperties {IsCorePropertyGroup = true};
@@ -52,6 +53,7 @@ namespace Artemis.Core.Models.Profile
Profile = profile;
Parent = parent;
Name = layerEntity.Name;
Enabled = layerEntity.Enabled;
Order = layerEntity.Order;
General = new LayerGeneralProperties {IsCorePropertyGroup = true};
Transform = new LayerTransformProperties {IsCorePropertyGroup = true};
@@ -111,6 +113,7 @@ namespace Artemis.Core.Models.Profile
LayerEntity.Id = EntityId;
LayerEntity.ParentId = Parent?.EntityId ?? new Guid();
LayerEntity.Order = Order;
LayerEntity.Enabled = Enabled;
LayerEntity.Name = Name;
LayerEntity.ProfileId = Profile.EntityId;
LayerEntity.ExpandedPropertyGroups.Clear();
@@ -177,6 +180,9 @@ namespace Artemis.Core.Models.Profile
/// <inheritdoc />
public override void Update(double deltaTime)
{
if (!Enabled)
return;
if (LayerBrush?.BaseProperties == null || !LayerBrush.BaseProperties.PropertiesInitialized)
return;
@@ -192,7 +198,7 @@ namespace Artemis.Core.Models.Profile
General.Override(TimeSpan.Zero);
Transform.Override(TimeSpan.Zero);
LayerBrush.BaseProperties.Override(TimeSpan.Zero);
foreach (var baseLayerEffect in LayerEffects)
foreach (var baseLayerEffect in LayerEffects.Where(e => e.Enabled))
baseLayerEffect.BaseProperties?.Override(TimeSpan.Zero);
}
else
@@ -200,12 +206,12 @@ namespace Artemis.Core.Models.Profile
General.Update(deltaTime);
Transform.Update(deltaTime);
LayerBrush.BaseProperties.Update(deltaTime);
foreach (var baseLayerEffect in LayerEffects)
foreach (var baseLayerEffect in LayerEffects.Where(e => e.Enabled))
baseLayerEffect.BaseProperties?.Update(deltaTime);
}
LayerBrush.Update(deltaTime);
foreach (var baseLayerEffect in LayerEffects)
foreach (var baseLayerEffect in LayerEffects.Where(e => e.Enabled))
baseLayerEffect.Update(deltaTime);
}
@@ -221,6 +227,9 @@ namespace Artemis.Core.Models.Profile
/// <inheritdoc />
public override void Render(double deltaTime, SKCanvas canvas, SKImageInfo canvasInfo, SKPaint paint)
{
if (!Enabled)
return;
// Ensure the layer is ready
if (Path == null || LayerShape?.Path == null || !General.PropertiesInitialized || !Transform.PropertiesInitialized)
return;
@@ -230,13 +239,13 @@ namespace Artemis.Core.Models.Profile
canvas.Save();
canvas.ClipPath(Path);
paint.BlendMode = General.BlendMode.CurrentValue;
paint.Color = new SKColor(0, 0, 0, (byte) (Transform.Opacity.CurrentValue * 2.55f));
// Pre-processing only affects other pre-processors and the brushes
canvas.Save();
foreach (var baseLayerEffect in LayerEffects)
foreach (var baseLayerEffect in LayerEffects.Where(e => e.Enabled))
baseLayerEffect.InternalPreProcess(canvas, canvasInfo, new SKPath(Path), paint);
// Shape clip must be determined before commiting to any rendering
@@ -253,9 +262,9 @@ namespace Artemis.Core.Models.Profile
// Restore the canvas as to not be affected by pre-processors
canvas.Restore();
foreach (var baseLayerEffect in LayerEffects)
foreach (var baseLayerEffect in LayerEffects.Where(e => e.Enabled))
baseLayerEffect.InternalPostProcess(canvas, canvasInfo, new SKPath(Path), paint);
canvas.Restore();
}
+11 -4
View File
@@ -21,7 +21,7 @@ namespace Artemis.Core.Models.Profile
UndoStack = new Stack<string>();
RedoStack = new Stack<string>();
AddChild(new Folder(this, null, "Root folder"));
AddChild(new Folder(this, this, "Root folder"));
ApplyToEntity();
}
@@ -80,13 +80,18 @@ namespace Artemis.Core.Models.Profile
lock (_children)
{
foreach (var folder in GetAllFolders())
folder.Deactivate();
foreach (var layer in GetAllLayers())
layer.Deactivate();
_children.Clear();
// Populate the profile starting at the root, the rest is populated recursively
var rootFolder = ProfileEntity.Folders.FirstOrDefault(f => f.ParentId == new Guid());
var rootFolder = ProfileEntity.Folders.FirstOrDefault(f => f.ParentId == EntityId);
if (rootFolder == null)
AddChild(new Folder(this, null, "Root folder"));
AddChild(new Folder(this, this, "Root folder"));
else
AddChild(new Folder(this, null, rootFolder));
AddChild(new Folder(this, this, rootFolder));
}
}
@@ -132,6 +137,8 @@ namespace Artemis.Core.Models.Profile
if (!IsActivated)
return;
foreach (var folder in GetAllFolders())
folder.Deactivate();
foreach (var layer in GetAllLayers())
layer.Deactivate();
@@ -35,6 +35,11 @@ namespace Artemis.Core.Models.Profile
/// </summary>
public string Name { get; set; }
/// <summary>
/// Gets or sets the enabled state, if not enabled the element is skipped in render and update
/// </summary>
public bool Enabled { get; set; }
/// <summary>
/// Updates the element
/// </summary>
@@ -79,7 +84,7 @@ namespace Artemis.Core.Models.Profile
/// </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)
public virtual void AddChild(ProfileElement child, int? order = null)
{
lock (_children)
{
@@ -88,23 +93,25 @@ namespace Artemis.Core.Models.Profile
{
_children.Add(child);
child.Order = _children.Count;
return;
}
// Shift everything after the given order
else
{
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;
}
// 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;
}
}
@@ -113,7 +120,7 @@ namespace Artemis.Core.Models.Profile
/// 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)
public virtual void RemoveChild(ProfileElement child)
{
lock (_children)
{