diff --git a/src/Artemis.Core/Services/NodeService.cs b/src/Artemis.Core/Services/NodeService.cs index 82cf2d4f7..5af2a659a 100644 --- a/src/Artemis.Core/Services/NodeService.cs +++ b/src/Artemis.Core/Services/NodeService.cs @@ -83,10 +83,7 @@ namespace Artemis.Core.Services // ignored } } - - if (node is CustomViewModelNode customViewModelNode) - customViewModelNode.BaseCustomViewModel = _kernel.Get(customViewModelNode.CustomViewModelType, new ConstructorArgument("node", node)); - + node.Initialize(script); return node; } diff --git a/src/Artemis.Core/VisualScripting/Node.cs b/src/Artemis.Core/VisualScripting/Node.cs index ac6b4da8a..4d1acc1eb 100644 --- a/src/Artemis.Core/VisualScripting/Node.cs +++ b/src/Artemis.Core/VisualScripting/Node.cs @@ -1,6 +1,8 @@ -using System; +using Ninject; +using System; using System.Collections.Generic; using System.Collections.ObjectModel; +using Ninject.Parameters; namespace Artemis.Core { @@ -149,14 +151,24 @@ namespace Artemis.Core public abstract class Node : CustomViewModelNode where T : ICustomNodeViewModel { + [Inject] + internal IKernel Kernel { get; set; } = null!; + protected Node() { } protected Node(string name, string description) : base(name, description) { } - public override Type CustomViewModelType => typeof(T); - public T CustomViewModel => (T) BaseCustomViewModel!; + public virtual T GetViewModel() + { + return Kernel.Get(new ConstructorArgument("node", this)); + } + + public override ICustomNodeViewModel GetCustomViewModel() + { + return GetViewModel(); + } } public abstract class CustomViewModelNode : Node @@ -169,7 +181,6 @@ namespace Artemis.Core protected CustomViewModelNode(string name, string description) : base(name, description) { } - public abstract Type CustomViewModelType { get; } - public object? BaseCustomViewModel { get; set; } + public abstract ICustomNodeViewModel GetCustomViewModel(); } } \ No newline at end of file diff --git a/src/Artemis.VisualScripting/Editor/Controls/VisualScriptNodePresenter.cs b/src/Artemis.VisualScripting/Editor/Controls/VisualScriptNodePresenter.cs index e79a195de..cc88904df 100644 --- a/src/Artemis.VisualScripting/Editor/Controls/VisualScriptNodePresenter.cs +++ b/src/Artemis.VisualScripting/Editor/Controls/VisualScriptNodePresenter.cs @@ -3,6 +3,7 @@ using System.Windows; using System.Windows.Controls; using System.Windows.Input; using System.Windows.Media; +using Artemis.Core; using Artemis.VisualScripting.Editor.Controls.Wrapper; namespace Artemis.VisualScripting.Editor.Controls @@ -21,20 +22,29 @@ namespace Artemis.VisualScripting.Editor.Controls #region Dependency Properties public static readonly DependencyProperty NodeProperty = DependencyProperty.Register( - "Node", typeof(VisualScriptNode), typeof(VisualScriptNodePresenter), new PropertyMetadata(default(VisualScriptNode))); + "Node", typeof(VisualScriptNode), typeof(VisualScriptNodePresenter), new PropertyMetadata(default(VisualScriptNode), NodePropertyChangedCallback)); public VisualScriptNode Node { - get => (VisualScriptNode)GetValue(NodeProperty); + get => (VisualScriptNode) GetValue(NodeProperty); set => SetValue(NodeProperty, value); } + public static readonly DependencyProperty CustomViewModelProperty = DependencyProperty.Register( + "CustomViewModel", typeof(ICustomNodeViewModel), typeof(VisualScriptNodePresenter), new PropertyMetadata(null)); + + public ICustomNodeViewModel CustomViewModel + { + get => (ICustomNodeViewModel) GetValue(CustomViewModelProperty); + set => SetValue(CustomViewModelProperty, value); + } + public static readonly DependencyProperty TitleBrushProperty = DependencyProperty.Register( "TitleBrush", typeof(Brush), typeof(VisualScriptNodePresenter), new PropertyMetadata(default(Brush))); public Brush TitleBrush { - get => (Brush)GetValue(TitleBrushProperty); + get => (Brush) GetValue(TitleBrushProperty); set => SetValue(TitleBrushProperty, value); } @@ -56,8 +66,8 @@ namespace Artemis.VisualScripting.Editor.Controls } Size neededSize = base.MeasureOverride(constraint); - int width = (int)Math.Ceiling(neededSize.Width); - int height = (int)Math.Ceiling(neededSize.Height); + int width = (int) Math.Ceiling(neededSize.Width); + int height = (int) Math.Ceiling(neededSize.Height); return new Size(SnapToGridSize(width), SnapToGridSize(height)); } @@ -132,6 +142,20 @@ namespace Artemis.VisualScripting.Editor.Controls args.Handled = true; } + private void GetCustomViewModel() + { + if (Node?.Node is CustomViewModelNode customViewModelNode) + CustomViewModel = customViewModelNode.GetCustomViewModel(); + else + CustomViewModel = null; + } + + private static void NodePropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + if (d is VisualScriptNodePresenter presenter) + presenter.GetCustomViewModel(); + } + #endregion } -} +} \ No newline at end of file diff --git a/src/Artemis.VisualScripting/Editor/Styles/VisualScriptNodePresenter.xaml b/src/Artemis.VisualScripting/Editor/Styles/VisualScriptNodePresenter.xaml index c124dec3b..26d6ec27b 100644 --- a/src/Artemis.VisualScripting/Editor/Styles/VisualScriptNodePresenter.xaml +++ b/src/Artemis.VisualScripting/Editor/Styles/VisualScriptNodePresenter.xaml @@ -208,17 +208,7 @@ - - - - - - - - - - - +