private void CreateNode(object obj, Vector2 nodePosition) { if (obj is BlackboardField blackboardField) { editorView.DlogObject.RegisterCompleteObjectUndo("Drag Blackboard Field"); var property = blackboardField.userData as AbstractProperty; var node = new SerializedNode(typeof(PropertyNode), new Rect(nodePosition, EditorView.DefaultNodeSize)); editorView.DlogObject.DlogGraph.AddNode(node); node.BuildNode(editorView, editorView.EdgeConnectorListener, false); var propertyNode = node.Node as PropertyNode; propertyNode.PropertyGuid = property.GUID; node.BuildPortData(); } }
public void GenerateNodeEntries() { // First build up temporary data structure containing group & title as an array of strings (the last one is the actual title) and associated node type. var nodeEntries = new List <NodeEntry>(); foreach (var type in TypeCache.GetTypesDerivedFrom <AbstractNode>()) { if (!type.IsClass || type.IsAbstract) { continue; } if (type.GetCustomAttributes(typeof(TitleAttribute), false) is TitleAttribute[] attrs && attrs.Length > 0) { foreach (var attr in attrs) { AddEntries(type, attr.Title, nodeEntries); } } } foreach (var property in editorView.DlogObject.DlogGraph.Properties) { var node = new SerializedNode(typeof(PropertyNode), new Rect(Vector2.zero, EditorView.DefaultNodeSize)); node.BuildNode(editorView, editorView.EdgeConnectorListener, false); var propertyNode = node.Node as PropertyNode; propertyNode.PropertyGuid = property.GUID; node.BuildPortData(); AddEntries(node, new[] { "Properties", $"{property.Type}: {property.DisplayName}" }, nodeEntries); } nodeEntries.Sort((entry1, entry2) => { for (var i = 0; i < entry1.Title.Length; i++) { if (i >= entry2.Title.Length) { return(1); } var value = string.Compare(entry1.Title[i], entry2.Title[i], StringComparison.Ordinal); if (value == 0) { continue; } // Make sure that leaves go before nodes if (entry1.Title.Length != entry2.Title.Length && (i == entry1.Title.Length - 1 || i == entry2.Title.Length - 1)) { //once nodes are sorted, sort slot entries by slot order instead of alphebetically var alphaOrder = entry1.Title.Length < entry2.Title.Length ? -1 : 1; var slotOrder = entry1.CompatiblePortIndex.CompareTo(entry2.CompatiblePortIndex); return(alphaOrder.CompareTo(slotOrder)); } return(value); } return(0); }); CurrentNodeEntries = nodeEntries; }