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); }
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); } } } }