diff --git a/TNode/Editor/BaseViews/DataGraphView.cs b/TNode/Editor/BaseViews/DataGraphView.cs index dac2122..b66b150 100644 --- a/TNode/Editor/BaseViews/DataGraphView.cs +++ b/TNode/Editor/BaseViews/DataGraphView.cs @@ -112,20 +112,13 @@ namespace TNode.Editor.BaseViews{ */ public abstract class DataGraphView:GraphView,IDataGraphView where T:GraphData{ #region variables and properties - - - - private T _data; private bool _isInspectorOn; - private NodeSearchWindowProvider _nodeSearchWindowProvider; private NodeInspector _nodeInspector; public GraphEditor Owner; private Dictionary _nodeDict = new(); private Blackboard _blackboard; - - public T Data{ get{ return _data; } set{ @@ -469,11 +462,17 @@ namespace TNode.Editor.BaseViews{ } Owner.graphEditorData.graphElementsData.RemoveAll(x => x.guid == nodeData.id); } + + public BlackboardData GetBlackboardData(){ + return this._data.blackboardData; + } } public interface IDataGraphView{ public void AddTNode(NodeData nodeData, Rect rect); public void RemoveTNode(NodeData nodeData); + + public BlackboardData GetBlackboardData(); } public class DataChangedEventArgs{ diff --git a/TNode/Editor/Inspector/InspectorImplementation/PropertyFieldItem.cs b/TNode/Editor/Inspector/InspectorImplementation/PropertyFieldItem.cs new file mode 100644 index 0000000..05fa288 --- /dev/null +++ b/TNode/Editor/Inspector/InspectorImplementation/PropertyFieldItem.cs @@ -0,0 +1,23 @@ +using UnityEditor; +using UnityEditor.UIElements; +using UnityEngine; +using UnityEngine.UIElements; + +namespace TNode.Editor.Inspector.InspectorImplementation{ + public class PropertyFieldItem:InspectorItem{ + + public PropertyFieldItem(){ + + + OnDataChanged += () => { + var data = new SerializedObject(Value as Object); + var testProperty = data.GetIterator().GetArrayElementAtIndex(0); + PropertyField propertyField = new PropertyField(testProperty); + this.Q()?.RemoveFromHierarchy(); + this.Add(propertyField); + + }; + } + + } +} \ No newline at end of file diff --git a/TNode/Editor/Inspector/InspectorImplementation/PropertyFieldItem.cs.meta b/TNode/Editor/Inspector/InspectorImplementation/PropertyFieldItem.cs.meta new file mode 100644 index 0000000..bced887 --- /dev/null +++ b/TNode/Editor/Inspector/InspectorImplementation/PropertyFieldItem.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 98769c8b285d438197820fa366568fee +timeCreated: 1657280625 \ No newline at end of file diff --git a/TNode/Editor/Inspector/NodeInspector.cs b/TNode/Editor/Inspector/NodeInspector.cs index e4d2ad4..1d2c516 100644 --- a/TNode/Editor/Inspector/NodeInspector.cs +++ b/TNode/Editor/Inspector/NodeInspector.cs @@ -51,21 +51,12 @@ namespace TNode.Editor.Inspector{ var type = field.FieldType; InspectorItemFactory inspectorItemFactory = new InspectorItemFactory(); //Invoke generic function Create<> of default inspector item factory to create an inspector item of appropriate type by reflection - MethodInfo methodInfo = inspectorItemFactory.GetType().GetMethod("Create", BindingFlags.Instance | BindingFlags.Public); - if (methodInfo != null){ - var genericMethod = methodInfo.MakeGenericMethod(type); - var createdItem = genericMethod.Invoke(inspectorItemFactory,null) as VisualElement; - body.Add(createdItem); - if (createdItem is INodeDataBindingBase castedItem){ - castedItem.BindingNodeData = _data; - castedItem.BindingPath = bindingPath; - } - - //Check if field has DisableOnInspector attribute and if so,disable it - if (field.GetCustomAttribute() != null){ - createdItem?.SetEnabled(false); - } + var createdItem = inspectorItemFactory.Create(type); + if (createdItem is { } castedItem){ + castedItem.BindingNodeData = _data; + castedItem.BindingPath = bindingPath; } + Add((VisualElement)createdItem); } } } diff --git a/TNode/Editor/Inspector/NodeInspectorInNode.cs b/TNode/Editor/Inspector/NodeInspectorInNode.cs index e89603e..9a7c53c 100644 --- a/TNode/Editor/Inspector/NodeInspectorInNode.cs +++ b/TNode/Editor/Inspector/NodeInspectorInNode.cs @@ -32,22 +32,13 @@ namespace TNode.Editor.Inspector{ var showInNodeViewAttribute = field.GetCustomAttribute()!=null; if(!showInNodeViewAttribute) continue; - //Invoke generic function Create<> of default inspector item factory to create an inspector item of appropriate type by reflection var createdItem = inspectorItemFactory.Create(type); if (createdItem is { } castedItem){ castedItem.BindingNodeData = _data; castedItem.BindingPath = bindingPath; } Add((VisualElement)createdItem); - // MethodInfo methodInfo = inspectorItemFactory.GetType().GetMethod("Create", BindingFlags.Instance | BindingFlags.Public); - // if (methodInfo != null){ - // var genericMethod = methodInfo.MakeGenericMethod(type); - // Debug.Log(genericMethod); - // var createdItem = genericMethod.Invoke(inspectorItemFactory,null) as VisualElement; - // Add(createdItem); - // Debug.Log(createdItem?.GetType()); - // - // } + } } } diff --git a/TNode/Editor/Search/BlackboardSearchWindowProvider.cs b/TNode/Editor/Search/BlackboardSearchWindowProvider.cs index e0f5ed4..acfbc82 100644 --- a/TNode/Editor/Search/BlackboardSearchWindowProvider.cs +++ b/TNode/Editor/Search/BlackboardSearchWindowProvider.cs @@ -1,15 +1,69 @@ -using System.Collections.Generic; +using System; +using System.Collections; +using System.Collections.Generic; +using TNode.Editor.BaseViews; +using UnityEditor; using UnityEditor.Experimental.GraphView; +using UnityEngine; namespace TNode.Editor{ public class BlackboardSearchWindowProvider:ISearchWindowProvider{ - + private Type _graphType; + private IDataGraphView _graphView; + private EditorWindow _editor; + + private struct InternalSearchTreeUserData{ + public IList List; + public Type Type; + + } public List CreateSearchTree(SearchWindowContext context){ - throw new System.NotImplementedException(); + var blackboardData = _graphView.GetBlackboardData(); + var type = blackboardData.GetType(); + var entries = new List(); + if (entries == null) throw new ArgumentNullException(nameof(entries)); + //search fields with List type + Texture2D icon = new Texture2D(2,2); + foreach (var field in type.GetFields()){ + if (field.FieldType.IsGenericType){ + var genericType = field.FieldType.GetGenericTypeDefinition(); + if (genericType == typeof(List<>)){ + entries.Add(new SearchTreeEntry(new GUIContent(field.Name,icon)){ + level = 1, + userData = new InternalSearchTreeUserData(){ + List = field.GetValue(blackboardData) as IList, + Type = field.FieldType.GetGenericArguments()[0] + } + + }); + } + } + } + + return entries; + } public bool OnSelectEntry(SearchTreeEntry SearchTreeEntry, SearchWindowContext context){ - throw new System.NotImplementedException(); + var userData = SearchTreeEntry.userData; + var relativePos = context.screenMousePosition - _editor.position.position; + var blackboardData = _graphView.GetBlackboardData(); + + if (userData is InternalSearchTreeUserData){ + var list = ((InternalSearchTreeUserData) userData).List; + var type = ((InternalSearchTreeUserData) userData).Type; + var newItem = Activator.CreateInstance(type); + list.Add(newItem); + return true; + } + + return false; + } + + public void Setup(Type graph,IDataGraphView graphView,EditorWindow editor){ + _graphType = graph; + _graphView = graphView; + _editor = editor; } }