diff --git a/src/Artemis.Core/VisualScripting/Interfaces/INode.cs b/src/Artemis.Core/VisualScripting/Interfaces/INode.cs
index 98e1e31ac..4ce40a0ab 100644
--- a/src/Artemis.Core/VisualScripting/Interfaces/INode.cs
+++ b/src/Artemis.Core/VisualScripting/Interfaces/INode.cs
@@ -16,9 +16,9 @@ public interface INode : INotifyPropertyChanged, IBreakableModel
Guid Id { get; set; }
///
- /// Gets
+ /// Gets or sets the node data with information about this node
///
- NodeData NodeData { get; set; }
+ NodeData? NodeData { get; set; }
///
/// Gets the name of the node
diff --git a/src/Artemis.Core/VisualScripting/Nodes/Node.cs b/src/Artemis.Core/VisualScripting/Nodes/Node.cs
index 3780e6e07..8d4a40d3d 100644
--- a/src/Artemis.Core/VisualScripting/Nodes/Node.cs
+++ b/src/Artemis.Core/VisualScripting/Nodes/Node.cs
@@ -42,7 +42,7 @@ public abstract class Node : BreakableModel, INode
}
///
- public NodeData NodeData { get; set; }
+ public NodeData? NodeData { get; set; }
private string _name;
diff --git a/src/Artemis.Core/VisualScripting/Nodes/NodeTStorageTViewModel.cs b/src/Artemis.Core/VisualScripting/Nodes/NodeTStorageTViewModel.cs
index 2b84a619e..79e858644 100644
--- a/src/Artemis.Core/VisualScripting/Nodes/NodeTStorageTViewModel.cs
+++ b/src/Artemis.Core/VisualScripting/Nodes/NodeTStorageTViewModel.cs
@@ -25,6 +25,8 @@ public abstract class Node : Node, ICustomViewMo
///
public virtual TViewModel GetViewModel(NodeScript nodeScript)
{
+ if (NodeData == null)
+ throw new ArtemisCoreException("Nodes without node data (default nodes or exit nodes) cannot have custom view models");
return NodeData.Provider.Plugin.Container.Resolve(args: new object[] {this, nodeScript});
}
diff --git a/src/Artemis.UI/Screens/VisualScripting/NodeViewModel.cs b/src/Artemis.UI/Screens/VisualScripting/NodeViewModel.cs
index db39dd1f2..f1ff6dbb3 100644
--- a/src/Artemis.UI/Screens/VisualScripting/NodeViewModel.cs
+++ b/src/Artemis.UI/Screens/VisualScripting/NodeViewModel.cs
@@ -141,41 +141,9 @@ public partial class NodeViewModel : ActivatableViewModelBase
// Set up the custom node VM if needed
SetupCustomNodeViewModel();
-
});
}
- private void SetupCustomNodeViewModel()
- {
- if (Node is not ICustomViewModelNode customViewModelNode)
- return;
-
- try
- {
- CustomNodeViewModel = customViewModelNode.GetCustomViewModel(NodeScriptViewModel.NodeScript);
- }
- catch (Exception e)
- {
- _logger.Error(e, "Failed to instantiate custom node view model");
- }
-
- if (customViewModelNode.ViewModelPosition == CustomNodeViewModelPosition.AbovePins)
- DisplayCustomViewModelAbove = true;
- else if (customViewModelNode.ViewModelPosition == CustomNodeViewModelPosition.BelowPins)
- DisplayCustomViewModelBelow = true;
- else
- {
- DisplayCustomViewModelBetween = true;
-
- if (customViewModelNode.ViewModelPosition == CustomNodeViewModelPosition.BetweenPinsTop)
- CustomViewModelVerticalAlignment = VerticalAlignment.Top;
- else if (customViewModelNode.ViewModelPosition == CustomNodeViewModelPosition.BetweenPinsTop)
- CustomViewModelVerticalAlignment = VerticalAlignment.Center;
- else
- CustomViewModelVerticalAlignment = VerticalAlignment.Bottom;
- }
- }
-
public bool IsStaticNode => _isStaticNode?.Value ?? true;
public bool HasInputPins => _hasInputPins?.Value ?? false;
public bool HasOutputPins => _hasOutputPins?.Value ?? false;
@@ -226,4 +194,35 @@ public partial class NodeViewModel : ActivatableViewModelBase
if (Node.BrokenState != null && Node.BrokenStateException != null)
_windowService.ShowExceptionDialog(Node.BrokenState, Node.BrokenStateException);
}
+
+ private void SetupCustomNodeViewModel()
+ {
+ if (Node is not ICustomViewModelNode customViewModelNode)
+ return;
+
+ try
+ {
+ CustomNodeViewModel = customViewModelNode.GetCustomViewModel(NodeScriptViewModel.NodeScript);
+ }
+ catch (Exception e)
+ {
+ _logger.Error(e, "Failed to instantiate custom node view model");
+ }
+
+ if (customViewModelNode.ViewModelPosition == CustomNodeViewModelPosition.AbovePins)
+ DisplayCustomViewModelAbove = true;
+ else if (customViewModelNode.ViewModelPosition == CustomNodeViewModelPosition.BelowPins)
+ DisplayCustomViewModelBelow = true;
+ else
+ {
+ DisplayCustomViewModelBetween = true;
+
+ if (customViewModelNode.ViewModelPosition == CustomNodeViewModelPosition.BetweenPinsTop)
+ CustomViewModelVerticalAlignment = VerticalAlignment.Top;
+ else if (customViewModelNode.ViewModelPosition == CustomNodeViewModelPosition.BetweenPinsTop)
+ CustomViewModelVerticalAlignment = VerticalAlignment.Center;
+ else
+ CustomViewModelVerticalAlignment = VerticalAlignment.Bottom;
+ }
+ }
}
\ No newline at end of file