|
@@ -1,6 +1,7 @@
|
|
|
using System.Collections.ObjectModel;
|
|
|
using System.Collections.Specialized;
|
|
|
using System.ComponentModel;
|
|
|
+using System.Diagnostics.CodeAnalysis;
|
|
|
using System.Reflection;
|
|
|
using Avalonia;
|
|
|
using Avalonia.Media;
|
|
@@ -225,7 +226,11 @@ internal abstract class NodeViewModel : ObservableObject, INodeHandler
|
|
|
|
|
|
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 queueNodes = new Queue<INodeHandler>();
|
|
@@ -240,9 +245,18 @@ internal abstract class NodeViewModel : ObservableObject, INodeHandler
|
|
|
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)
|
|
@@ -255,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 queueNodes = new Queue<(INodeHandler, INodeHandler)>();
|
|
@@ -270,9 +284,18 @@ internal abstract class NodeViewModel : ObservableObject, INodeHandler
|
|
|
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)
|
|
@@ -285,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 queueNodes = new Queue<(INodeHandler, INodeHandler, INodePropertyHandler)>();
|
|
@@ -299,10 +322,18 @@ internal abstract class NodeViewModel : ObservableObject, INodeHandler
|
|
|
{
|
|
|
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)
|
|
@@ -315,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 queueNodes = new Queue<INodeHandler>();
|
|
@@ -329,10 +360,19 @@ internal abstract class NodeViewModel : ObservableObject, INodeHandler
|
|
|
{
|
|
|
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)
|
|
@@ -345,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 queueNodes = new Queue<(INodeHandler, INodeHandler)>();
|
|
@@ -359,10 +399,19 @@ internal abstract class NodeViewModel : ObservableObject, INodeHandler
|
|
|
{
|
|
|
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)
|
|
@@ -375,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 queueNodes = new Queue<(INodeHandler, INodeHandler, INodePropertyHandler)>();
|
|
@@ -390,9 +439,18 @@ internal abstract class NodeViewModel : ObservableObject, INodeHandler
|
|
|
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)
|
|
@@ -406,7 +464,7 @@ internal abstract class NodeViewModel : ObservableObject, INodeHandler
|
|
|
}
|
|
|
|
|
|
public void TraverseForwards(
|
|
|
- Func<INodeHandler, INodeHandler, INodePropertyHandler, INodePropertyHandler, bool> func)
|
|
|
+ Func<INodeHandler, INodeHandler, INodePropertyHandler, INodePropertyHandler, Traverse> func)
|
|
|
{
|
|
|
var visited = new HashSet<INodeHandler>();
|
|
|
var queueNodes = new Queue<(INodeHandler, INodeHandler, INodePropertyHandler, INodePropertyHandler)>();
|
|
@@ -421,9 +479,18 @@ internal abstract class NodeViewModel : ObservableObject, INodeHandler
|
|
|
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)
|