1.finally an inspector can inspect nodes

main
taoria 3 years ago
parent 03193fc2f6
commit 9544ad81b6
  1. 4
      Sample/Editor/HelloGraphView.cs
  2. 39
      TNode/Editor/BaseViews/DataGraphView.cs
  3. 4
      TNode/Editor/BaseViews/SimpleGraphSubWindow.cs
  4. 4
      TNode/Editor/Cache/NodeEditorExtensions.cs
  5. 10
      TNode/Editor/Inspector/NodeInspector.cs
  6. 12
      TNode/Editor/SearchWindowProvider.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<HelloGraph>{
public override void OnGraphViewCreate(){
NodeInspector inspector = new NodeInspector();
this.Add(inspector);
CreateInspector();
}
}
}

@ -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<T>:GraphView where T:GraphData{
public abstract class DataGraphView<T>:GraphView,IDataGraphView where T:GraphData{
private T _data;
private SearchWindowProvider _searchWindowProvider;
private bool _isInspectorOn;
private NodeInspector _nodeInspector;
public T Data{
get{ return _data; }
set{
@ -173,6 +176,14 @@ namespace TNode.Editor.BaseViews{
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<Port> 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<MouseDownEvent>(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<T>{

@ -7,7 +7,7 @@ namespace TNode.BaseViews{
private readonly Dragger _dragger = new Dragger();
protected void ConstructWindowBasicSetting(){
style.position = new StyleEnum<Position>(Position.Absolute);
RegisterCallback<WheelEvent>(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>(Position.Absolute);
ConstructWindowBasicSetting();
if (defaultUxml != null){
var uxml = AssetDatabase.LoadAssetAtPath<VisualTreeAsset>(defaultUxml);
@ -27,6 +28,7 @@ namespace TNode.BaseViews{
}
}
public SimpleGraphSubWindow(VisualTreeAsset visualTreeAsset){
style.position = new StyleEnum<Position>(Position.Absolute);
ConstructWindowBasicSetting();
BuildWindow(visualTreeAsset);
}

@ -89,8 +89,8 @@ namespace TNode.Cache{
return instance;
}
public static bool HasSpecificType<T>() 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<Type> GetGraphDataUsage(Type t){
if (NodeEditorSingleton.Instance.GraphDataUsage.ContainsKey(t)){

@ -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>(Position.Absolute);
var visualTreeAsset = Resources.Load<VisualTreeAsset>("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;

@ -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;

Loading…
Cancel
Save