diff --git a/NodeEditor/View/NodeTreeWindow.cs b/NodeEditor/View/NodeTreeWindow.cs index ee95b784..c02237d5 100644 --- a/NodeEditor/View/NodeTreeWindow.cs +++ b/NodeEditor/View/NodeTreeWindow.cs @@ -1,4 +1,6 @@ using System; +using System.Reflection; +using System.Text; using System.Collections.Generic; using Altseed2.NodeEditor.ViewModel; @@ -10,6 +12,8 @@ internal class NodeTreeWindow private readonly NodeTreeViewModel _viewModel; private readonly NodeEditorPane _pane = new NodeEditorPane("Node"); + private List _userDefinedNodes = new(); + public NodeTreeWindow(IEditorPropertyAccessor accessor, NodeTreeViewModel viewModel) { _accessor = accessor; @@ -28,11 +32,54 @@ public void Render() RenderButton("Rectangle", _viewModel.CreateRectangleNode); RenderButton("Triangle", _viewModel.CreateTriangleNode); + RenderUserDefinedNodeCreateButtons(_userDefinedNodes); + + RenderButton("+", OpenDLL); RenderNodeTree(Engine.GetNodes()); }); } - private void RenderButton(string label, Action action, bool onNewLine = false) + private void OpenDLL() + { + if (Engine.Tool.OpenDialog("dll", "") is { } path) + { + _userDefinedNodes = LoadDLL(path); + } + } + + public List LoadDLL(string path) + { + List nodes = new(); + + var asm = Assembly.LoadFrom(path); + var typeinfo = asm.GetTypes(); + + foreach (var type in typeinfo) + { + if (type.IsSubclassOf(typeof(Node))) + { + nodes.Add(type); + } + } + + return nodes; + } + + private void RenderUserDefinedNodeCreateButtons(List types) + { + foreach (var type in types) + { + RenderButton(type.Name, () => { CreateUserDefinedNode(type); }); + } + } + + private void CreateUserDefinedNode(Type type) + { + dynamic node = Activator.CreateInstance(type); + Engine.AddNode(node); + } + + private void RenderButton(string label, Action action, bool onNewLine = true) { if (!onNewLine) { diff --git a/NodeEditor/ViewModel/NodeTreeViewModel.cs b/NodeEditor/ViewModel/NodeTreeViewModel.cs index af9d249a..df1cdcfc 100644 --- a/NodeEditor/ViewModel/NodeTreeViewModel.cs +++ b/NodeEditor/ViewModel/NodeTreeViewModel.cs @@ -32,6 +32,7 @@ public void CreateTriangleNode() => Engine.AddNode(new TriangleNode Point2 = new Vector2F(50, 50), Point3 = new Vector2F(100, 0) }); + public ToolTreeNodeFlags GetNodeStatus(Node node) { var flags = ToolTreeNodeFlags.OpenOnArrow;