|
@@ -1,6 +1,7 @@
|
|
using System.Collections.ObjectModel;
|
|
using System.Collections.ObjectModel;
|
|
using System.Collections.Specialized;
|
|
using System.Collections.Specialized;
|
|
using System.ComponentModel;
|
|
using System.ComponentModel;
|
|
|
|
+using System.Diagnostics.CodeAnalysis;
|
|
using System.Reflection;
|
|
using System.Reflection;
|
|
using Avalonia;
|
|
using Avalonia;
|
|
using Avalonia.Media;
|
|
using Avalonia.Media;
|
|
@@ -25,6 +26,7 @@ namespace PixiEditor.ViewModels.Nodes;
|
|
internal abstract class NodeViewModel : ObservableObject, INodeHandler
|
|
internal abstract class NodeViewModel : ObservableObject, INodeHandler
|
|
{
|
|
{
|
|
private LocalizedString displayName;
|
|
private LocalizedString displayName;
|
|
|
|
+ private Rect size;
|
|
private IBrush? categoryBrush;
|
|
private IBrush? categoryBrush;
|
|
private string? nodeNameBindable;
|
|
private string? nodeNameBindable;
|
|
private VecD position;
|
|
private VecD position;
|
|
@@ -111,6 +113,12 @@ internal abstract class NodeViewModel : ObservableObject, INodeHandler
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ public Rect UiSize
|
|
|
|
+ {
|
|
|
|
+ get => size;
|
|
|
|
+ set => SetProperty(ref size, value);
|
|
|
|
+ }
|
|
|
|
+
|
|
public ObservableRangeCollection<INodePropertyHandler> Inputs
|
|
public ObservableRangeCollection<INodePropertyHandler> Inputs
|
|
{
|
|
{
|
|
get => inputs;
|
|
get => inputs;
|
|
@@ -218,7 +226,11 @@ internal abstract class NodeViewModel : ObservableObject, INodeHandler
|
|
|
|
|
|
public string Icon => icon ??= GetType().GetCustomAttribute<NodeViewModelAttribute>().Icon;
|
|
public string Icon => icon ??= GetType().GetCustomAttribute<NodeViewModelAttribute>().Icon;
|
|
|
|
|
|
- public void TraverseBackwards(Func<INodeHandler, bool> func)
|
|
|
|
|
|
+ [DoesNotReturn]
|
|
|
|
+ private void ThrowInvalidTraverseResult(Traverse traverse) =>
|
|
|
|
+ throw new IndexOutOfRangeException($"Invalid Traverse Option '{traverse}'");
|
|
|
|
+
|
|
|
|
+ public void TraverseBackwards(Func<INodeHandler, Traverse> func)
|
|
{
|
|
{
|
|
var visited = new HashSet<INodeHandler>();
|
|
var visited = new HashSet<INodeHandler>();
|
|
var queueNodes = new Queue<INodeHandler>();
|
|
var queueNodes = new Queue<INodeHandler>();
|
|
@@ -233,9 +245,18 @@ internal abstract class NodeViewModel : ObservableObject, INodeHandler
|
|
continue;
|
|
continue;
|
|
}
|
|
}
|
|
|
|
|
|
- if (!func(node))
|
|
|
|
|
|
+ var result = func(node);
|
|
|
|
+ switch (result)
|
|
{
|
|
{
|
|
- return;
|
|
|
|
|
|
+ case Traverse.NoFurther:
|
|
|
|
+ continue;
|
|
|
|
+ case Traverse.Exit:
|
|
|
|
+ return;
|
|
|
|
+ case Traverse.Further:
|
|
|
|
+ break;
|
|
|
|
+ default:
|
|
|
|
+ ThrowInvalidTraverseResult(result);
|
|
|
|
+ break;
|
|
}
|
|
}
|
|
|
|
|
|
foreach (var inputProperty in node.Inputs)
|
|
foreach (var inputProperty in node.Inputs)
|
|
@@ -248,7 +269,7 @@ internal abstract class NodeViewModel : ObservableObject, INodeHandler
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- public void TraverseBackwards(Func<INodeHandler, INodeHandler, bool> func)
|
|
|
|
|
|
+ public void TraverseBackwards(Func<INodeHandler, INodeHandler, Traverse> func)
|
|
{
|
|
{
|
|
var visited = new HashSet<INodeHandler>();
|
|
var visited = new HashSet<INodeHandler>();
|
|
var queueNodes = new Queue<(INodeHandler, INodeHandler)>();
|
|
var queueNodes = new Queue<(INodeHandler, INodeHandler)>();
|
|
@@ -263,9 +284,18 @@ internal abstract class NodeViewModel : ObservableObject, INodeHandler
|
|
continue;
|
|
continue;
|
|
}
|
|
}
|
|
|
|
|
|
- if (!func(node.Item1, node.Item2))
|
|
|
|
|
|
+ var result = func(node.Item1, node.Item2);
|
|
|
|
+ switch (result)
|
|
{
|
|
{
|
|
- return;
|
|
|
|
|
|
+ case Traverse.NoFurther:
|
|
|
|
+ continue;
|
|
|
|
+ case Traverse.Exit:
|
|
|
|
+ return;
|
|
|
|
+ case Traverse.Further:
|
|
|
|
+ break;
|
|
|
|
+ default:
|
|
|
|
+ ThrowInvalidTraverseResult(result);
|
|
|
|
+ break;
|
|
}
|
|
}
|
|
|
|
|
|
foreach (var inputProperty in node.Item1.Inputs)
|
|
foreach (var inputProperty in node.Item1.Inputs)
|
|
@@ -278,7 +308,7 @@ internal abstract class NodeViewModel : ObservableObject, INodeHandler
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- public void TraverseBackwards(Func<INodeHandler, INodeHandler, INodePropertyHandler, bool> func)
|
|
|
|
|
|
+ public void TraverseBackwards(Func<INodeHandler, INodeHandler, INodePropertyHandler, Traverse> func)
|
|
{
|
|
{
|
|
var visited = new HashSet<INodeHandler>();
|
|
var visited = new HashSet<INodeHandler>();
|
|
var queueNodes = new Queue<(INodeHandler, INodeHandler, INodePropertyHandler)>();
|
|
var queueNodes = new Queue<(INodeHandler, INodeHandler, INodePropertyHandler)>();
|
|
@@ -292,10 +322,18 @@ internal abstract class NodeViewModel : ObservableObject, INodeHandler
|
|
{
|
|
{
|
|
continue;
|
|
continue;
|
|
}
|
|
}
|
|
-
|
|
|
|
- if (!func(node.Item1, node.Item2, node.Item3))
|
|
|
|
|
|
+ var result = func(node.Item1, node.Item2, node.Item3);
|
|
|
|
+ switch (result)
|
|
{
|
|
{
|
|
- return;
|
|
|
|
|
|
+ case Traverse.NoFurther:
|
|
|
|
+ continue;
|
|
|
|
+ case Traverse.Exit:
|
|
|
|
+ return;
|
|
|
|
+ case Traverse.Further:
|
|
|
|
+ break;
|
|
|
|
+ default:
|
|
|
|
+ ThrowInvalidTraverseResult(result);
|
|
|
|
+ break;
|
|
}
|
|
}
|
|
|
|
|
|
foreach (var inputProperty in node.Item1.Inputs)
|
|
foreach (var inputProperty in node.Item1.Inputs)
|
|
@@ -308,7 +346,7 @@ internal abstract class NodeViewModel : ObservableObject, INodeHandler
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- public void TraverseForwards(Func<INodeHandler, bool> func)
|
|
|
|
|
|
+ public void TraverseForwards(Func<INodeHandler, Traverse> func)
|
|
{
|
|
{
|
|
var visited = new HashSet<INodeHandler>();
|
|
var visited = new HashSet<INodeHandler>();
|
|
var queueNodes = new Queue<INodeHandler>();
|
|
var queueNodes = new Queue<INodeHandler>();
|
|
@@ -322,10 +360,19 @@ internal abstract class NodeViewModel : ObservableObject, INodeHandler
|
|
{
|
|
{
|
|
continue;
|
|
continue;
|
|
}
|
|
}
|
|
-
|
|
|
|
- if (!func(node))
|
|
|
|
|
|
+
|
|
|
|
+ var result = func(node);
|
|
|
|
+ switch (result)
|
|
{
|
|
{
|
|
- return;
|
|
|
|
|
|
+ case Traverse.NoFurther:
|
|
|
|
+ continue;
|
|
|
|
+ case Traverse.Exit:
|
|
|
|
+ return;
|
|
|
|
+ case Traverse.Further:
|
|
|
|
+ break;
|
|
|
|
+ default:
|
|
|
|
+ ThrowInvalidTraverseResult(result);
|
|
|
|
+ break;
|
|
}
|
|
}
|
|
|
|
|
|
foreach (var outputProperty in node.Outputs)
|
|
foreach (var outputProperty in node.Outputs)
|
|
@@ -338,7 +385,7 @@ internal abstract class NodeViewModel : ObservableObject, INodeHandler
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- public void TraverseForwards(Func<INodeHandler, INodeHandler, bool> func)
|
|
|
|
|
|
+ public void TraverseForwards(Func<INodeHandler, INodeHandler, Traverse> func)
|
|
{
|
|
{
|
|
var visited = new HashSet<INodeHandler>();
|
|
var visited = new HashSet<INodeHandler>();
|
|
var queueNodes = new Queue<(INodeHandler, INodeHandler)>();
|
|
var queueNodes = new Queue<(INodeHandler, INodeHandler)>();
|
|
@@ -352,10 +399,19 @@ internal abstract class NodeViewModel : ObservableObject, INodeHandler
|
|
{
|
|
{
|
|
continue;
|
|
continue;
|
|
}
|
|
}
|
|
-
|
|
|
|
- if (!func(node.Item1, node.Item2))
|
|
|
|
|
|
+
|
|
|
|
+ var result = func(node.Item1, node.Item2);
|
|
|
|
+ switch (result)
|
|
{
|
|
{
|
|
- return;
|
|
|
|
|
|
+ case Traverse.NoFurther:
|
|
|
|
+ continue;
|
|
|
|
+ case Traverse.Exit:
|
|
|
|
+ return;
|
|
|
|
+ case Traverse.Further:
|
|
|
|
+ break;
|
|
|
|
+ default:
|
|
|
|
+ ThrowInvalidTraverseResult(result);
|
|
|
|
+ break;
|
|
}
|
|
}
|
|
|
|
|
|
foreach (var outputProperty in node.Item1.Outputs)
|
|
foreach (var outputProperty in node.Item1.Outputs)
|
|
@@ -368,7 +424,7 @@ internal abstract class NodeViewModel : ObservableObject, INodeHandler
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- public void TraverseForwards(Func<INodeHandler, INodeHandler, INodePropertyHandler, bool> func)
|
|
|
|
|
|
+ public void TraverseForwards(Func<INodeHandler, INodeHandler, INodePropertyHandler, Traverse> func)
|
|
{
|
|
{
|
|
var visited = new HashSet<INodeHandler>();
|
|
var visited = new HashSet<INodeHandler>();
|
|
var queueNodes = new Queue<(INodeHandler, INodeHandler, INodePropertyHandler)>();
|
|
var queueNodes = new Queue<(INodeHandler, INodeHandler, INodePropertyHandler)>();
|
|
@@ -383,9 +439,18 @@ internal abstract class NodeViewModel : ObservableObject, INodeHandler
|
|
continue;
|
|
continue;
|
|
}
|
|
}
|
|
|
|
|
|
- if (!func(node.Item1, node.Item2, node.Item3))
|
|
|
|
|
|
+ var result = func(node.Item1, node.Item2, node.Item3);
|
|
|
|
+ switch (result)
|
|
{
|
|
{
|
|
- return;
|
|
|
|
|
|
+ case Traverse.NoFurther:
|
|
|
|
+ continue;
|
|
|
|
+ case Traverse.Exit:
|
|
|
|
+ return;
|
|
|
|
+ case Traverse.Further:
|
|
|
|
+ break;
|
|
|
|
+ default:
|
|
|
|
+ ThrowInvalidTraverseResult(result);
|
|
|
|
+ break;
|
|
}
|
|
}
|
|
|
|
|
|
foreach (var outputProperty in node.Item1.Outputs)
|
|
foreach (var outputProperty in node.Item1.Outputs)
|
|
@@ -399,7 +464,7 @@ internal abstract class NodeViewModel : ObservableObject, INodeHandler
|
|
}
|
|
}
|
|
|
|
|
|
public void TraverseForwards(
|
|
public void TraverseForwards(
|
|
- Func<INodeHandler, INodeHandler, INodePropertyHandler, INodePropertyHandler, bool> func)
|
|
|
|
|
|
+ Func<INodeHandler, INodeHandler, INodePropertyHandler, INodePropertyHandler, Traverse> func)
|
|
{
|
|
{
|
|
var visited = new HashSet<INodeHandler>();
|
|
var visited = new HashSet<INodeHandler>();
|
|
var queueNodes = new Queue<(INodeHandler, INodeHandler, INodePropertyHandler, INodePropertyHandler)>();
|
|
var queueNodes = new Queue<(INodeHandler, INodeHandler, INodePropertyHandler, INodePropertyHandler)>();
|
|
@@ -414,9 +479,18 @@ internal abstract class NodeViewModel : ObservableObject, INodeHandler
|
|
continue;
|
|
continue;
|
|
}
|
|
}
|
|
|
|
|
|
- if (!func(node.Item1, node.Item2, node.Item3, node.Item4))
|
|
|
|
|
|
+ var result = func(node.Item1, node.Item2, node.Item3, node.Item4);
|
|
|
|
+ switch (result)
|
|
{
|
|
{
|
|
- return;
|
|
|
|
|
|
+ case Traverse.NoFurther:
|
|
|
|
+ continue;
|
|
|
|
+ case Traverse.Exit:
|
|
|
|
+ return;
|
|
|
|
+ case Traverse.Further:
|
|
|
|
+ break;
|
|
|
|
+ default:
|
|
|
|
+ ThrowInvalidTraverseResult(result);
|
|
|
|
+ break;
|
|
}
|
|
}
|
|
|
|
|
|
foreach (var outputProperty in node.Item1.Outputs)
|
|
foreach (var outputProperty in node.Item1.Outputs)
|
|
@@ -429,6 +503,7 @@ internal abstract class NodeViewModel : ObservableObject, INodeHandler
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ public HashSet<NodeFrameViewModelBase> Frames { get; } = [];
|
|
|
|
|
|
public virtual void Dispose()
|
|
public virtual void Dispose()
|
|
{
|
|
{
|