Ejemplo n.º 1
0
        public bool Member(EditorMember member, Attribute[] attributes, bool ignoreComposition)
        {
            var memberDrawer = MemberDrawersHandler.GetMemberDrawer(member, attributes);

            memberDrawer.Initialize(member, attributes, this);
            return(Member(member, attributes, memberDrawer, ignoreComposition));
        }
Ejemplo n.º 2
0
        private EditorMember(MemberInfo memberInfo, Type memberType, string memberName,
                             object rawTarget, UnityObject unityTarget, int targetId, Attribute[] attributes)
        {
            if (attributes == null)
            {
                attributes = Empty;
            }
            else
            {
                ResolveUsing(ref attributes);
            }

            Info         = memberInfo;
            Type         = memberType;
            RawTarget    = rawTarget;
            TypeNiceName = memberType.GetNiceName();
            Name         = memberName;
            NiceName     = Formatters[@"\$nicename"].Invoke(this);
            UnityTarget  = unityTarget;
            Attributes   = attributes;

            string displayFormat = null;

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

            if (displayAttr != null && MemberDrawersHandler.IsApplicableAttribute(memberType, displayAttr, attributes))
            {
                displayFormat = displayAttr.FormatLabel;
            }

            if (displayFormat == null)
            {
                if (Type.IsImplementerOfRawGeneric(typeof(IDictionary <,>)))
                {
                    displayFormat = VFWSettings.DefaultDictionaryFormat;
                }
                else if (Type.IsImplementerOfRawGeneric(typeof(IList <>)))
                {
                    displayFormat = VFWSettings.DefaultSequenceFormat;
                }
                else
                {
                    displayFormat = VFWSettings.DefaultMemberFormat;
                }
            }

            var iter = Formatters.GetEnumerator();

            while (iter.MoveNext())
            {
                var pair    = iter.Current;
                var pattern = pair.Key;
                var result  = pair.Value(this);
                displayFormat = Regex.Replace(displayFormat, pattern, result, RegexOptions.IgnoreCase);
            }

            DisplayText = displayFormat;

            Id = RuntimeHelper.CombineHashCodes(targetId, TypeNiceName, DisplayText);
        }
Ejemplo n.º 3
0
        public BaseDrawer Initialize(EditorMember member, Attribute[] attributes, BaseGUI gui)
        {
            if (attributes == null)
            {
                attributes = Empty;
            }

            this.member     = member;
            this.attributes = attributes;
            this.gui        = gui;

            if (_dynamicFormatter != null)
            {
                _formatArgs[0] = member.Value;
                displayText    = _dynamicFormatter(rawTarget, _formatArgs);
            }

            if (_hasInit)
            {
#if DBG
                Log(this + " is Already initialized");
#endif
                return(this);
            }
#if DBG
            Log("Initializing: " + this);
#endif
            var displayAttr = attributes.GetAttribute <DisplayAttribute>();
            if (displayAttr != null && MemberDrawersHandler.IsApplicableAttribute(memberType, displayAttr, attributes))
            {
                var hasCustomFormat = !string.IsNullOrEmpty(displayAttr.FormatMethod);
                var formatMethod    = hasCustomFormat ? displayAttr.FormatMethod : ("Format" + member.Name);
                var method          = targetType.GetMemberFromAll(formatMethod, Flags.StaticInstanceAnyVisibility) as MethodInfo;
                if (method == null)
                {
                    if (hasCustomFormat)
                    {
                        Debug.Log("Couldn't find format method: " + displayAttr.FormatMethod);
                    }
                }
                else
                {
                    if (method.ReturnType != typeof(string) && method.GetParameters().Length > 0)
                    {
                        Debug.Log("Format Method should return a string and take no parameters: " + method);
                    }
                    else
                    {
                        _dynamicFormatter = method.DelegateForCall <object, string>();
                        _formatArgs[0]    = member.Value;
                        displayText       = _dynamicFormatter(rawTarget, _formatArgs);
                    }
                }
            }

            _hasInit = true;
            InternalInitialize();
            Initialize();
            return(this);
        }
Ejemplo n.º 4
0
        public bool Member(MemberInfo member, object rawTarget, UnityObject unityTarget, int id, bool ignoreComposition, out EditorMember wrappedMember)
        {
            if (member.MemberType == MemberTypes.Method)
            {
                var method       = member as MethodInfo;
                var methodKey    = Cache.GetMethodKey(Tuple.Create(id, method));
                var methodDrawer = MemberDrawersHandler.GetMethodDrawer(methodKey);
                methodDrawer.Initialize(method, rawTarget, unityTarget, methodKey, this);
                wrappedMember = null;
                return(methodDrawer.OnGUI());
            }
            else
            {
                var cachedMember = Cache.GetMember(Tuple.Create(member, id));
                cachedMember.RawTarget   = rawTarget;
                cachedMember.UnityTarget = unityTarget;
                wrappedMember            = cachedMember;

                return(Member(cachedMember, ignoreComposition));
            }
        }
Ejemplo n.º 5
0
        public override void OnGUI()
        {
            using (gui.Horizontal())
            {
                if (_autoAlloc && memberValue == null)
                {
                    if (memberType.IsA <UnityObject>())
                    {
                        Debug.Log("Cannot automatically allocate memory for UnityObject member: " + member.NiceName);
                    }
                    else if (memberType.IsAbstract)
                    {
                        Debug.Log("Cannot automatically allocate memory for abstract member: " + member.NiceName);
                    }
                    else
                    {
                        memberValue = memberType.ActivatorInstance();
                    }
                }

                var isEmpty  = string.IsNullOrEmpty(displayText);
                var label    = isEmpty ? string.Empty : displayText + " " + (foldout ? "^" : ">");
                var value    = member.Value;
                var unityObj = value as UnityObject;

                string field;
                if (value == null)
                {
                    field = _nullString;
                }
                else
                {
                    field = (_isToStringImpl || unityObj != null) ? value.ToString() : value.GetType().GetNiceName();
                }

                if (isEmpty)
                {
                    Foldout();
                }

                var e = Event.current;

                gui.Prefix(label);

                var labelRect = gui.LastRect;

                gui.Cursor(labelRect, MouseCursor.Link);
                if (!isEmpty && e.IsMouseContained(labelRect) && e.IsLMBDown())
                {
                    foldout = !foldout;
                }

                gui.Space(2.3f);

                if (unityObj != null)
                {
                    var icon = AssetPreview.GetMiniThumbnail(unityObj);
                    gui.Label(new GUIContent(field, icon), GUIStyles.ObjectField);
                }
                else
                {
                    gui.Label(field, GUIStyles.ObjectField);
                }

                var totalRect = gui.LastRect;
                var fieldRect = totalRect;
                fieldRect.width -= 15f;

                if (unityObj != null)
                {
                    gui.Cursor(fieldRect, MouseCursor.Zoom);
                    if (fieldRect.Contains(e.mousePosition))
                    {
                        if (e.IsLMBDown())
                        {
                            EditorHelper.PingObject(unityObj);
                            if (e.IsDoubleClick())
                            {
                                EditorHelper.SelectObject(unityObj);
                            }
                            e.Use();
                        }
                        else if (e.IsRMBDown())
                        {
                            var mb = unityObj as MonoBehaviour;
                            if (mb != null)
                            {
                                var monoscript = MonoScript.FromMonoBehaviour(mb);
                                var scriptPath = AssetDatabase.GetAssetPath(monoscript);
                                UnityEditorInternal.InternalEditorUtility.OpenFileAtLineExternal(scriptPath, 0);
                            }
                        }
                    }
                }

                var drop = gui.RegisterFieldForDrop <UnityObject>(fieldRect, _getDraggedObject, _isDropAccepted);
                if (drop != null)
                {
                    memberValue = drop;
                    GUI.changed = true;
                }

                var thumbRect = totalRect;
                thumbRect.width -= fieldRect.width;
                thumbRect.x     += fieldRect.width;

                gui.Cursor(thumbRect, MouseCursor.Link);

                // Selection/thumb button
                {
                    if (e.IsMouseContained(thumbRect) && e.IsMouseDown())
                    {
                        if (e.IsLMB())
                        {
                            if (_disablePicker)
                            {
                                memberValue = memberType.ActivatorInstance();
                            }
                            else
                            {
                                SelectionWindow.Show("Select a `" + memberTypeName + "` object", _tabs);
                            }
                        }
                        else if (e.IsRMB())
                        {
                            try
                            {
                                memberValue = memberType.ActivatorInstance();
                            }
                            catch (Exception ex)
                            {
                                Debug.Log("Error creating new instance of type `{0}`: {1}".FormatWith(memberType.GetNiceName(), ex.Message));
                            }
                        }
                    }
                }
            }

            if (!foldout)
            {
                return;
            }

            if (member.IsNull())
            {
                gui.HelpBox("Member value is null");
                return;
            }

            if (_polymorphicType == null || _polymorphicType == memberType)
            {
                object value = member.Value;
                DrawRecursive(ref value, gui, id, unityTarget);
                member.Value = value;
            }
            else
            {
                var drawer     = MemberDrawersHandler.CachedGetObjectDrawer(_polymorphicType);
                var drawerType = drawer.GetType();
                if (drawerType == typeof(RecursiveDrawer) || drawerType == typeof(UnityObjectDrawer))
                {
                    object value = member.Value;
                    DrawRecursive(ref value, gui, id, unityTarget);
                    member.Value = value;
                }
                else
                {
                    drawer.Initialize(member, attributes, gui, prefs);
                    gui.Member(member, attributes, drawer, false);
                }
            }
        }
Ejemplo n.º 6
0
        public bool Member(EditorMember member, Attribute[] attributes, BaseDrawer memberDrawer, bool ignoreComposition)
        {
            List <BaseDrawer> composites = null;

            if (!ignoreComposition)
            {
                composites = MemberDrawersHandler.GetCompositeDrawers(member, attributes, this);
            }

            #if DBG
            Label(member.Id);
            Debug.Log("Got drawer " + memberDrawer.GetType().Name + " for member " + member.Name + " Key: " + handlerKey);
            #endif

            if (composites == null || composites.Count == 0)
            {
                #if PROFILE
                Profiler.BeginSample(memberDrawer.GetType().Name + " OnGUI (C)");
                #endif

                BeginCheck();
                {
                    memberDrawer.OnGUI();
                }
                #if PROFILE
                Profiler.EndSample();
                #endif
                return(HasChanged());
            }

            for (int i = 0; i < composites.Count; i++)
            {
                composites[i].Initialize(member, attributes, this);
            }

            bool changed = false;

            #if PROFILE
            Profiler.BeginSample("OnUpperGUI " + member.Name);
            #endif
            for (int i = 0; i < composites.Count; i++)
            {
                composites[i].OnUpperGUI();
            }
            #if PROFILE
            Profiler.EndSample();
            #endif
            using (Horizontal())
            {
                #if PROFILE
                Profiler.BeginSample("OnLeftGUI " + member.Name);
                #endif
                for (int i = 0; i < composites.Count; i++)
                {
                    composites[i].OnLeftGUI();
                }
                #if PROFILE
                Profiler.EndSample();
                #endif
                using (Vertical())
                {
                    #if PROFILE
                    Profiler.BeginSample(memberDrawer.GetType().Name + " OnGUI");
                    #endif
                    BeginCheck();
                    {
                        memberDrawer.OnGUI();
                    }
                    #if PROFILE
                    Profiler.EndSample();
                    #endif
                    changed = HasChanged();

                    #if PROFILE
                    Profiler.BeginSample("OnMemberDrawn" + member.Name);
                    #endif
                    for (int i = 0; i < composites.Count; i++)
                    {
                        composites[i].OnMemberDrawn(LastRect);
                    }
                    #if PROFILE
                    Profiler.EndSample();
                    #endif
                }

                #if PROFILE
                Profiler.BeginSample("OnRightGUI " + member.Name);
                #endif
                for (int i = 0; i < composites.Count; i++)
                {
                    composites[i].OnRightGUI();
                }
                #if PROFILE
                Profiler.EndSample();
                #endif
            }

            #if PROFILE
            Profiler.BeginSample("OnLowerGUI " + member.Name);
            #endif
            for (int i = 0; i < composites.Count; i++)
            {
                composites[i].OnLowerGUI();
            }
            #if PROFILE
            Profiler.EndSample();
            #endif
            return(changed);
        }