示例#1
0
 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();
     }
 }
示例#2
0
        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;
        }