您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
141 行
3.8 KiB
141 行
3.8 KiB
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using UnityEditor;
|
|
using UnityEngine;
|
|
using UnityEngine.RMGUI;
|
|
|
|
namespace RMGUI.GraphView.Demo
|
|
{
|
|
[StyleSheet("Assets/NewUI/Editor/Demo/Views/NodalView.uss")]
|
|
class NodesContentView : SimpleContentView
|
|
{
|
|
private readonly System.Random rnd = new System.Random();
|
|
|
|
public NodesContentView()
|
|
{
|
|
// Shortcut handler to delete elements
|
|
var dictionary = new Dictionary<Event, ShortcutDelegate>();
|
|
dictionary[Event.KeyboardEvent("delete")] = DeleteSelection;
|
|
AddManipulator(new ShortcutHandler(dictionary));
|
|
|
|
// Contextual menu to create new nodes
|
|
AddManipulator(new ContextualMenu((evt, customData) =>
|
|
{
|
|
var menu = new GenericMenu();
|
|
menu.AddItem(new GUIContent("Create Operator"), false,
|
|
contentView => CreateOperator(),
|
|
this);
|
|
menu.ShowAsContext();
|
|
return EventPropagation.Continue;
|
|
}));
|
|
|
|
dataMapper[typeof(CustomEdgeData)] = typeof(CustomEdge);
|
|
dataMapper[typeof(NodeAnchorData)] = typeof(NodeAnchor);
|
|
dataMapper[typeof(NodeData)] = typeof(Node);
|
|
dataMapper[typeof(VerticalNodeData)] = typeof(VerticalNode);
|
|
}
|
|
|
|
public void CreateOperator()
|
|
{
|
|
NodalViewData nodalViewData = dataSource as NodalViewData;
|
|
if (nodalViewData != null)
|
|
{
|
|
var x = rnd.Next(0, 600);
|
|
var y = rnd.Next(0, 300);
|
|
|
|
nodalViewData.CreateOperator(typeof(Vector3), new Rect(x, y, 200, 176), "Shiny New Operator");
|
|
}
|
|
}
|
|
|
|
// TODO: this has data model knowledge, move this to GraphData
|
|
private EventPropagation DeleteSelection()
|
|
{
|
|
// and DeleteSelection would call that method.
|
|
var nodalViewData = dataSource as NodalViewData;
|
|
if (nodalViewData == null)
|
|
return EventPropagation.Stop;
|
|
|
|
// TODO We will want to move this up to GraphView
|
|
var elementsToRemove = new List<GraphElementData>();
|
|
foreach (var selectedElement in selection.Cast<GraphElement>()
|
|
.Where(e => e != null && e.dataProvider != null))
|
|
{
|
|
var nodeData = selectedElement.dataProvider as NodeData;
|
|
if (nodeData != null)
|
|
{
|
|
// If there are connected edges, disconnect first (if such functionality is available) and delete
|
|
foreach (var element in allElements.OfType<GraphElement>())
|
|
{
|
|
var edge = element as Edge;
|
|
if (edge == null) continue;
|
|
|
|
var edgeData = edge.GetData<EdgeData>();
|
|
if (edgeData == null) continue;
|
|
|
|
// Try output anchor first
|
|
if ((edgeData.left != null && edgeData.left == (IConnectable)nodeData.outputAnchor) ||
|
|
(edgeData.right != null && edgeData.right == (IConnectable)nodeData.outputAnchor))
|
|
{
|
|
elementsToRemove.Add(edgeData);
|
|
continue;
|
|
}
|
|
|
|
// Check each input anchor
|
|
if (nodeData.anchors.Any(a => (edgeData.left != null && edgeData.left == (IConnectable)a) ||
|
|
(edgeData.right != null && edgeData.right == (IConnectable)a)))
|
|
{
|
|
elementsToRemove.Add(edgeData);
|
|
}
|
|
}
|
|
}
|
|
|
|
elementsToRemove.Add(selectedElement.dataProvider);
|
|
}
|
|
|
|
// Notify node anchors of deconnection
|
|
foreach (var edgeData in elementsToRemove.OfType<EdgeData>())
|
|
{
|
|
if (edgeData.left != null)
|
|
{
|
|
edgeData.left.connected = false;
|
|
}
|
|
|
|
if (edgeData.right != null)
|
|
{
|
|
edgeData.right.connected = false;
|
|
}
|
|
}
|
|
|
|
foreach (var b in elementsToRemove)
|
|
nodalViewData.RemoveElement(b);
|
|
|
|
return EventPropagation.Stop;
|
|
}
|
|
}
|
|
|
|
class NodalView : EditorWindow
|
|
{
|
|
[MenuItem("Window/GraphView Demo/Nodal UI")]
|
|
public static void ShowWindow()
|
|
{
|
|
GetWindow<NodalView>();
|
|
}
|
|
|
|
void OnEnable()
|
|
{
|
|
var view = new NodesContentView
|
|
{
|
|
name = "theView",
|
|
dataSource = CreateInstance<NodalViewData>()
|
|
};
|
|
view.StretchToParentSize();
|
|
|
|
windowRoot.AddChild(view);
|
|
}
|
|
|
|
void OnDisable()
|
|
{
|
|
windowRoot.ClearChildren();
|
|
}
|
|
}
|
|
}
|