Example #1
0
        public override void OnClick(Node source, PortCommandData data, Vector2 mousePosition)
        {
            if (source.owner)
            {
                Undo.SetCurrentGroupName("Promote to node");
                Undo.RegisterFullObjectHierarchyUndo(source.owner, "Promote to node");
            }
            MemberData m = data.member;

            if (data.portType != null && (!m.isAssigned || m.type == null))
            {
                if (ReflectionUtils.CanCreateInstance(data.portType))
                {
                    m.CopyFrom(new MemberData(ReflectionUtils.CreateInstance(data.portType)));
                }
                else
                {
                    m.CopyFrom(MemberData.CreateFromValue(null, data.portType));
                }
            }
            NodeEditorUtility.AddNewNode <MultipurposeNode>(graph.editorData, null, null, new Vector2(source.editorRect.x - 100, source.editorRect.y), (node) => {
                node.target.target = new MemberData(m);
                MemberDataUtility.UpdateMultipurposeMember(node.target);
                m.CopyFrom(new MemberData(node, MemberData.TargetType.ValueNode));
            });
            graph.Refresh();
        }
Example #2
0
        public override void OnClick(Node source, Vector2 mousePosition)
        {
            FilterAttribute filter = new FilterAttribute();

            filter.HideTypes.Add(typeof(void));
            filter.MaxMethodParam           = int.MaxValue;
            filter.SetMember                = true;
            filter.Public                   = true;
            filter.Instance                 = true;
            filter.Static                   = false;
            filter.DisplayDefaultStaticType = false;
            var customItems = ItemSelector.MakeCustomItems(source.ReturnType(), filter, source.ReturnType().PrettyName());

            if (customItems != null)
            {
                ItemSelector w = ItemSelector.ShowWindow(source, MemberData.none, filter, delegate(MemberData value) {
                    value.instance = new MemberData(source, MemberData.TargetType.ValueNode);
                    NodeEditorUtility.AddNewNode(graph.editorData, null, null, mousePositionOnCanvas, (MultipurposeNode n) => {
                        if (n.target == null)
                        {
                            n.target = new MultipurposeMember();
                        }
                        n.target.target = value;
                        MemberDataUtility.UpdateMultipurposeMember(n.target);
                        NodeEditorUtility.AddNewNode(graph.editorData, null, null,
                                                     new Vector2(mousePositionOnCanvas.x + n.editorRect.width + 150, mousePositionOnCanvas.y),
                                                     (NodeSetValue SV) => {
                            SV.target = new MemberData(n, MemberData.TargetType.ValueNode);
                        });
                    });
                    graph.Refresh();
                }, customItems).ChangePosition(GUIUtility.GUIToScreenPoint(mousePosition));
                w.displayDefaultItem = false;
            }
        }
Example #3
0
        public static Events.Action onAddGetAction(MemberData member)
        {
            GetValue action = new GetValue();

            action.target.target = member;
            MemberDataUtility.UpdateMultipurposeMember(action.target);
            return(action);
        }
Example #4
0
        public static Condition onAddCompareValue(MemberData member)
        {
            MethodValidation cond = new MethodValidation();

            cond.target.target = member;
            MemberDataUtility.UpdateMultipurposeMember(cond.target);
            return(cond);
        }
Example #5
0
        public static Condition onAddIsComparer(MemberData member)
        {
            IsCompare cond = new IsCompare();

            cond.target = new MultipurposeMember()
            {
                target = member
            };
            MemberDataUtility.UpdateMultipurposeMember(cond.target);
            return(cond);
        }
Example #6
0
 public MultipurposeMember(MemberData target, MemberData[] parameters)
 {
     this.target = new MemberData(target);
     if (parameters != null)
     {
         this.parameters = new MemberData[parameters.Length];
         for (int i = 0; i < parameters.Length; i++)
         {
             this.parameters[i] = new MemberData(parameters[i]);
         }
     }
     MemberDataUtility.UpdateMultipurposeMember(this);
 }
Example #7
0
        public override void OnClick(Node source, PortCommandData data, Vector2 mousePosition)
        {
            if (source.owner)
            {
                Undo.SetCurrentGroupName("To value node");
                Undo.RegisterFullObjectHierarchyUndo(source.owner, "To value node");
            }
            var member = data.member;

            NodeEditorUtility.AddNewNode <MultipurposeNode>(graph.editorData, null, null, new Vector2(source.editorRect.x - 100, source.editorRect.y), (node) => {
                node.target.target = MemberData.CreateFromValue(ReflectionUtils.CreateInstance(filter.Types[0]), filter.Types[0]);
                MemberDataUtility.UpdateMultipurposeMember(node.target);
                member.CopyFrom(MemberData.CreateConnection(node, false));
            });
            graph.Refresh();
        }
Example #8
0
        public static Condition onAddEqualityComparer(MemberData member)
        {
            EqualityCompare cond = new EqualityCompare();

            cond.target = new MultipurposeMember()
            {
                target = member
            };
            MemberDataUtility.UpdateMultipurposeMember(cond.target);
            if (member.type != null && ReflectionUtils.CanCreateInstance(member.type))
            {
                cond.value = new MemberData(ReflectionUtils.CreateInstance(member.type));
            }
            else
            {
                cond.value = new MemberData(null, MemberData.TargetType.Values);
            }
            return(cond);
        }
Example #9
0
        public override void OnClick(Node source, PortCommandData data, Vector2 mousePosition)
        {
            if (source.owner)
            {
                Undo.SetCurrentGroupName("Assign to contructor node");
                Undo.RegisterFullObjectHierarchyUndo(source.owner, "Assign to contructor node");
            }
            var member = data.member;

            NodeEditorUtility.AddNewNode <MultipurposeNode>(graph.editorData, null, null, new Vector2(source.editorRect.x - 100, source.editorRect.y), (node) => {
                var type  = filter.GetActualType();
                var ctors = type.GetConstructors();
                if (ctors != null && ctors.Length > 0)
                {
                    System.Reflection.ConstructorInfo ctor = null;
                    foreach (var c in ctors)
                    {
                        if (ctor == null)
                        {
                            ctor = c;
                        }
                        else if (ctor.GetParameters().Length < c.GetParameters().Length)
                        {
                            ctor = c;
                        }
                    }
                    node.target.target = new MemberData(ctor);
                }
                else
                {
                    node.target.target = new MemberData(type.Name + ".ctor", type, MemberData.TargetType.Constructor);
                }
                MemberDataUtility.UpdateMultipurposeMember(node.target);
                member.CopyFrom(new MemberData(node, MemberData.TargetType.ValueNode));
            });
            graph.Refresh();
        }
Example #10
0
        public void ShowNodeMenu(Vector2 position, FilterAttribute filter = null, Action <Node> onAddNode = null, bool flowNodes = true)
        {
            var valueMenuPos = GetMenuPosition();

            if (filter == null)
            {
                filter = new FilterAttribute();
                //filter.CanSelectType = true;
                //filter.HideTypes.Add(typeof(void));
            }
            else
            {
                filter = new FilterAttribute(filter);
            }
            filter.DisplayInstanceOnStatic = true;
            filter.MaxMethodParam          = int.MaxValue;
            filter.Public   = true;
            filter.Instance = true;
            if (flowNodes)
            {
                filter.VoidType = true;
            }
            ItemSelector w = ItemSelector.ShowWindow(editorData.selectedGroup ?? editorData.selectedRoot as UnityEngine.Object ?? editorData.graph, new MemberData(editorData.selectedGroup ?? editorData.selectedRoot as UnityEngine.Object ?? editorData.graph, MemberData.TargetType.SelfTarget), filter, delegate(MemberData value) {
                NodeEditorUtility.AddNewNode <MultipurposeNode>(editorData, null, null, position, delegate(MultipurposeNode n) {
                    if (n.target == null)
                    {
                        n.target = new MultipurposeMember();
                    }
                    n.target.target = value;
                    MemberDataUtility.UpdateMultipurposeMember(n.target);
                    if (onAddNode != null)
                    {
                        onAddNode(n);
                    }
                    Refresh();
                });
            }).ChangePosition(valueMenuPos);

            w.displayNoneOption     = false;
            w.displayCustomVariable = false;
            if (filter.SetMember)
            {
                return;                //Return on set member is true.
            }
            List <ItemSelector.CustomItem> customItems = new List <ItemSelector.CustomItem>();

            foreach (NodeMenu menuItem in NodeEditorUtility.FindNodeMenu())
            {
                if (filter.OnlyGetType && menuItem.type != typeof(Type))
                {
                    continue;
                }
                bool isFlowNode = !menuItem.type.IsSubclassOf(typeof(ValueNode));
                if (editorData.selectedRoot && menuItem.HideOnFlow || !flowNodes && isFlowNode)
                {
                    continue;
                }
                if (isFlowNode && filter.SetMember || !filter.IsValidTarget(MemberData.TargetType.FlowNode))
                {
                    continue;
                }
                if (!isFlowNode && !filter.IsValidTarget(MemberData.TargetType.ValueNode))
                {
                    continue;
                }
                if (editorData.selectedGroup && (menuItem.HideOnGroup))
                {
                    continue;
                }
                if (menuItem.HideOnStateMachine && !editorData.selectedRoot && !editorData.selectedGroup)
                {
                    continue;
                }
                if (menuItem.returnType != null && menuItem.returnType != typeof(object) && !filter.IsValidType(menuItem.returnType))
                {
                    continue;
                }
                if (menuItem.IsCoroutine && !editorData.supportCoroutine)
                {
                    continue;
                }
                customItems.Add(new ItemSelector.CustomItem(menuItem.name, delegate() {
                    NodeEditorUtility.AddNewNode <Node>(editorData, menuItem.name.Split(' ')[0], menuItem.type, position, onAddNode);
                    Refresh();
                }, menuItem.category.Replace("/", "."))
                {
                    icon    = isFlowNode ? uNodeEditorUtility.GetTypeIcon(typeof(TypeIcons.FlowIcon)) : null,
                    tooltip = new GUIContent(menuItem.tooltip),
                });
            }
            #region Flow
            if (flowNodes && !filter.SetMember && filter.IsValidType(typeof(void)))
            {
                if (!(!editorData.selectedRoot && !editorData.selectedGroup))
                {
                    customItems.Add(new ItemSelector.CustomItem("Continue", delegate() {
                        NodeEditorUtility.AddNewNode <NodeJumpStatement>(
                            editorData,
                            "Continue",
                            position,
                            delegate(NodeJumpStatement n) {
                            n.statementType = JumpStatementType.Continue;
                        });
                        Refresh();
                    }, "JumpStatement")
                    {
                        icon = uNodeEditorUtility.GetTypeIcon(typeof(TypeIcons.FlowIcon)),
                    });
                    customItems.Add(new ItemSelector.CustomItem("Break", delegate() {
                        NodeEditorUtility.AddNewNode <NodeJumpStatement>(
                            editorData,
                            "Break",
                            position,
                            delegate(NodeJumpStatement n) {
                            n.statementType = JumpStatementType.Break;
                        });
                        Refresh();
                    }, "JumpStatement")
                    {
                        icon = uNodeEditorUtility.GetTypeIcon(typeof(TypeIcons.FlowIcon)),
                    });
                }
                if (editorData.selectedRoot)
                {
                    customItems.Add(new ItemSelector.CustomItem("Return", delegate() {
                        NodeEditorUtility.AddNewNode <NodeReturn>(
                            editorData,
                            "Return",
                            position,
                            delegate(NodeReturn n) {
                        });
                        Refresh();
                    }, "Return")
                    {
                        icon = uNodeEditorUtility.GetTypeIcon(typeof(TypeIcons.FlowIcon)),
                    });
                }
            }
            #endregion
            if (filter.IsValidTarget(MemberData.TargetType.ValueNode))
            {
                if (filter.IsValidType(typeof(Type)))
                {
                    customItems.Add(new ItemSelector.CustomItem("typeof()", delegate() {
                        var win = TypeSelectorWindow.ShowWindow(Vector2.zero, new FilterAttribute()
                        {
                            OnlyGetType = true, DisplayRuntimeType = false
                        }, delegate(MemberData[] types) {
                            NodeEditorUtility.AddNewNode <MultipurposeNode>(
                                editorData,
                                position,
                                delegate(MultipurposeNode n) {
                                if (n.target == null)
                                {
                                    n.target = new MultipurposeMember();
                                }
                                n.target.target = types[0];
                                if (onAddNode != null)
                                {
                                    onAddNode(n);
                                }
                                Refresh();
                            });
                        });
                        win.targetObject = editorData.selectedGroup ?? editorData.selectedRoot as UnityEngine.Object ?? editorData.graph;
                        win.ChangePosition(valueMenuPos);
                    }, "Data"));
                }
                var nodeMenuItems = NodeEditorUtility.FindCreateNodeCommands();
                foreach (var n in nodeMenuItems)
                {
                    n.graph  = this;
                    n.filter = filter;
                    if (!n.IsValid())
                    {
                        continue;
                    }
                    customItems.Add(new ItemSelector.CustomItem(n.name, () => {
                        var createdNode = n.Setup(position);
                        if (onAddNode != null)
                        {
                            onAddNode(createdNode);
                        }
                    }, n.category)
                    {
                        icon = uNodeEditorUtility.GetTypeIcon(n.icon),
                    });
                }
            }
            w.customItems = customItems;
        }
Example #11
0
 public static List <EventActionData> GetConditionBlockFromNode(Node node)
 {
     if (node is NodeSetValue)
     {
         var source = node as NodeSetValue;
         var action = new SetValue();
         action.target = new MemberData(source.target);
         action.value  = new MemberData(source.value);
         return(new List <EventActionData>()
         {
             action
         });
     }
     else if (node is MultipurposeNode)
     {
         var source = node as MultipurposeNode;
         if (source.CanGetValue() && source.ReturnType() == typeof(bool))
         {
             var action = new MethodValidation();
             action.target = new MultipurposeMember(source.target);
             return(new List <EventActionData>()
             {
                 action
             });
         }
     }
     else if (node is Nodes.ComparisonNode)
     {
         var source = node as Nodes.ComparisonNode;
         var action = new ObjectCompare();
         action.targetA      = new MultipurposeMember(source.targetA);
         action.targetB      = new MultipurposeMember(source.targetB);
         action.operatorType = source.operatorType;
         return(new List <EventActionData>()
         {
             action
         });
     }
     else if (node is Nodes.MultiANDNode)
     {
         var source = node as Nodes.MultiANDNode;
         var result = new List <EventActionData>();
         foreach (var target in source.targets)
         {
             var action = new EqualityCompare();
             action.target = new MultipurposeMember(target);
             action.value  = new MemberData(true);
             result.Add(action);
         }
         return(result);
     }
     else if (node is Nodes.MultiORNode)
     {
         var source = node as Nodes.MultiORNode;
         var result = new List <EventActionData>();
         foreach (var target in source.targets)
         {
             if (result.Count > 0)
             {
                 result.Add(EventActionData.OrEvent);
             }
             var action = new EqualityCompare();
             action.target = new MultipurposeMember(target);
             action.value  = new MemberData(true);
             result.Add(action);
         }
         return(result);
     }
     else if (node is Nodes.NotNode)
     {
         var source = node as Nodes.NotNode;
         var action = new EqualityCompare();
         action.target = new MultipurposeMember(source.target);
         MemberDataUtility.UpdateMultipurposeMember(action.target);
         action.value = new MemberData(false);
         return(new List <EventActionData>()
         {
             action
         });
     }
     return(new List <EventActionData>());
 }
Example #12
0
        public override void OnClick(Node source, Vector2 mousePosition)
        {
            var             rType  = source.ReturnType();
            FilterAttribute filter = new FilterAttribute {
                VoidType          = true,
                MaxMethodParam    = int.MaxValue,
                Public            = true,
                Instance          = true,
                Static            = false,
                UnityReference    = false,
                InvalidTargetType = MemberData.TargetType.Null | MemberData.TargetType.Values,
                // DisplayDefaultStaticType = false
                ValidateMember = (member) => {
                    if (member is System.Reflection.MethodInfo)
                    {
                        var parameters = (member as System.Reflection.MethodInfo).GetParameters();
                        for (int i = 0; i < parameters.Length; i++)
                        {
                            if (rType.IsCastableTo(parameters[i].ParameterType))
                            {
                                return(true);
                            }
                        }
                    }
                    return(false);
                },
            };
            List <ItemSelector.CustomItem> customItems = null;

            if (rType.IsCastableTo(typeof(IGraphSystem)) && source is MultipurposeNode)
            {
                MultipurposeNode multipurposeNode = source as MultipurposeNode;
                if (multipurposeNode.target != null && multipurposeNode.target.target != null && (multipurposeNode.target.target.targetType == MemberData.TargetType.SelfTarget || multipurposeNode.target.target.targetType == MemberData.TargetType.Values))
                {
                    var sTarget = multipurposeNode.target.target.startTarget;
                    if (sTarget is IGraphSystem)
                    {
                        customItems = ItemSelector.MakeCustomItems(sTarget as Object);
                        customItems.AddRange(ItemSelector.MakeCustomItems(typeof(uNodeRoot), sTarget, filter, "Inherit Member"));
                    }
                }
            }
            bool flag = false;

            if (customItems == null)
            {
                if (rType is RuntimeType)
                {
                    customItems = ItemSelector.MakeCustomItems((rType as RuntimeType).GetRuntimeMembers(), filter);
                    if (rType.BaseType != null)
                    {
                        customItems.AddRange(ItemSelector.MakeCustomItems(rType.BaseType, filter, "Inherit Member"));
                    }
                }
                else
                {
                    customItems = ItemSelector.MakeCustomItems(rType, filter, " " + rType.PrettyName());
                }
                var usedNamespaces = source.owner.GetNamespaces().ToHashSet();
                if (usedNamespaces != null)
                {
                    customItems.AddRange(ItemSelector.MakeExtensionItems(rType, usedNamespaces, filter, "Extensions"));
                    flag = true;
                }

                var customInputItems = NodeEditorUtility.FindCustomInputPortItems();
                if (customInputItems != null && customInputItems.Count > 0)
                {
                    var mData = new MemberData(source, MemberData.TargetType.ValueNode);
                    foreach (var c in customInputItems)
                    {
                        c.graph = graph;
                        c.mousePositionOnCanvas = mousePositionOnCanvas;
                        if (c.IsValidPort(rType, PortAccessibility.OnlyGet))
                        {
                            var items = c.GetItems(source, mData, rType);
                            if (items != null)
                            {
                                customItems.AddRange(items);
                            }
                        }
                    }
                }
            }
            if (customItems != null)
            {
                filter.Static = false;
                customItems.Sort((x, y) => {
                    if (x.category != y.category)
                    {
                        return(string.Compare(x.category, y.category));
                    }
                    return(string.Compare(x.name, y.name));
                });
                ItemSelector w = ItemSelector.ShowWindow(source, MemberData.none, filter, delegate(MemberData value) {
                    flag = flag && value.targetType == MemberData.TargetType.Method && !rType.IsCastableTo(value.startType);
                    if (!flag && !value.isStatic)
                    {
                        value.instance = new MemberData(source, MemberData.TargetType.ValueNode);
                    }
                    NodeEditorUtility.AddNewNode(graph.editorData, null, null, mousePositionOnCanvas, delegate(MultipurposeNode n) {
                        if (n.target == null)
                        {
                            n.target = new MultipurposeMember();
                        }
                        n.target.target = value;
                        MemberDataUtility.UpdateMultipurposeMember(n.target);
                        if (flag)
                        {
                            var pTypes = value.ParameterTypes;
                            if (pTypes != null)
                            {
                                int paramIndex   = 0;
                                MemberData param = null;
                                for (int i = 0; i < pTypes.Length; i++)
                                {
                                    var types = pTypes[i];
                                    if (types != null)
                                    {
                                        for (int y = 0; y < types.Length; y++)
                                        {
                                            if (rType.IsCastableTo(types[y]))
                                            {
                                                param = new MemberData(source, MemberData.TargetType.ValueNode);
                                                break;
                                            }
                                            paramIndex++;
                                        }
                                        if (param != null)
                                        {
                                            break;
                                        }
                                    }
                                }
                                if (n.target.parameters.Length > paramIndex && param != null)
                                {
                                    n.target.parameters[paramIndex] = param;
                                }
                            }
                        }
                    });
                    graph.Refresh();
                }, customItems).ChangePosition(GUIUtility.GUIToScreenPoint(mousePosition));
                w.displayRecentItem = false;
                w.displayNoneOption = false;
            }
        }
Example #13
0
 public MultipurposeMember(MemberData target)
 {
     this.target = new MemberData(target);
     MemberDataUtility.UpdateMultipurposeMember(this);
 }
Example #14
0
        void InitMultipurposeMember(FieldInfo field)
        {
            MultipurposeMember member = field.GetValueOptimized(data.block) as MultipurposeMember;

            object[] fieldAttribute = field.GetCustomAttributes(true);
            if (!ReflectionUtils.TryCorrectingAttribute(data.block, ref fieldAttribute))
            {
                return;
            }
            if (member == null)
            {
                member = new MultipurposeMember();
                field.SetValueOptimized(data.block, member);
                Repaint();
            }
            if (member.target == null || member.target.isTargeted && member.target.IsTargetingPinOrNode)
            {
                var filter = ReflectionUtils.GetAttribute <FilterAttribute>(fieldAttribute) ?? new FilterAttribute()
                {
                    MaxMethodParam = int.MaxValue,
                };
                var port = AddPort(new PortData()
                {
                    getPortName    = () => field.Name,
                    getPortType    = () => typeof(MemberData),
                    getPortValue   = () => member.target,
                    filter         = filter,
                    onValueChanged = (obj) => {
                        var val = obj as MemberData;
                        RegisterUndo();
                        if (member.target.targetType != val.targetType || val.targetType != MemberData.TargetType.Values)
                        {
                            member.target = val;
                            owner.nodeView.MarkRepaint();
                            MemberDataUtility.UpdateMultipurposeMember(member);
                        }
                        else
                        {
                            member.target = val;
                        }
                        field.SetValueOptimized(data.block, member);
                        Repaint();
                    },
                });
                var control = port.portData.InstantiateControl(true);
                control.HideInstance(true);
                port.Add(new ControlView(control, true));
                //ControlConfig config = new ControlConfig() {
                //	owner = owner,
                //	value = member.target,
                //	type = typeof(MemberData),
                //	filter = filter,
                //	onValueChanged = (obj) => {
                //		var val = obj as MemberData;
                //		RegisterUndo();
                //		if(member.target.targetType != val.targetType || val.targetType != MemberData.TargetType.Values) {
                //			member.target = val;
                //			owner.MarkRepaint();
                //			uNodeEditorUtility.UpdateMultipurposeMember(member);
                //		} else {
                //			member.target = val;
                //		}
                //		field.SetValue(data.actionEvent, member);
                //		Repaint();
                //	},
                //};
                //MemberControl control = new MemberControl(config, true);
                //AddControl(field.Name, new ControlView(control, true));
            }
            if (member.target.isTargeted)
            {
                if (member.target.targetType != MemberData.TargetType.Values)
                {
                    if (!member.target.isStatic &&
                        (!member.target.IsTargetingUNode || !uNodePreference.GetPreference().hideUNodeInstance) &&
                        member.target.targetType != MemberData.TargetType.Type &&
                        member.target.targetType != MemberData.TargetType.Null)
                    {
                        MemberDataUtility.UpdateMemberInstance(member.target, member.target.startType);
                        var port = AddPort(new PortData()
                        {
                            portID         = "Instance",
                            getPortName    = () => "Instance",
                            getPortType    = () => member.target.startType,
                            getPortValue   = () => member.target?.instance,
                            filter         = new FilterAttribute(member.target.startType),
                            onValueChanged = (o) => {
                                RegisterUndo();
                                member.target.instance = o;
                                field.SetValueOptimized(data.block, member);
                            },
                        });
                        port.Add(new ControlView(port.portData.InstantiateControl(true), true));
                    }
                    else if (!uNodePreference.GetPreference().hideUNodeInstance&&
                             member.target.IsTargetingUNode && !member.target.IsTargetingNode)
                    {
                        MemberDataUtility.UpdateMemberInstance(member.target, member.target.startType);
                        var port = AddPort(new PortData()
                        {
                            portID         = "Instance",
                            getPortName    = () => "",
                            getPortType    = () => typeof(uNodeRoot),
                            getPortValue   = () => member.target?.instance,
                            filter         = new FilterAttribute(typeof(uNodeRoot)),
                            onValueChanged = (o) => {
                                RegisterUndo();
                                member.target.instance = o;
                                field.SetValueOptimized(data.block, member);
                            },
                        });
                        port.Add(new ControlView(port.portData.InstantiateControl(true), true));
                    }
                }
                if (member.target.SerializedItems?.Length > 0)
                {
                    MemberInfo[] members = null;
                    if (uNodePreference.GetPreference().inEditorDocumentation)
                    {
                        members = member.target.GetMembers(false);
                        if (members != null && members.Length > 0 && members.Length + 1 != member.target.SerializedItems.Length)
                        {
                            members = null;
                        }
                    }
                    uNodeFunction objRef = null;
                    switch (member.target.targetType)
                    {
                    case MemberData.TargetType.uNodeFunction: {
                        uNodeRoot root = member.target.GetInstance() as uNodeRoot;
                        if (root != null)
                        {
                            var gTypes = member.target.GenericTypes[0];
                            objRef = root.GetFunction(member.target.startName, gTypes != null ? gTypes.Length : 0, member.target.ParameterTypes[0]);
                        }
                        break;
                    }
                    }
                    int  totalParam = 0;
                    bool flag       = false;
                    for (int i = 0; i < member.target.SerializedItems.Length; i++)
                    {
                        if (i != 0)
                        {
                            if (members != null && (member.target.isDeepTarget || !member.target.IsTargetingUNode))
                            {
                                MemberInfo mData = members[i - 1];
                                if (mData is MethodInfo || mData is ConstructorInfo)
                                {
                                    var method     = mData as MethodInfo;
                                    var parameters = method != null?method.GetParameters() : (mData as ConstructorInfo).GetParameters();

                                    if (parameters.Length > 0)
                                    {
                                        totalParam++;
                                        if (totalParam > 1)
                                        {
                                            flag = true;
                                            break;
                                        }
                                    }
                                }
                            }
                        }
                    }
                    totalParam = 0;
                    int methodDrawCount = 1;
                    for (int i = 0; i < member.target.SerializedItems.Length; i++)
                    {
                        if (i != 0)
                        {
                            if (members != null && (member.target.isDeepTarget || !member.target.IsTargetingUNode))
                            {
                                MemberInfo memberInfo = members[i - 1];
                                if (memberInfo is MethodInfo || memberInfo is ConstructorInfo)
                                {
                                    var method        = memberInfo as MethodInfo;
                                    var documentation = XmlDoc.XMLFromMember(memberInfo);
                                    if (flag)
                                    {
                                        AddControl(memberInfo.Name, null);
                                    }
                                    var parameters = method != null?method.GetParameters() : (memberInfo as ConstructorInfo).GetParameters();

                                    if (parameters.Length > 0)
                                    {
                                        while (parameters.Length + totalParam > member.parameters.Length)
                                        {
                                            ArrayUtility.Add(ref member.parameters, MemberData.empty);
                                        }
                                        for (int x = 0; x < parameters.Length; x++)
                                        {
                                            var parameter = parameters[x];
                                            if (parameter.ParameterType != null)
                                            {
                                                int index = totalParam;
                                                var param = member.parameters[index];
                                                var port  = AddPort(new PortData()
                                                {
                                                    getPortName    = () => ObjectNames.NicifyVariableName(parameter.Name),
                                                    getPortType    = () => parameter.ParameterType,
                                                    getPortValue   = () => param,
                                                    filter         = new FilterAttribute(parameter.ParameterType),
                                                    onValueChanged = (obj) => {
                                                        RegisterUndo();
                                                        param = obj as MemberData;
                                                        member.parameters[index] = param;
                                                        field.SetValueOptimized(data.block, member);
                                                        Repaint();
                                                    },
                                                });
                                                port.Add(new ControlView(port.portData.InstantiateControl(true), true));
                                            }
                                            totalParam++;
                                        }
                                        continue;
                                    }
                                }
                            }
                        }
                        System.Type[] paramsType = member.target.ParameterTypes[i];
                        if (paramsType != null && paramsType.Length > 0)
                        {
                            if (flag)
                            {
                                AddControl("Method " + (methodDrawCount), null);
                                methodDrawCount++;
                            }
                            while (paramsType.Length + totalParam > member.parameters.Length)
                            {
                                ArrayUtility.Add(ref member.parameters, MemberData.none);
                            }
                            for (int x = 0; x < paramsType.Length; x++)
                            {
                                System.Type PType = paramsType[x];
                                if (member.parameters[totalParam] == null)
                                {
                                    member.parameters[totalParam] = MemberData.none;
                                }
                                if (PType != null)
                                {
                                    int    index = totalParam;
                                    var    param = member.parameters[index];
                                    string pLabel;
                                    if (objRef != null)
                                    {
                                        pLabel = objRef.parameters[x].name;
                                    }
                                    else
                                    {
                                        pLabel = "P" + (x + 1);
                                    }
                                    var port = AddPort(new PortData()
                                    {
                                        getPortName    = () => ObjectNames.NicifyVariableName(pLabel),
                                        getPortType    = () => PType,
                                        getPortValue   = () => param,
                                        filter         = new FilterAttribute(PType),
                                        onValueChanged = (obj) => {
                                            RegisterUndo();
                                            param = obj as MemberData;
                                            member.parameters[index] = param;
                                            field.SetValueOptimized(data.block, member);
                                            Repaint();
                                        },
                                    });
                                    port.Add(new ControlView(port.portData.InstantiateControl(true), true));
                                }
                                totalParam++;
                            }
                        }
                    }
                    while (member.parameters.Length > totalParam)
                    {
                        ArrayUtility.RemoveAt(ref member.parameters, member.parameters.Length - 1);
                    }
                }
            }
        }
Example #15
0
        public override void OnClick(Node source, PortCommandData data, Vector2 mousePosition)
        {
            Type            type   = data.portType;
            FilterAttribute filter = new FilterAttribute {
                VoidType          = true,
                MaxMethodParam    = int.MaxValue,
                Public            = true,
                Instance          = true,
                Static            = false,
                UnityReference    = false,
                InvalidTargetType = MemberData.TargetType.Null | MemberData.TargetType.Values,
                // DisplayDefaultStaticType = false
                ValidateMember = (member) => {
                    if (member is System.Reflection.MethodInfo)
                    {
                        var parameters = (member as System.Reflection.MethodInfo).GetParameters();
                        for (int i = 0; i < parameters.Length; i++)
                        {
                            if (type.IsCastableTo(parameters[i].ParameterType))
                            {
                                return(true);
                            }
                        }
                    }
                    return(false);
                },
            };
            List <ItemSelector.CustomItem> customItems;

            if (type is RuntimeType)
            {
                customItems = ItemSelector.MakeCustomItems((type as RuntimeType).GetRuntimeMembers(), filter);
                if (type.BaseType != null)
                {
                    customItems.AddRange(ItemSelector.MakeCustomItems(type.BaseType, filter, "Inherit Member"));
                }
            }
            else
            {
                customItems = ItemSelector.MakeCustomItems(type, filter);
            }
            var usingNamespaces = source.owner.GetNamespaces().ToHashSet();

            if (usingNamespaces != null && usingNamespaces.Count > 0)
            {
                customItems.AddRange(ItemSelector.MakeExtensionItems(type, usingNamespaces, filter, "Extensions"));
            }
            {            //Custom input port items.
                if (customItems == null)
                {
                    customItems = new System.Collections.Generic.List <ItemSelector.CustomItem>();
                }
                var customInputItems = NodeEditorUtility.FindCustomInputPortItems();
                if (customInputItems != null && customInputItems.Count > 0)
                {
                    var mData = data.getConnection();
                    foreach (var c in customInputItems)
                    {
                        c.graph = graph;
                        c.mousePositionOnCanvas = mousePositionOnCanvas;
                        if (c.IsValidPort(type, PortAccessibility.OnlyGet))
                        {
                            var items = c.GetItems(source, mData, type);
                            if (items != null)
                            {
                                customItems.AddRange(items);
                            }
                        }
                    }
                }
            }
            if (customItems != null)
            {
                filter.Static = true;
                customItems.Sort((x, y) => {
                    if (x.category != y.category)
                    {
                        return(string.Compare(x.category, y.category));
                    }
                    return(string.Compare(x.name, y.name));
                });
                ItemSelector w = ItemSelector.ShowWindow(source, MemberData.none, filter, (MemberData mData) => {
                    bool flag = mData.targetType == MemberData.TargetType.Method && !type.IsCastableTo(mData.startType);
                    if (!flag && !mData.isStatic)
                    {
                        mData.instance = data.getConnection();
                    }
                    NodeEditorUtility.AddNewNode(graph.editorData, null, null, mousePositionOnCanvas, (MultipurposeNode nod) => {
                        if (nod.target == null)
                        {
                            nod.target = new MultipurposeMember();
                        }
                        nod.target.target = mData;
                        MemberDataUtility.UpdateMultipurposeMember(nod.target);
                        if (flag)
                        {
                            var pTypes = mData.ParameterTypes;
                            if (pTypes != null)
                            {
                                int paramIndex   = 0;
                                MemberData param = null;
                                for (int i = 0; i < pTypes.Length; i++)
                                {
                                    var types = pTypes[i];
                                    if (types != null)
                                    {
                                        for (int y = 0; y < types.Length; y++)
                                        {
                                            if (type.IsCastableTo(types[y]))
                                            {
                                                param = data.getConnection();
                                                break;
                                            }
                                            paramIndex++;
                                        }
                                        if (param != null)
                                        {
                                            break;
                                        }
                                    }
                                }
                                if (nod.target.parameters.Length > paramIndex && param != null)
                                {
                                    nod.target.parameters[paramIndex] = param;
                                }
                            }
                        }
                        graph.Refresh();
                    });
                }, customItems).ChangePosition(GUIUtility.GUIToScreenPoint(mousePosition));
                w.displayRecentItem = false;
                w.displayNoneOption = false;
            }
        }