コード例 #1
0
        public void UpdateControl()
        {
            if (control != null)
            {
                control.RemoveFromHierarchy();
                control      = null;
                showInstance = false;
            }
            Type targetType = member.type;

            if (member.isTargeted)
            {
                tooltip = member.Tooltip;
            }
            if (member.targetType == MemberData.TargetType.Values && targetType != null)
            {
                Type portType = targetType;
                // var mVal = member.Get();
                // if(mVal != null && !mVal.GetType().IsCastableTo(portType)) {
                //  portType = mVal.GetType();
                // }
                var           controlAtts = UIElementUtility.FindControlsField();
                ControlConfig config      = new ControlConfig()
                {
                    owner          = this.config.owner,
                    value          = member.Get(),
                    filter         = this.config.filter,
                    type           = portType,
                    onValueChanged = (val) => {
                        this.config.OnValueChanged(MemberData.CreateFromValue(val, member.type));
                        MarkDirtyRepaint();
                    },
                };
                if (config.value == null && config.type.IsValueType)
                {
                    //Ensure to initialize value for value type since value type cannot be null
                    config.value = ReflectionUtils.CreateInstance(config.type);
                    member.CopyFrom(MemberData.CreateFromValue(config.value));
                }
                control = UIElementUtility.CreateControl(portType, config, ClassListContains("Layout"));
                if (control is ObjectControl && config.value as uNodeRoot == config.owner.targetNode.owner)
                {
                    control = new DefaultControl(config, ClassListContains("Layout"));
                }
                if (control is StringControl && ClassListContains("multiline"))
                {
                    (control as StringControl).field.multiline = true;
                }
                if (popupElement != null && popupElement.visible)
                {
                    popupElement.visible = false;
                    popupElement.RemoveFromHierarchy();
                }
            }
            else if (!member.IsTargetingUNode && !member.isStatic && !hideInstance && member.startType != null)
            {
                if (config.filter == null)
                {
                    config.filter = new FilterAttribute();
                }
                FilterAttribute filter = config.filter;
                if (filter.UnityReference && !filter.OnlyGetType && !member.targetType.HasFlags(
                        MemberData.TargetType.Values |
                        MemberData.TargetType.Type |
                        MemberData.TargetType.Null |
                        MemberData.TargetType.uNodeGenericParameter) && member.instance as UnityEngine.Object != config.owner.targetNode.owner)
                {
                    Type portType = member.startType;
                    if (member.instance is MemberData)
                    {
                        portType = typeof(MemberData);
                    }
                    var           controlAtts = UIElementUtility.FindControlsField();
                    ControlConfig config      = new ControlConfig()
                    {
                        owner          = this.config.owner,
                        value          = member.instance,
                        filter         = new FilterAttribute(member.startType),
                        type           = member.startType,
                        onValueChanged = (val) => {
                            bool flag3 = false;
                            if (member.instance != null && !member.instance.GetType().IsCastableTo(portType))
                            {
                                flag3 = true;
                            }
                            member.instance = val;
                            this.config.OnValueChanged(member);
                            MarkDirtyRepaint();
                            if (flag3)
                            {
                                UpdateControl();
                            }
                        },
                    };
                    control = UIElementUtility.CreateControl(portType, config, ClassListContains("Layout"));
                    if (control is ObjectControl)
                    {
                        var objectControl = control as ObjectControl;
                        if (config.value != null && !config.value.GetType().IsCastableTo(portType))
                        {
                            objectControl.style.backgroundColor = Color.red;
                        }
                        objectControl.AddManipulator(new ContextualMenuManipulator(evt => {
                            object instance = member.instance;
                            if (instance != null)
                            {
                                if (instance as GameObject)
                                {
                                    var go            = instance as GameObject;
                                    Component[] comps = go.GetComponents <Component>();
                                    evt.menu.AppendAction("0-" + typeof(GameObject).Name, (act) => {
                                        objectControl.config.OnValueChanged(go);
                                        UpdateControl();
                                    }, DropdownMenuAction.AlwaysEnabled);
                                    for (int x = 0; x < comps.Length; x++)
                                    {
                                        Component com = comps[x];
                                        evt.menu.AppendAction((x + 1) + "-" + com.GetType().Name, (act) => {
                                            objectControl.config.OnValueChanged(com);
                                            UpdateControl();
                                        }, DropdownMenuAction.AlwaysEnabled);
                                    }
                                }
                                else if (instance as Component)
                                {
                                    var component     = instance as Component;
                                    Component[] comps = component.GetComponents <Component>();
                                    evt.menu.AppendAction("0-" + typeof(GameObject).Name, (act) => {
                                        objectControl.config.OnValueChanged(new MemberData(component.gameObject));
                                        UpdateControl();
                                    }, DropdownMenuAction.AlwaysEnabled);
                                    for (int x = 0; x < comps.Length; x++)
                                    {
                                        Component com = comps[x];
                                        evt.menu.AppendAction((x + 1) + "-" + com.GetType().Name, (act) => {
                                            objectControl.config.OnValueChanged(com);
                                            UpdateControl();
                                        }, DropdownMenuAction.AlwaysEnabled);
                                    }
                                }
                            }
                            evt.menu.AppendSeparator("");
                            if (config.owner.targetNode != null)
                            {
                                uNodeRoot UNR = config.owner.targetNode.owner;
                                if (UNR != null)
                                {
                                    GameObject go     = UNR.gameObject;
                                    Component[] comps = go.GetComponents <Component>();
                                    evt.menu.AppendAction("this uNode/0-" + typeof(GameObject).Name, (act) => {
                                        objectControl.config.OnValueChanged(go);
                                        UpdateControl();
                                    }, DropdownMenuAction.AlwaysEnabled);
                                    for (int x = 0; x < comps.Length; x++)
                                    {
                                        Component com = comps[x];
                                        evt.menu.AppendAction("this uNode/" + x + "-" + com.GetType().Name, (act) => {
                                            objectControl.config.OnValueChanged(com);
                                            UpdateControl();
                                        }, DropdownMenuAction.AlwaysEnabled);
                                    }
                                }
                            }
                            evt.menu.AppendAction("Reset", (act) => {
                                objectControl.config.OnValueChanged(null);
                                UpdateControl();
                            }, DropdownMenuAction.AlwaysEnabled);
                        }));
                    }
                    showInstance = true;
                }
            }
            if (popupElement != null)
            {
                if (!popupElement.visible && (control == null || showInstance || config.filter == null || config.filter.ValidTargetType != MemberData.TargetType.Values))
                {
                    UpdatePopupLabel();
                    popupElement.visible = true;
                    Add(popupElement);
                }
                popupElement.MarkDirtyRepaint();
            }
            if (control != null)
            {
                control.RemoveFromHierarchy();
                Insert(0, control);
            }
        }
コード例 #2
0
        public void AddControl(Direction direction, ValueControl visualElement)
        {
            var control = new ControlView(visualElement);

            AddControl(direction, control);
        }