Example #1
0
        public override void OnGUI()
        {
            using (gui.Horizontal())
            {
                bool isNull        = member.IsNull();
                bool isObjectField = prefs.Bools.ValueOrDefault(id);

                gui.Text(displayText, isNull ? "null" : memberValue.name + " (" + memberTypeName + ")");

                var fieldRect = gui.LastRect;
                {
                    GUIHelper.PingField(fieldRect, memberValue, !isNull && isObjectField);
                }

                if (gui.SelectionButton("object"))
                {
                    Func <UnityObject[], string, Tab> newTab = (values, title) =>
                                                               new Tab <UnityObject>(
                        @getValues: () => values,
                        @getCurrent: member.As <UnityObject>,
                        @setTarget: member.Set,
                        @getValueName: obj => obj.name,
                        @title: title
                        );

                    bool isGo = memberType == typeof(GameObject);
                    SelectionWindow.Show("Select a " + memberTypeName,
                                         newTab(UnityObject.FindObjectsOfType(memberType), "All"),
                                         newTab(isGo ?  (UnityObject[])gameObject.GetChildren() :
                                                gameObject.GetComponentsInChildren(memberType), "Children"),
                                         newTab(isGo ?  (UnityObject[])gameObject.GetParents() :
                                                gameObject.GetComponentsInParent(memberType), "Parents"),
                                         newTab(isGo ? PrefabHelper.GetGameObjectPrefabs().ToArray() :
                                                PrefabHelper.GetComponentPrefabs(memberType).Cast <UnityObject>().ToArray(), "Prefabs")
                                         );
                }
            }
        }
Example #2
0
        protected override void Initialize()
        {
            _nullString = string.Format("null ({0})", memberTypeName);

            if (memberValue != null)
            {
                _polymorphicType = memberValue.GetType();
                _isToStringImpl  = _polymorphicType.IsMethodImplemented("ToString", Type.EmptyTypes);
            }
            else
            {
                _isToStringImpl = memberType.IsMethodImplemented("ToString", Type.EmptyTypes);
            }

            _getDraggedObject = objs =>
            {
                for (int i = 0; i < objs.Length; i++)
                {
                    var drag = objs[i];
                    if (drag == null)
                    {
                        continue;
                    }

                    var go = drag as GameObject;
                    if (go != null)
                    {
                        if (!memberType.IsA <Component>())
                        {
                            continue;
                        }
                        var c = go.GetComponent(memberType);
                        if (c != null)
                        {
                            return(c);
                        }
                    }

                    if (drag.GetType().IsA(memberType))
                    {
                        return(drag);
                    }
                }
                return(null);
            };

            _isDropAccepted = objs => _getDraggedObject(objs) != null;

            _newTypeTab = (getValues, create, title) =>
                          new Tab <Type>(
                @getValues: getValues,
                @getCurrent: () => { var x = memberValue; return(x == null ? null : x.GetType()); },
                @setTarget: newType => { if (newType == null)
                                         {
                                             memberValue = memberType.GetDefaultValueEmptyIfString();
                                         }
                                         else
                                         {
                                             create(newType);
                                         } },
                @getValueName: type => type.GetNiceName(),
                @title: title
                );

            _newUnityTab = (getValues, title) =>
                           new Tab <UnityObject>(
                @getValues: getValues,
                @getCurrent: member.As <UnityObject>,
                @setTarget: member.Set,
                @getValueName: obj => obj.name + " (" + obj.GetType().GetNiceName() + ")",
                @title: title
                );

            int idx = 0;

            if (memberType.IsInterface)
            {
                _tabs = new Tab[4];

                _tabs[idx++] = _newUnityTab(() => UnityObject.FindObjectsOfType <UnityObject>()
                                            .OfType(memberType)
                                            .ToArray(), "Scene");

                _tabs[idx++] = _newUnityTab(() => PrefabHelper.GetComponentPrefabs(memberType)
                                            .ToArray(), "Prefab");

                _tabs[idx++] = _newTypeTab(() => ReflectionHelper.GetAllUserTypesOf(memberType)
                                           .Where(t => t.IsA <MonoBehaviour>() && !t.IsAbstract)
                                           .ToArray(), TryCreateInstanceInGO, "New Behaviour");
            }
            else
            {
                _tabs = new Tab[1];
            }

            var systemTypes = ReflectionHelper.GetAllUserTypesOf(memberType)
                              .Where(t => !t.IsA <UnityObject>() && !t.IsAbstract)
                              .ToArray();

            if (memberType.IsGenericType && !systemTypes.Contains(memberType))
            {
                ArrayUtility.Add(ref systemTypes, memberType);
            }

            _tabs[idx] = _newTypeTab(() => systemTypes, TryCreateInstance, "System Type");

            var display = attributes.GetAttribute <DisplayAttribute>();

            if (display != null)
            {
                _autoAlloc     = (display.ObjOpt & Obj.AutoAlloc) != 0;
                _disablePicker = (display.ObjOpt & Obj.DisablePicker) != 0;
            }
        }
Example #3
0
        protected virtual void SelectionButton()
        {
            var tabs = new List <Tab>();

            Action <Func <Type[]>, Action <Type>, string> newTypeTab = (getValues, create, title) =>
                                                                       tabs.Add(new Tab <Type>(
                                                                                    @getValues: getValues,
                                                                                    @getCurrent: () => { var x = memberValue; return(x == null ? null : x.GetType()); },
                                                                                    @setTarget: newType => { if (newType == null)
                                                                                                             {
                                                                                                                 memberValue = memberType.GetDefaultValueEmptyIfString();
                                                                                                             }
                                                                                                             else
                                                                                                             {
                                                                                                                 create(newType);
                                                                                                             } },
                                                                                    @getValueName: type => type.Name,
                                                                                    @title: title
                                                                                    ));

            if (memberType.IsInterface)
            {
                Action <Func <UnityObject[]>, string> newUnityTab = (getValues, title) =>
                                                                    tabs.Add(new Tab <UnityObject>(
                                                                                 @getValues: getValues,
                                                                                 @getCurrent: member.As <UnityObject>,
                                                                                 @setTarget: member.Set,
                                                                                 @getValueName: obj => obj.name + " (" + obj.GetType().Name + ")",
                                                                                 @title: title
                                                                                 ));

                newUnityTab(() => UnityObject.FindObjectsOfType <UnityObject>()
                            .OfType(memberType)
                            .ToArray(), "Scene");

                newUnityTab(() => PrefabHelper.GetComponentPrefabs(memberType)
                            .ToArray(), "Prefabs");

                newTypeTab(() => GetAllUserTypesOf(memberType)
                           .Where(t => t.IsA <MonoBehaviour>())
                           .Where(t => !t.IsAbstract)
                           .ToArray(), TryCreateInstanceInGO, "MonoBehaviours");
            }

            newTypeTab(() => GetAllUserTypesOf(memberType)
                       .Disinclude(memberType.IsAbstract ? memberType : null)
                       .Where(t => !t.IsA <UnityObject>() && !t.IsAbstract)
                       .ToArray(), TryCreateInstance, "System types");

            var click = Event.current.button;

            if (gui.SelectionButton("Left click: select type. Right click: try instantiate"))
            {
                if (click == 0)
                {
                    SelectionWindow.Show("Select a `" + memberTypeName + "` object", tabs.ToArray());
                }
                else if (click == 1)
                {
                    try
                    {
                        memberValue = memberType.ActivatorInstance();
                    }
                    catch (Exception e)
                    {
                        Debug.Log("Error. Couldn't create instance: " + e.Message);
                    }
                }
            }
        }
        protected virtual void SelectionButton()
        {
            if (childCount < 1)
            {
                using (gui.State(false))
                {
                    gui.SelectionButton("Object doesn't have any children/implementers");
                }
            }
            else
            {
                var tabs = new List <Tab>();

                Action <Func <Type[]>, Action <Type>, string> newTypeTab = (getValues, create, title) =>
                                                                           tabs.Add(new Tab <Type>(
                                                                                        @getValues: getValues,
                                                                                        @getCurrent: () => { var x = memberValue; return(x == null ? null : x.GetType()); },
                                                                                        @setTarget: newType => { if (newType == null)
                                                                                                                 {
                                                                                                                     memberValue = memberType.GetDefaultValueEmptyIfString();
                                                                                                                 }
                                                                                                                 else
                                                                                                                 {
                                                                                                                     create(newType);
                                                                                                                 } },
                                                                                        @getValueName: type => type.Name,
                                                                                        @title: title
                                                                                        ));

                if (memberType.IsInterface)
                {
                    Action <Func <UnityObject[]>, string> newUnityTab = (getValues, title) =>
                                                                        tabs.Add(new Tab <UnityObject>(
                                                                                     @getValues: getValues,
                                                                                     @getCurrent: member.As <UnityObject>,
                                                                                     @setTarget: member.Set,
                                                                                     @getValueName: obj => obj.name + " (" + obj.GetType().Name + ")",
                                                                                     @title: title
                                                                                     ));

                    newUnityTab(() => UnityObject.FindObjectsOfType <UnityObject>()
                                .OfType(memberType)
                                .ToArray(), "Scene");

                    newUnityTab(() => PrefabHelper.GetComponentPrefabs(memberType)
                                .ToArray(), "Prefabs");

                    newTypeTab(() => ReflectionHelper.GetAllUserTypesOf(memberType)
                               .Where(t => t.IsA <MonoBehaviour>())
                               .Where(t => !t.IsAbstract)
                               .ToArray(), TryCreateInstanceInGO, "MonoBehaviours");
                }

                newTypeTab(() => ReflectionHelper.GetAllUserTypesOf(memberType)
                           .Disinclude(memberType.IsAbstract ? memberType : null)
                           .Where(t => !t.IsA <UnityObject>() && !t.IsAbstract)
                           .ToArray(), TryCreateInstance, "System types");

                if (gui.SelectionButton())
                {
                    SelectionWindow.Show("Select a `" + memberTypeName + "` object", tabs.ToArray());
                }
            }
        }