void AddEntries(AbstractLogicNodeEditor logicNodeEditor, string[] title, List <NodeEntry> nodeEntries)
        {
            if (ConnectedLogicPort == null)
            {
                nodeEntries.Add(new NodeEntry
                {
                    LogicNodeEditor  = logicNodeEditor,
                    title            = title,
                    compatibleSlotId = ""
                });
                return;
            }

            var connectedSlot = ConnectedLogicPort.Slot;

            m_Slots.Clear();
            logicNodeEditor.GetSlots(m_Slots);
            var hasSingleSlot = m_Slots.Count(s => s.isOutputSlot != connectedSlot.isOutputSlot) == 1;

            m_Slots.RemoveAll(slot =>
            {
                var logicSlot = (LogicSlot)slot;
                return(!logicSlot.IsCompatibleWith(connectedSlot));
            });

            if (hasSingleSlot && m_Slots.Count == 1)
            {
                nodeEntries.Add(new NodeEntry
                {
                    LogicNodeEditor  = logicNodeEditor,
                    title            = title,
                    compatibleSlotId = m_Slots.First().MemberName
                });
                return;
            }

            foreach (var slot in m_Slots)
            {
                var entryTitle = new string[title.Length];
                title.CopyTo(entryTitle, 0);
                entryTitle[entryTitle.Length - 1] += ": " + slot.DisplayName;
                nodeEntries.Add(new NodeEntry
                {
                    title            = entryTitle,
                    LogicNodeEditor  = logicNodeEditor,
                    compatibleSlotId = slot.MemberName
                });
            }
        }
Example #2
0
        public void Initialize(AbstractLogicNodeEditor logicNodeEditor, IEdgeConnectorListener connectorListener)
        {
            this.LoadAndAddStyleSheet("Styles/LogicNodeView");

            if (logicNodeEditor is IInputNode)
            {
                AddToClassList("input");
            }
            else if (logicNodeEditor is IOutputNode)
            {
                AddToClassList("output");
            }

            _connectorListener = connectorListener;
            LogicNodeEditor    = logicNodeEditor;
            title = LogicNodeEditor.NodeType();

            var contents = this.Q("contents");

            var controlsContainer = new VisualElement {
                name = "controls"
            };

            {
                _controlsDivider = new VisualElement {
                    name = "divider"
                };
                _controlsDivider.AddToClassList("horizontal");
                controlsContainer.Add(_controlsDivider);
                _controlItems = new VisualElement {
                    name = "items"
                };
                controlsContainer.Add(_controlItems);

                foreach (var propertyInfo in
                         logicNodeEditor.GetType().GetProperties(BindingFlags.Instance |
                                                                 BindingFlags.Public |
                                                                 BindingFlags.NonPublic))
                {
                    foreach (INodeControlAttribute attribute in
                             propertyInfo.GetCustomAttributes(typeof(INodeControlAttribute), false))
                    {
                        _controlItems.Add(attribute.InstantiateControl(logicNodeEditor, propertyInfo));
                    }
                }
            }
            contents.Add(controlsContainer);

            // Add port input container, which acts as a pixel cache for all port inputs
            _portInputContainer = new VisualElement
            {
                name = "portInputContainer",
//                clippingOptions = ClippingOptions.ClipAndCacheContents,
                pickingMode = PickingMode.Ignore
            };
            Add(_portInputContainer);

            List <LogicSlot> foundSlots = new List <LogicSlot>();

            logicNodeEditor.GetSlots(foundSlots);
            AddPorts(foundSlots);

            SetPosition(new Rect(logicNodeEditor.Position.x, logicNodeEditor.Position.y, 0, 0));
            UpdatePortInputs();
            base.expanded = logicNodeEditor.Expanded;
            RefreshExpandedState();
            UpdatePortInputVisibilities();
        }