diff --git a/Sample/Editor/HelloGraphView.cs b/Sample/Editor/HelloGraphView.cs index 9d2de3e..7bb5ef4 100644 --- a/Sample/Editor/HelloGraphView.cs +++ b/Sample/Editor/HelloGraphView.cs @@ -1,13 +1,13 @@ using TNode.Attribute; using TNode.Editor.BaseViews; using TNode.Editor.Inspector; +using UnityEngine; namespace Sample.Editor{ [NodeComponent] public class HelloGraphView : DataGraphView{ public override void OnGraphViewCreate(){ - NodeInspector inspector = new NodeInspector(); - this.Add(inspector); + CreateInspector(); } } } \ No newline at end of file diff --git a/TNode/Editor/BaseViews/DataGraphView.cs b/TNode/Editor/BaseViews/DataGraphView.cs index b0e3493..4ff7ffa 100644 --- a/TNode/Editor/BaseViews/DataGraphView.cs +++ b/TNode/Editor/BaseViews/DataGraphView.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using TNode.BaseViews; using TNode.Cache; +using TNode.Editor.Inspector; using TNode.Models; using UnityEditor; using UnityEditor.Experimental.GraphView; @@ -102,9 +103,11 @@ namespace TNode.Editor.BaseViews{ } } */ - public abstract class DataGraphView:GraphView where T:GraphData{ + public abstract class DataGraphView:GraphView,IDataGraphView where T:GraphData{ private T _data; private SearchWindowProvider _searchWindowProvider; + private bool _isInspectorOn; + private NodeInspector _nodeInspector; public T Data{ get{ return _data; } set{ @@ -172,8 +175,16 @@ namespace TNode.Editor.BaseViews{ ConstructDefaultBehaviour(); OnGraphViewCreate(); } - - + + public virtual void CreateInspector(){ + NodeInspector nodeInspector = new NodeInspector(); + nodeInspector.SetPosition(new Rect(200,200,200,600)); + this.Add(nodeInspector); + _nodeInspector = nodeInspector; + _isInspectorOn = true; + } + + public virtual void OnGraphViewCreate(){ @@ -184,14 +195,28 @@ namespace TNode.Editor.BaseViews{ ~DataGraphView(){ OnGraphViewDestroy(); } - //rewrite function of the derived class in the comment on the top of this script file in this class - // public abstract override List GetCompatiblePorts(Port startPort, NodeAdapter nodeAdapter); - // - // public void AddNode(NodeData nodeData){ - // - // } - - + + public void AddTNode(NodeData nodeData, Rect rect){ + if (NodeEditorExtensions.CreateNodeViewFromNodeType(nodeData.GetType()) is GraphElement nodeView){ + nodeView.SetPosition(rect); + AddElement(nodeView); + //Add a select callback to the nodeView + nodeView.RegisterCallback(evt => { + Debug.Log("NodeView Selected"); + if (evt.clickCount == 1){ + if (_isInspectorOn){ + _nodeInspector.Data = nodeData; + } + } + }); + + } + } + + } + + public interface IDataGraphView{ + public void AddTNode(NodeData nodeData, Rect rect); } public class DataChangedEventArgs{ diff --git a/TNode/Editor/BaseViews/SimpleGraphSubWindow.cs b/TNode/Editor/BaseViews/SimpleGraphSubWindow.cs index 26be881..4376929 100644 --- a/TNode/Editor/BaseViews/SimpleGraphSubWindow.cs +++ b/TNode/Editor/BaseViews/SimpleGraphSubWindow.cs @@ -7,7 +7,7 @@ namespace TNode.BaseViews{ private readonly Dragger _dragger = new Dragger(); protected void ConstructWindowBasicSetting(){ - style.position = new StyleEnum(Position.Absolute); + RegisterCallback(evt => { evt.StopPropagation(); }); focusable = false; capabilities |= Capabilities.Movable | Capabilities.Resizable; @@ -20,6 +20,7 @@ namespace TNode.BaseViews{ } public SimpleGraphSubWindow(string defaultUxml=null){ + style.position = new StyleEnum(Position.Absolute); ConstructWindowBasicSetting(); if (defaultUxml != null){ var uxml = AssetDatabase.LoadAssetAtPath(defaultUxml); @@ -27,6 +28,7 @@ namespace TNode.BaseViews{ } } public SimpleGraphSubWindow(VisualTreeAsset visualTreeAsset){ + style.position = new StyleEnum(Position.Absolute); ConstructWindowBasicSetting(); BuildWindow(visualTreeAsset); } diff --git a/TNode/Editor/Cache/NodeEditorExtensions.cs b/TNode/Editor/Cache/NodeEditorExtensions.cs index 22909e1..9df7c55 100644 --- a/TNode/Editor/Cache/NodeEditorExtensions.cs +++ b/TNode/Editor/Cache/NodeEditorExtensions.cs @@ -89,8 +89,8 @@ namespace TNode.Cache{ return instance; } public static bool HasSpecificType() where T : class{ - var implementedType = NodeEditorSingleton.Instance.FromGenericToSpecific[typeof(T)] as T; - return (T)implementedType!=null; + + return NodeEditorSingleton.Instance.FromGenericToSpecific.ContainsKey(typeof(T)); } public static List GetGraphDataUsage(Type t){ if (NodeEditorSingleton.Instance.GraphDataUsage.ContainsKey(t)){ diff --git a/TNode/Editor/Inspector/NodeInspector.cs b/TNode/Editor/Inspector/NodeInspector.cs index 48accc7..902d761 100644 --- a/TNode/Editor/Inspector/NodeInspector.cs +++ b/TNode/Editor/Inspector/NodeInspector.cs @@ -13,17 +13,19 @@ namespace TNode.Editor.Inspector{ set{ _data = value; UpdateData(); + } } private void UpdateData(){ + Debug.Log(_data); if (_data != null){ RefreshInspector(); } } public NodeInspector(){ + style.position = new StyleEnum(Position.Absolute); var visualTreeAsset = Resources.Load("NodeInspector"); - Debug.Log(visualTreeAsset); ConstructWindowBasicSetting(); BuildWindow(visualTreeAsset); @@ -31,8 +33,10 @@ namespace TNode.Editor.Inspector{ private void RefreshInspector(){ //iterate field of data and get name of every fields,create a new inspector item of appropriate type and add it to the inspector for each field - foreach (var field in GetType().GetFields(BindingFlags.Instance | BindingFlags.Public)){ + this.Q("InspectorBody").Clear(); + foreach (var field in _data.GetType().GetFields(BindingFlags.Instance | BindingFlags.Public)){ var bindingPath = field.Name; + var type = field.FieldType; DefaultInspectorItemFactory defaultInspectorItemFactory = new DefaultInspectorItemFactory(); //Invoke generic function Create<> of default inspector item factory to create an inspector item of appropriate type by reflection @@ -40,7 +44,7 @@ namespace TNode.Editor.Inspector{ if (methodInfo != null){ var genericMethod = methodInfo.MakeGenericMethod(type); var createdInspector = genericMethod.Invoke(defaultInspectorItemFactory,null) as VisualElement; - Add(createdInspector); + this.Q("InspectorBody").Add(createdInspector); if (createdInspector is INodeDataBindingBase castedInspector){ castedInspector.BindingNodeData = _data; castedInspector.BindingPath = bindingPath; diff --git a/TNode/Editor/SearchWindowProvider.cs b/TNode/Editor/SearchWindowProvider.cs index 61cd6a5..8278c97 100644 --- a/TNode/Editor/SearchWindowProvider.cs +++ b/TNode/Editor/SearchWindowProvider.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Drawing; using TNode.BaseViews; using TNode.Cache; +using TNode.Editor.BaseViews; using TNode.Models; using UnityEditor; using UnityEditor.Experimental.GraphView; @@ -43,11 +44,14 @@ namespace TNode.Editor{ var relativePos = context.screenMousePosition - _editor.position.position; var localPos = _graphView.WorldToLocal(relativePos); if (userData is Type type){ - if (NodeEditorExtensions.CreateNodeViewFromNodeType(type) is GraphElement nodeView){ - nodeView.SetPosition( - new Rect(localPos.x, localPos.y, nodeView.layout.width, nodeView.layout.height)); - _graphView.AddElement(nodeView); + //Check if type is derived from NodeData + if (typeof(NodeData).IsAssignableFrom(type)){ + //Make an instance of the type + var nodeData = (NodeData) Activator.CreateInstance(type); + nodeData.nodeName = "New Node"; + ((IDataGraphView)_graphView).AddTNode(nodeData,new Rect(localPos.x,localPos.y,100,100)); } + return true; } return false;