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