feat: add a black board search window for create list data

main
taoria 3 years ago
parent 0572478a0e
commit 246598cb82
  1. 13
      TNode/Editor/BaseViews/DataGraphView.cs
  2. 54
      TNode/Editor/Search/BlackboardSearchWindowProvider.cs

@ -112,20 +112,13 @@ namespace TNode.Editor.BaseViews{
*/ */
public abstract class DataGraphView<T>:GraphView,IDataGraphView where T:GraphData{ public abstract class DataGraphView<T>:GraphView,IDataGraphView where T:GraphData{
#region variables and properties #region variables and properties
private T _data; private T _data;
private bool _isInspectorOn; private bool _isInspectorOn;
private NodeSearchWindowProvider _nodeSearchWindowProvider; private NodeSearchWindowProvider _nodeSearchWindowProvider;
private NodeInspector _nodeInspector; private NodeInspector _nodeInspector;
public GraphEditor<T> Owner; public GraphEditor<T> Owner;
private Dictionary<string,Node> _nodeDict = new(); private Dictionary<string,Node> _nodeDict = new();
private Blackboard _blackboard; private Blackboard _blackboard;
public T Data{ public T Data{
get{ return _data; } get{ return _data; }
set{ set{
@ -469,11 +462,17 @@ namespace TNode.Editor.BaseViews{
} }
Owner.graphEditorData.graphElementsData.RemoveAll(x => x.guid == nodeData.id); Owner.graphEditorData.graphElementsData.RemoveAll(x => x.guid == nodeData.id);
} }
public BlackboardData GetBlackboardData(){
return this._data.blackboardData;
}
} }
public interface IDataGraphView{ public interface IDataGraphView{
public void AddTNode(NodeData nodeData, Rect rect); public void AddTNode(NodeData nodeData, Rect rect);
public void RemoveTNode(NodeData nodeData); public void RemoveTNode(NodeData nodeData);
public BlackboardData GetBlackboardData();
} }
public class DataChangedEventArgs<T>{ public class DataChangedEventArgs<T>{

@ -1,20 +1,70 @@
using System; using System;
using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using TNode.Editor.BaseViews;
using UnityEditor; using UnityEditor;
using UnityEditor.Experimental.GraphView; using UnityEditor.Experimental.GraphView;
using UnityEngine;
namespace TNode.Editor{ namespace TNode.Editor{
public class BlackboardSearchWindowProvider:ISearchWindowProvider{ public class BlackboardSearchWindowProvider:ISearchWindowProvider{
private Type _graphType; private Type _graphType;
private GraphView _graphView; private IDataGraphView _graphView;
private EditorWindow _editor; private EditorWindow _editor;
private struct InternalSearchTreeUserData{
public IList List;
public Type Type;
}
public List<SearchTreeEntry> CreateSearchTree(SearchWindowContext context){ public List<SearchTreeEntry> CreateSearchTree(SearchWindowContext context){
return null; var blackboardData = _graphView.GetBlackboardData();
var type = blackboardData.GetType();
var entries = new List<SearchTreeEntry>();
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){ 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);
return true;
}
return false; return false;
} }
public void Setup(Type graph,IDataGraphView graphView,EditorWindow editor){
_graphType = graph;
_graphView = graphView;
_editor = editor;
}
} }
} }
Loading…
Cancel
Save