Unity graph tool solution based on different implementation now focused on Unity.Experimental.Graphview
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

95 lines
3.3 KiB

3 years ago
using Codice.CM.Common;
using TNode.BaseViews;
3 years ago
using TNode.Cache;
using TNode.Editor.BaseViews;
using TNode.Editor.Model;
3 years ago
using TNode.Models;
3 years ago
using UnityEditor;
using UnityEditor.Experimental.GraphView;
3 years ago
using UnityEngine;
using UnityEngine.Serialization;
using UnityEngine.UIElements;
namespace TNode.Editor{
3 years ago
public abstract class GraphEditor<T> : EditorWindow where T:GraphData{
protected DataGraphView<T> _graphView;
[FormerlySerializedAs("m_VisualTreeAsset")] [SerializeField]
3 years ago
private VisualTreeAsset mVisualTreeAsset = default;
//Persist editor data ,such as node position,node size ,etc ,in this script object
public NodeEditorData nodeEditorData;
3 years ago
public void CreateGUI(){
3 years ago
// Each editor window contains a root VisualElement object
VisualElement root = rootVisualElement;
3 years ago
// Instantiate UXML
VisualElement labelFromUXML = mVisualTreeAsset.Instantiate();
root.Add(labelFromUXML);
3 years ago
BuildGraphView();
DefineGraphEditorActions();
OnCreate();
}
private void BuildGraphView(){
_graphView = NodeEditorExtensions.CreateInstance<DataGraphView<T>>();
rootVisualElement.Add(_graphView);
_graphView.StretchToParentSize();
_graphView.ConstructViewContextualMenu(evt => {
//Current issue is that the search window don't show up at the exact position of the mouse click by dma.eventInfo.mousePosition
//So I have to manually set the position of the search window to fit the mouse click position by add an offset driven by Editor's position
//Maybe a better way exists to fix this issue
Vector2 editorPosition = this.position.position;
evt.menu.AppendAction("Create Node", dma => {
var dmaPos = dma.eventInfo.mousePosition+editorPosition;
SearchWindowContext searchWindowContext = new SearchWindowContext(dmaPos,200,200);
SearchWindow.Open(searchWindowContext, ScriptableObject.CreateInstance<SearchWindowProvider>());
});
});
}
private void ConstructSearchWindow(){
//Register a search window
3 years ago
}
private void DefineGraphEditorActions(){
//Register a event when user press ctrl + s
rootVisualElement.RegisterCallback<KeyUpEvent>((evt) => {
if (evt.keyCode == KeyCode.S && evt.ctrlKey)
{
Save();
}
});
}
private void Save(){
//if no graph is loaded ,create a file save dialogue
if (_graphView.Data == null)
{
string path = EditorUtility.SaveFilePanel("Save Graph", "", "", "asset");
if (path.Length != 0){
//Create a new asset file with type of T
T asset = ScriptableObject.CreateInstance<T>();
AssetDatabase.CreateAsset(asset, path);
}
}
}
protected virtual void OnCreate(){
}
3 years ago
}
}