Esempio n. 1
0
 public MultipurposeMember(MultipurposeMember member)
 {
     if (member == null)
     {
         return;
     }
     target     = new MemberData(member.target);
     parameters = new MemberData[member.parameters.Length];
     for (int i = 0; i < parameters.Length; i++)
     {
         parameters[i] = new MemberData(member.parameters[i]);
     }
     initializer = SerializerUtility.Duplicate(member.initializer);
 }
Esempio n. 2
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);
                    }
                }
            }
        }