From eb12765338ca7890eb20be74a0e22b0436089bdd Mon Sep 17 00:00:00 2001 From: taoria <445625470@qq.com> Date: Tue, 12 Jul 2022 12:03:24 +0800 Subject: [PATCH] feat: search window now applied correctly --- Sample/MathGraph/Editor/MathGraphView.cs | 2 +- ...Attribute.cs => ViewComponentAttribute.cs} | 2 +- ...cs.meta => ViewComponentAttribute.cs.meta} | 0 TNode/Editor/BaseViews/DataGraphView.cs | 41 +++++++----- TNode/Editor/Cache/NodeEditorExtensions.cs | 63 +++++++++++++------ .../DefaultGraphBlackboardView.cs | 17 +++++ .../DefaultGraphBlackboardView.cs.meta | 3 + ...phBlackboard.cs => GraphBlackboardView.cs} | 7 ++- ...rd.cs.meta => GraphBlackboardView.cs.meta} | 0 TNode/Editor/GraphEditor.cs | 2 +- .../InspectorImplementation/EnumFieldItem.cs | 2 +- .../InspectorImplementation/FloatFieldItem.cs | 2 +- .../StringFieldItem.cs | 2 +- .../ToggleFieldItem.cs | 2 +- .../Editor/Inspector/InspectorItemFactory.cs | 8 +-- TNode/Editor/NodeViews/DragNodeView.cs | 2 +- .../Search/BlackboardSearchWindowProvider.cs | 24 +++---- .../Editor/Search/NodeSearchWindowProvider.cs | 4 +- 18 files changed, 119 insertions(+), 64 deletions(-) rename TNode/Attribute/{NodeComponentAttribute.cs => ViewComponentAttribute.cs} (83%) rename TNode/Attribute/{NodeComponentAttribute.cs.meta => ViewComponentAttribute.cs.meta} (100%) create mode 100644 TNode/Editor/GraphBlackboard/DefaultGraphBlackboardView.cs create mode 100644 TNode/Editor/GraphBlackboard/DefaultGraphBlackboardView.cs.meta rename TNode/Editor/GraphBlackboard/{GraphBlackboard.cs => GraphBlackboardView.cs} (63%) rename TNode/Editor/GraphBlackboard/{GraphBlackboard.cs.meta => GraphBlackboardView.cs.meta} (100%) diff --git a/Sample/MathGraph/Editor/MathGraphView.cs b/Sample/MathGraph/Editor/MathGraphView.cs index 730dfab..8fc1a08 100644 --- a/Sample/MathGraph/Editor/MathGraphView.cs +++ b/Sample/MathGraph/Editor/MathGraphView.cs @@ -1,7 +1,7 @@ using TNode.Models; using TNode.Attribute; using TNode.Editor.BaseViews; -[NodeComponent] +[ViewComponent] public class MathGraphView : DataGraphView{ diff --git a/TNode/Attribute/NodeComponentAttribute.cs b/TNode/Attribute/ViewComponentAttribute.cs similarity index 83% rename from TNode/Attribute/NodeComponentAttribute.cs rename to TNode/Attribute/ViewComponentAttribute.cs index 2a3c660..6399726 100644 --- a/TNode/Attribute/NodeComponentAttribute.cs +++ b/TNode/Attribute/ViewComponentAttribute.cs @@ -11,7 +11,7 @@ namespace TNode.Attribute{ [AttributeUsage(AttributeTargets.Class, AllowMultiple = false)] [MeansImplicitUse] - public class NodeComponentAttribute:System.Attribute{ + public class ViewComponentAttribute:System.Attribute{ public Type GenericType{ get; set; } diff --git a/TNode/Attribute/NodeComponentAttribute.cs.meta b/TNode/Attribute/ViewComponentAttribute.cs.meta similarity index 100% rename from TNode/Attribute/NodeComponentAttribute.cs.meta rename to TNode/Attribute/ViewComponentAttribute.cs.meta diff --git a/TNode/Editor/BaseViews/DataGraphView.cs b/TNode/Editor/BaseViews/DataGraphView.cs index b66b150..ff2decd 100644 --- a/TNode/Editor/BaseViews/DataGraphView.cs +++ b/TNode/Editor/BaseViews/DataGraphView.cs @@ -1,4 +1,5 @@ using System; +using System.Collections; using System.Collections.Generic; using System.Linq; using System.Reflection; @@ -7,6 +8,7 @@ using TNode.Cache; using TNode.Editor.GraphBlackboard; using TNode.Editor.Inspector; using TNode.Editor.Model; +using TNode.Editor.Search; using TNode.Editor.Tools.NodeCreator; using TNode.Models; using Unity.VisualScripting; @@ -281,20 +283,11 @@ namespace TNode.Editor.BaseViews{ } public virtual void CreateBlackboard(){ - _blackboard = new Blackboard(); - //Blackboard add "Add Node" button - // blackboard.Add(new BlackboardSection(){ - // title = "Hello World", - // }); - // blackboard.addItemRequested = (item) => { - // //Create a sub window for the blackboard to show the selection - // var subWindow = ScriptableObject.CreateNodeComponentFromGenericType(); - // }; - // - //Set black board to left side of the view + + _blackboard = NodeEditorExtensions.CreateBlackboardWithGraphData(typeof(T)); + _blackboard.SetPosition(new Rect(0,0,200,600)); Add(_blackboard); - //Check the type of the blackboard OnDataChanged+= (sender, e) => { BlackboardUpdate(); }; @@ -306,14 +299,30 @@ namespace TNode.Editor.BaseViews{ if (_data.blackboardData == null) return; } - + //Iterate field of the blackboard and add a button for each field foreach (var field in _data.blackboardData.GetType() .GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)){ - //if the field is MonoBehaviour,add a property field for blackboard - var propertyField = new BlackboardPropertyField(new BlackboardProperty(field.Name,field.FieldType)); - _blackboard.Add(propertyField); + //if the field is MonoBehaviour,add a property field for blackboard + //skip if the field is a list or Ilist + if (!typeof(IList).IsAssignableFrom(field.FieldType)){ + var propertyField = new BlackboardPropertyField(new BlackboardProperty(field.Name,field.FieldType)); + _blackboard.Add(propertyField); + } + } + _blackboard.addItemRequested = (sender) => { + var res = ScriptableObject.CreateInstance(); + + //Get right top corner of the blackboard + var blackboardPos = _blackboard.GetPosition().position; + var searchWindowContext = new SearchWindowContext(blackboardPos,200,200); + //Call search window + res.Setup(typeof(T),this,Owner); + + SearchWindow.Open(searchWindowContext, res); + }; + } public virtual void DestroyInspector(){ diff --git a/TNode/Editor/Cache/NodeEditorExtensions.cs b/TNode/Editor/Cache/NodeEditorExtensions.cs index 2ad617a..f02c267 100644 --- a/TNode/Editor/Cache/NodeEditorExtensions.cs +++ b/TNode/Editor/Cache/NodeEditorExtensions.cs @@ -5,6 +5,7 @@ using TNode.Attribute; using TNode.BaseViews; using TNode.Editor; using TNode.Editor.BaseViews; +using TNode.Editor.GraphBlackboard; using TNode.Editor.Inspector; using TNode.Models; using UnityEditor.Experimental.GraphView; @@ -58,7 +59,7 @@ namespace TNode.Cache{ foreach(var type in assembly.GetTypes()){ if(type.IsClass && !type.IsAbstract){ //Register Node View And Graph View via its parent class - SetNodeComponentAttribute(type); + SetViewComponentAttribute(type); //Register Node Data by GraphUsageAttribute. SetGraphUsageAttribute(type); } @@ -98,9 +99,10 @@ namespace TNode.Cache{ } } } - private readonly Type[] _acceptedTypesForGenericToSpecific = new Type[]{typeof(NodeView<>),typeof(DataGraphView<>),typeof(InspectorItem<>),typeof(NodeView<>)}; - private void SetNodeComponentAttribute(Type type){ - foreach (var attribute in type.GetCustomAttributes(typeof(NodeComponentAttribute), false)){ + private readonly Type[] _acceptedTypesForGenericToSpecific = new Type[]{typeof(NodeView<>),typeof(DataGraphView<>),typeof(GraphBlackboardView<>)}; + private readonly Type[] _defaultTypes = new []{typeof(DefaultNodeView),typeof(DefaultGraphBlackboardView)}; + private void SetViewComponentAttribute(Type type){ + foreach (var attribute in type.GetCustomAttributes(typeof(ViewComponentAttribute), false)){ //fetch this type 's parent class var parent = type.BaseType; //Check if this type is a generic type and is a generic type of NodeView or DataGraphView, @@ -121,17 +123,28 @@ namespace TNode.Cache{ } //Outer wrapper for the singleton class public static class NodeEditorExtensions{ - public static T CreateNodeComponentFromGenericType(){ + /// + /// by given a generic type T,return the implementation instance of the generic type + /// + /// + /// + public static T CreateViewComponentFromBaseType(){ var implementedType = NodeEditorSingleton.Instance.FromGenericToSpecific[typeof(T)]; var instance = (T)Activator.CreateInstance(implementedType); return instance; } - public static object CreateNodeComponentFromGenericType(Type t){ + + /// + /// by given a generic type t,return the implementation instance of the generic type + /// + /// + public static object CreateViewComponentFromBaseType(Type t){ if (NodeEditorSingleton.Instance.FromGenericToSpecific.ContainsKey(t)){ var implementedType = NodeEditorSingleton.Instance.FromGenericToSpecific[t]; var instance = Activator.CreateInstance(implementedType); return instance; } + //check if t is a generic type node view if (t is{IsGenericType: true} && t.GetGenericTypeDefinition() == typeof(NodeView<>)){ var instance = Activator.CreateInstance(typeof(NodeView)); @@ -139,6 +152,31 @@ namespace TNode.Cache{ } return null; } + + public static Blackboard CreateBlackboardDataFromBlackboardDataType(Type t){ + var type = typeof(GraphBlackboardView<>).MakeGenericType(t); + var res = CreateViewComponentFromBaseType(type) as Blackboard; + return res ?? new DefaultGraphBlackboardView(); + + } + + public static Blackboard CreateBlackboardWithGraphData(GraphData graphData){ + var graphType = graphData.GetType(); + if (NodeEditorSingleton.Instance.GraphBlackboard.ContainsKey(graphType)){ + var type = NodeEditorSingleton.Instance.GraphBlackboard[graphType]; + return CreateBlackboardDataFromBlackboardDataType(type); + + } + return null; + } + public static Blackboard CreateBlackboardWithGraphData(Type graphType){ + if (NodeEditorSingleton.Instance.GraphBlackboard.ContainsKey(graphType)){ + var type = NodeEditorSingleton.Instance.GraphBlackboard[graphType]; + return CreateBlackboardDataFromBlackboardDataType(type); + + } + return null; + } public static bool HasSpecificTypeComponent() where T : class{ return NodeEditorSingleton.Instance.FromGenericToSpecific.ContainsKey(typeof(T)); @@ -159,19 +197,6 @@ namespace TNode.Cache{ } return null; } - public static object CreateNodeViewFromNodeType() where T:NodeData,new(){ - //Check specific derived type exists or not. - var type = typeof(NodeView); - if (NodeEditorSingleton.Instance.FromGenericToSpecific.ContainsKey(type)){ - var implementedType = NodeEditorSingleton.Instance.FromGenericToSpecific[type]; - var instance = (NodeView)Activator.CreateInstance(implementedType); - return instance; - } - else{ - return new DefaultNodeView(); - } - - } public static object CreateNodeViewFromNodeType(Type t){ //Check the generic type of NodeView by t diff --git a/TNode/Editor/GraphBlackboard/DefaultGraphBlackboardView.cs b/TNode/Editor/GraphBlackboard/DefaultGraphBlackboardView.cs new file mode 100644 index 0000000..26c98c2 --- /dev/null +++ b/TNode/Editor/GraphBlackboard/DefaultGraphBlackboardView.cs @@ -0,0 +1,17 @@ +using TNode.Attribute; +using TNode.Models; + +namespace TNode.Editor.GraphBlackboard{ + [ViewComponent] + public class DefaultGraphBlackboardView:GraphBlackboardView{ + public DefaultGraphBlackboardView(){ + + } + public void ConstructView(){ + + } + public void AddParameter(){ + + } + } +} \ No newline at end of file diff --git a/TNode/Editor/GraphBlackboard/DefaultGraphBlackboardView.cs.meta b/TNode/Editor/GraphBlackboard/DefaultGraphBlackboardView.cs.meta new file mode 100644 index 0000000..3b6d406 --- /dev/null +++ b/TNode/Editor/GraphBlackboard/DefaultGraphBlackboardView.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 98e4de339ad84949ac2c50e61a108a96 +timeCreated: 1657592333 \ No newline at end of file diff --git a/TNode/Editor/GraphBlackboard/GraphBlackboard.cs b/TNode/Editor/GraphBlackboard/GraphBlackboardView.cs similarity index 63% rename from TNode/Editor/GraphBlackboard/GraphBlackboard.cs rename to TNode/Editor/GraphBlackboard/GraphBlackboardView.cs index 40b9e3d..a59ce41 100644 --- a/TNode/Editor/GraphBlackboard/GraphBlackboard.cs +++ b/TNode/Editor/GraphBlackboard/GraphBlackboardView.cs @@ -5,8 +5,11 @@ namespace TNode.Editor.GraphBlackboard{ /// /// Implement this class to create graph black board for specified graph /// - public class GraphBlackboard:Blackboard where T:BlackboardData{ + public class GraphBlackboardView:Blackboard where T:BlackboardData{ public T BlackboardData; - + + public GraphBlackboardView() : base(){ + + } } } \ No newline at end of file diff --git a/TNode/Editor/GraphBlackboard/GraphBlackboard.cs.meta b/TNode/Editor/GraphBlackboard/GraphBlackboardView.cs.meta similarity index 100% rename from TNode/Editor/GraphBlackboard/GraphBlackboard.cs.meta rename to TNode/Editor/GraphBlackboard/GraphBlackboardView.cs.meta diff --git a/TNode/Editor/GraphEditor.cs b/TNode/Editor/GraphEditor.cs index e045f39..7d1b01a 100644 --- a/TNode/Editor/GraphEditor.cs +++ b/TNode/Editor/GraphEditor.cs @@ -36,7 +36,7 @@ namespace TNode.Editor{ } private void BuildGraphView(){ - _graphView = NodeEditorExtensions.CreateNodeComponentFromGenericType>(); + _graphView = NodeEditorExtensions.CreateViewComponentFromBaseType>(); rootVisualElement.Add(_graphView); _graphView.StretchToParentSize(); } diff --git a/TNode/Editor/Inspector/InspectorImplementation/EnumFieldItem.cs b/TNode/Editor/Inspector/InspectorImplementation/EnumFieldItem.cs index 081d9e8..362d8f7 100644 --- a/TNode/Editor/Inspector/InspectorImplementation/EnumFieldItem.cs +++ b/TNode/Editor/Inspector/InspectorImplementation/EnumFieldItem.cs @@ -4,7 +4,7 @@ using UnityEngine; using UnityEngine.UIElements; namespace TNode.Editor.Inspector.InspectorImplementation{ - [NodeComponent] + [ViewComponent] [Obsolete] public class EnumFieldItem:InspectorItem{ public EnumFieldItem() : base(){ diff --git a/TNode/Editor/Inspector/InspectorImplementation/FloatFieldItem.cs b/TNode/Editor/Inspector/InspectorImplementation/FloatFieldItem.cs index b8a06d6..5cbda65 100644 --- a/TNode/Editor/Inspector/InspectorImplementation/FloatFieldItem.cs +++ b/TNode/Editor/Inspector/InspectorImplementation/FloatFieldItem.cs @@ -4,7 +4,7 @@ using UnityEngine.UIElements; namespace TNode.Editor.Inspector.InspectorImplementation{ [Obsolete] - [NodeComponent] + [ViewComponent] public class FloatFieldItem:InspectorItem{ public FloatFieldItem():base(){ CreateBindable(new FloatField()); diff --git a/TNode/Editor/Inspector/InspectorImplementation/StringFieldItem.cs b/TNode/Editor/Inspector/InspectorImplementation/StringFieldItem.cs index e05ac16..a065a9a 100644 --- a/TNode/Editor/Inspector/InspectorImplementation/StringFieldItem.cs +++ b/TNode/Editor/Inspector/InspectorImplementation/StringFieldItem.cs @@ -7,7 +7,7 @@ namespace TNode.Editor.Inspector.InspectorImplementation{ /// /// Force these element to bind native c# property /// - [NodeComponent] + [ViewComponent] public class StringFieldItem:InspectorItem{ public StringFieldItem():base(){ CreateBindable(new TextField()); diff --git a/TNode/Editor/Inspector/InspectorImplementation/ToggleFieldItem.cs b/TNode/Editor/Inspector/InspectorImplementation/ToggleFieldItem.cs index b40cfcc..41c0328 100644 --- a/TNode/Editor/Inspector/InspectorImplementation/ToggleFieldItem.cs +++ b/TNode/Editor/Inspector/InspectorImplementation/ToggleFieldItem.cs @@ -4,7 +4,7 @@ using UnityEngine.UIElements; namespace TNode.Editor.Inspector.InspectorImplementation{ [Obsolete] - [NodeComponent] + [ViewComponent] public class ToggleFieldItem:InspectorItem{ public ToggleFieldItem(){ CreateBindable(new Toggle()); diff --git a/TNode/Editor/Inspector/InspectorItemFactory.cs b/TNode/Editor/Inspector/InspectorItemFactory.cs index d628307..4a97483 100644 --- a/TNode/Editor/Inspector/InspectorItemFactory.cs +++ b/TNode/Editor/Inspector/InspectorItemFactory.cs @@ -15,12 +15,12 @@ namespace TNode.Editor.Inspector{ var hasSpecificType = NodeEditorExtensions.HasSpecificTypeComponent>(); if (hasSpecificType){ - return NodeEditorExtensions.CreateNodeComponentFromGenericType>(); + return NodeEditorExtensions.CreateViewComponentFromBaseType>(); } if (typeof(T).IsEnum){ - return NodeEditorExtensions.CreateNodeComponentFromGenericType(typeof(InspectorItem)) as InspectorItem; + return NodeEditorExtensions.CreateViewComponentFromBaseType(typeof(InspectorItem)) as InspectorItem; } return null; } @@ -30,12 +30,12 @@ namespace TNode.Editor.Inspector{ var hasSpecificType = NodeEditorExtensions.HasSpecificTypeComponent(genericType); if (hasSpecificType){ - return NodeEditorExtensions.CreateNodeComponentFromGenericType(genericType) as INodeDataBindingBase; + return NodeEditorExtensions.CreateViewComponentFromBaseType(genericType) as INodeDataBindingBase; } if (t.IsEnum){ - return NodeEditorExtensions.CreateNodeComponentFromGenericType(typeof(InspectorItem)) as INodeDataBindingBase; + return NodeEditorExtensions.CreateViewComponentFromBaseType(typeof(InspectorItem)) as INodeDataBindingBase; } return null; } diff --git a/TNode/Editor/NodeViews/DragNodeView.cs b/TNode/Editor/NodeViews/DragNodeView.cs index 8ce31c7..5502fcc 100644 --- a/TNode/Editor/NodeViews/DragNodeView.cs +++ b/TNode/Editor/NodeViews/DragNodeView.cs @@ -3,7 +3,7 @@ using TNode.Editor.BaseViews; using TNode.Models; namespace TNode.Editor.NodeViews{ - [NodeComponent] + [ViewComponent] public class DragNodeView:NodeView>{ public DragNodeView() : base(){ //Make capsule like style diff --git a/TNode/Editor/Search/BlackboardSearchWindowProvider.cs b/TNode/Editor/Search/BlackboardSearchWindowProvider.cs index acfbc82..dfec7a4 100644 --- a/TNode/Editor/Search/BlackboardSearchWindowProvider.cs +++ b/TNode/Editor/Search/BlackboardSearchWindowProvider.cs @@ -6,8 +6,8 @@ using UnityEditor; using UnityEditor.Experimental.GraphView; using UnityEngine; -namespace TNode.Editor{ - public class BlackboardSearchWindowProvider:ISearchWindowProvider{ +namespace TNode.Editor.Search{ + public class BlackboardSearchWindowProvider:ScriptableObject,ISearchWindowProvider{ private Type _graphType; private IDataGraphView _graphView; private EditorWindow _editor; @@ -20,15 +20,19 @@ namespace TNode.Editor{ public List CreateSearchTree(SearchWindowContext context){ var blackboardData = _graphView.GetBlackboardData(); var type = blackboardData.GetType(); - var entries = new List(); - if (entries == null) throw new ArgumentNullException(nameof(entries)); + var list = new List(){ + new SearchTreeGroupEntry(new GUIContent("Add New Blackboard Data"), 0), + }; + + if (list == null) throw new ArgumentNullException(nameof(list)); //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)){ + list.Add(new SearchTreeEntry(new GUIContent(field.Name,icon)){ level = 1, userData = new InternalSearchTreeUserData(){ List = field.GetValue(blackboardData) as IList, @@ -39,24 +43,20 @@ namespace TNode.Editor{ } } } - - return entries; + Debug.Log($"{list.Count}"); + return list; } public bool OnSelectEntry(SearchTreeEntry SearchTreeEntry, SearchWindowContext context){ 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); + list?.Add(newItem); return true; } - return false; } diff --git a/TNode/Editor/Search/NodeSearchWindowProvider.cs b/TNode/Editor/Search/NodeSearchWindowProvider.cs index e694f4a..55ec5ff 100644 --- a/TNode/Editor/Search/NodeSearchWindowProvider.cs +++ b/TNode/Editor/Search/NodeSearchWindowProvider.cs @@ -1,7 +1,5 @@ using System; using System.Collections.Generic; -using System.Drawing; -using TNode.BaseViews; using TNode.Cache; using TNode.Editor.BaseViews; using TNode.Editor.Tools.NodeCreator; @@ -11,7 +9,7 @@ using UnityEditor.Experimental.GraphView; using UnityEngine; using UnityEngine.UIElements; -namespace TNode.Editor{ +namespace TNode.Editor.Search{ public class NodeSearchWindowProvider:ScriptableObject,ISearchWindowProvider{ private Type _graphType; private GraphView _graphView;