feat:create search window at right position

main
taoria 3 years ago
parent fb2ee29c5a
commit 42e06765ea
  1. 20
      TNode/Editor/Blackboard/IBlackboardView.cs
  2. 5
      TNode/Editor/EditorPersistence/GraphEditorData.cs
  3. 4
      TNode/Editor/EditorPersistence/GraphElementEditorData.cs
  4. 2
      TNode/Editor/NodeGraphView/IBaseDataGraphView.cs
  5. 1
      TNode/Editor/Tools/GraphEditorCreator/GraphEditorCreator.cs
  6. 9
      TNodeGraphViewImpl/Editor/Cache/NodeEditorExtensions.cs
  7. 38
      TNodeGraphViewImpl/Editor/GraphBlackboard/DefaultGraphBlackboardView.cs
  8. 45
      TNodeGraphViewImpl/Editor/GraphBlackboard/GraphBlackboardView.cs
  9. 2
      TNodeGraphViewImpl/Editor/GraphEditor.cs
  10. 66
      TNodeGraphViewImpl/Editor/NodeGraphView/DataGraphView.cs

@ -1,7 +1,19 @@
namespace TNode.Editor.Blackboard{ using TNode.Editor.NodeGraphView;
using TNode.Models;
using UnityEditor;
using UnityEngine;
namespace TNode.Editor.Blackboard{
public interface IBlackboardView{ public interface IBlackboardView{
public void AddData(){ public BlackboardData GetBlackboardData();
public void SetBlackboardData(BlackboardData data);
}
public void AddItem();
void Setup(IBaseDataGraphView graphView,EditorWindow ownerWindow);
}
public interface IBlackboardView<T> : IBlackboardView where T : BlackboardData{
public T Data{ get; set; }
} }
} }

@ -1,10 +1,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using TNode.Editor.EditorPersistence;
using TNode.Editor.Model;
using UnityEngine; using UnityEngine;
using UnityEngine.Serialization;
namespace TNode.Editor{ namespace TNode.Editor.EditorPersistence{
[CreateAssetMenu(fileName = "Graph Editor Data", menuName = "TNode/Graph Editor Data")] [CreateAssetMenu(fileName = "Graph Editor Data", menuName = "TNode/Graph Editor Data")]
public class GraphEditorData:ScriptableObject{ public class GraphEditorData:ScriptableObject{

@ -1,9 +1,7 @@
using System; using System;
using TNode.Models;
using UnityEngine; using UnityEngine;
using UnityEngine.Serialization;
namespace TNode.Editor.Model{ namespace TNode.Editor.EditorPersistence{
[Serializable] [Serializable]
public class GraphElementEditorData{ public class GraphElementEditorData{

@ -6,6 +6,8 @@ namespace TNode.Editor.NodeGraphView{
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 void CreateBlackboard();
public GraphData GetGraphData();
public BlackboardData GetBlackboardData(); public BlackboardData GetBlackboardData();

@ -1,5 +1,6 @@
using System.IO; using System.IO;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using TNode.Editor.EditorPersistence;
using UnityEditor; using UnityEditor;
using UnityEngine; using UnityEngine;
using UnityEngine.UIElements; using UnityEngine.UIElements;

@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using TNode.Attribute; using TNode.Attribute;
using TNode.Editor; using TNode.Editor;
using TNode.Editor.Blackboard;
using TNode.Editor.NodeViews; using TNode.Editor.NodeViews;
using TNode.Models; using TNode.Models;
using TNodeGraphViewImpl.Editor.GraphBlackboard; using TNodeGraphViewImpl.Editor.GraphBlackboard;
@ -151,14 +152,14 @@ namespace TNodeGraphViewImpl.Editor.Cache{
return null; return null;
} }
public static Blackboard CreateBlackboardDataFromBlackboardDataType(Type t){ public static IBlackboardView CreateBlackboardDataFromBlackboardDataType(Type t){
var type = typeof(GraphBlackboardView<>).MakeGenericType(t); var type = typeof(GraphBlackboardView<>).MakeGenericType(t);
var res = CreateViewComponentFromBaseType(type) as Blackboard; var res = CreateViewComponentFromBaseType(type) as IBlackboardView;
return res ?? new DefaultGraphBlackboardView(); return res ?? new DefaultGraphBlackboardView();
} }
public static Blackboard CreateBlackboardWithGraphData(GraphData graphData){ public static IBlackboardView CreateBlackboardWithGraphData(GraphData graphData){
var graphType = graphData.GetType(); var graphType = graphData.GetType();
if (NodeEditorSingleton.Instance.GraphBlackboard.ContainsKey(graphType)){ if (NodeEditorSingleton.Instance.GraphBlackboard.ContainsKey(graphType)){
var type = NodeEditorSingleton.Instance.GraphBlackboard[graphType]; var type = NodeEditorSingleton.Instance.GraphBlackboard[graphType];
@ -167,7 +168,7 @@ namespace TNodeGraphViewImpl.Editor.Cache{
} }
return null; return null;
} }
public static Blackboard CreateBlackboardWithGraphData(Type graphType){ public static IBlackboardView CreateBlackboardWithGraphData(Type graphType){
if (NodeEditorSingleton.Instance.GraphBlackboard.ContainsKey(graphType)){ if (NodeEditorSingleton.Instance.GraphBlackboard.ContainsKey(graphType)){
var type = NodeEditorSingleton.Instance.GraphBlackboard[graphType]; var type = NodeEditorSingleton.Instance.GraphBlackboard[graphType];
return CreateBlackboardDataFromBlackboardDataType(type); return CreateBlackboardDataFromBlackboardDataType(type);

@ -1,17 +1,39 @@
using TNode.Attribute; using System.Collections;
using System.Reflection;
using TNode.Attribute;
using TNode.Editor.NodeGraphView;
using TNode.Editor.Search;
using TNode.Models; using TNode.Models;
using UnityEditor;
using UnityEditor.Experimental.GraphView;
using UnityEngine;
namespace TNodeGraphViewImpl.Editor.GraphBlackboard{ namespace TNodeGraphViewImpl.Editor.GraphBlackboard{
[ViewComponent] [ViewComponent]
public class DefaultGraphBlackboardView:GraphBlackboardView<BlackboardData>{ public class DefaultGraphBlackboardView:GraphBlackboardView<BlackboardData>{
public DefaultGraphBlackboardView(){ protected override void UpdateBlackboard(BlackboardData data){
}
public void ConstructView(){
}
public void AddParameter(){
foreach (var field in data.GetType()
.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)){
//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.BlackboardProperty(field.Name,field.FieldType));
this.Add(propertyField);
}
}
this.addItemRequested = (sender) => {
var res = ScriptableObject.CreateInstance<BlackboardSearchWindowProvider>();
//Get right top corner of the blackboard
var blackboardPos = GetPosition().position+OwnerWindow.position.position;
var searchWindowContext = new SearchWindowContext(blackboardPos,200,200);
//Call search window
res.Setup(Owner.GetGraphData().GetType(),Owner,OwnerWindow);
SearchWindow.Open(searchWindowContext, res);
};
} }
} }
} }

@ -1,15 +1,52 @@
using TNode.Models; using TNode.Editor.Blackboard;
using TNode.Editor.NodeGraphView;
using TNode.Editor.Search;
using TNode.Models;
using UnityEditor;
using UnityEditor.Experimental.GraphView; using UnityEditor.Experimental.GraphView;
using UnityEngine;
namespace TNodeGraphViewImpl.Editor.GraphBlackboard{ namespace TNodeGraphViewImpl.Editor.GraphBlackboard{
/// <summary> /// <summary>
/// Implement this class to create graph black board for specified graph /// Implement this class to create graph black board for specified graph
/// </summary> /// </summary>
public class GraphBlackboardView<T>:Blackboard where T:BlackboardData{ public class GraphBlackboardView<T>:Blackboard,IBlackboardView<T> where T:BlackboardData{
public T BlackboardData; protected IBaseDataGraphView Owner;
protected EditorWindow OwnerWindow;
private T _data;
public GraphBlackboardView() : base(){ public void Setup(IBaseDataGraphView graphView,EditorWindow ownerWindow){
Owner = graphView;
OwnerWindow = ownerWindow;
}
public new void SetPosition(Rect rect){
} }
protected virtual void UpdateBlackboard(BlackboardData data){
}
public T Data{
get => (T) _data;
set{
_data = value;
UpdateBlackboard(value);
}
}
public BlackboardData GetBlackboardData(){
return _data;
}
public void SetBlackboardData(BlackboardData data){
Data = (T) data;
}
public void AddItem(){
}
} }
} }

@ -1,6 +1,6 @@
using Codice.CM.Common; using Codice.CM.Common;
using TNode.Editor.EditorPersistence;
using TNode.Editor.Inspector; using TNode.Editor.Inspector;
using TNode.Editor.Model;
using TNode.Models; using TNode.Models;
using TNodeGraphViewImpl.Editor.Cache; using TNodeGraphViewImpl.Editor.Cache;
using TNodeGraphViewImpl.Editor.NodeGraphView; using TNodeGraphViewImpl.Editor.NodeGraphView;

@ -4,8 +4,9 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Reflection; using System.Reflection;
using TNode.Editor; using TNode.Editor;
using TNode.Editor.Blackboard;
using TNode.Editor.EditorPersistence;
using TNode.Editor.Inspector; using TNode.Editor.Inspector;
using TNode.Editor.Model;
using TNode.Editor.NodeGraphView; using TNode.Editor.NodeGraphView;
using TNode.Editor.NodeViews; using TNode.Editor.NodeViews;
using TNode.Editor.Search; using TNode.Editor.Search;
@ -29,7 +30,7 @@ namespace TNodeGraphViewImpl.Editor.NodeGraphView{
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 IBlackboardView _blackboard;
public T Data{ public T Data{
get{ return _data; } get{ return _data; }
set{ set{
@ -191,47 +192,14 @@ namespace TNodeGraphViewImpl.Editor.NodeGraphView{
miniMap.SetPosition(rect); miniMap.SetPosition(rect);
} }
public virtual void CreateBlackboard(){
_blackboard = NodeEditorExtensions.CreateBlackboardWithGraphData(typeof(T));
_blackboard.SetPosition(new Rect(0,0,200,600));
Add(_blackboard);
OnDataChanged+= (sender, e) => { BlackboardUpdate(); };
}
private void BlackboardUpdate(){ private void BlackboardUpdate(){
if (_data.blackboardData == null || _data.blackboardData.GetType() == typeof(BlackboardData)){ if (_data.blackboardData == null || _data.blackboardData.GetType() == typeof(BlackboardData)){
_data.blackboardData = NodeEditorExtensions.GetAppropriateBlackboardData(_data.GetType()); _data.blackboardData = NodeEditorExtensions.GetAppropriateBlackboardData(_data.GetType());
if (_data.blackboardData == null) return; if (_data.blackboardData == null) return;
_blackboard.SetBlackboardData(_data.blackboardData);
} }
//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
//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<BlackboardSearchWindowProvider>();
//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(){ public virtual void DestroyInspector(){
@ -330,10 +298,7 @@ namespace TNodeGraphViewImpl.Editor.NodeGraphView{
OnGraphViewDestroy(); OnGraphViewDestroy();
} }
public bool IsDroppable(){ #region implement interfaces
return true;
}
public void AddTNode(NodeData nodeData, Rect rect){ public void AddTNode(NodeData nodeData, Rect rect){
if (NodeEditorExtensions.CreateNodeViewFromNodeType(nodeData.GetType()) is Node nodeView){ if (NodeEditorExtensions.CreateNodeViewFromNodeType(nodeData.GetType()) is Node nodeView){
nodeView.SetPosition(rect); nodeView.SetPosition(rect);
@ -381,9 +346,30 @@ namespace TNodeGraphViewImpl.Editor.NodeGraphView{
Owner.graphEditorData.graphElementsData.RemoveAll(x => x.guid == nodeData.id); Owner.graphEditorData.graphElementsData.RemoveAll(x => x.guid == nodeData.id);
} }
public void CreateBlackboard(){
_blackboard = NodeEditorExtensions.CreateBlackboardWithGraphData(typeof(T));
_blackboard.Setup(this,Owner);
var castedBlackboard = _blackboard as Blackboard;
Add(castedBlackboard);
Rect blackboardPos = new Rect(0,0,200,700);
castedBlackboard?.SetPosition(blackboardPos);
OnDataChanged+= (sender, e) => { BlackboardUpdate(); };
}
public GraphData GetGraphData(){
return _data;
}
public BlackboardData GetBlackboardData(){ public BlackboardData GetBlackboardData(){
return this._data.blackboardData; return this._data.blackboardData;
} }
#endregion
} }

Loading…
Cancel
Save