Example #1
0
		public static BaseDrawer GetMemberDrawer(EditorMember member, Attribute[] attributes, bool ignoreAttributes)
		{
			BaseDrawer drawer;
			if (_cachedMemberDrawers.TryGetValue(member.Id, out drawer))
				return drawer;

            if (!ignoreAttributes)
            {
                var applied = GetAppliedAttributes(member.Type, attributes);
                if (applied != null)
                { 
                    var drawingAttribute = applied.GetAttribute<DrawnAttribute>();
                    if (drawingAttribute != null)
                        drawer = NewDrawer(drawingAttribute.GetType());
                }
            }

            if (drawer == null)
				drawer = NewObjectDrawer(member.Type);

            if (!drawer.CanHandle(member.Type))
            {
                Debug.LogError("Drawer `{0}` can't seem to handle type `{1}`. Make sure you're not applying attributes on the wrong members"
                    .FormatWith(drawer.GetType().GetNiceName(), member.TypeNiceName));

                drawer = Mapper.GetDrawer(member.Type);
            }

			_cachedMemberDrawers.Add(member.Id, drawer);

			return drawer;
		}
Example #2
0
        private EditorMember GetElement <T>(List <EditorMember> elements, List <T> source, int index, int id)
        {
            if (index >= elements.Count)
            {
                var element = EditorMember.WrapIListElement(
                    @elementName: string.Empty,
                    @elementType: typeof(T),
                    @elementId: RuntimeHelper.CombineHashCodes(id, index),
                    @attributes: attributes
                    );
                element.InitializeIList(source, index, rawTarget, unityTarget);
                elements.Add(element);
                return(element);
            }

            try
            {
                var e = elements[index];
                e.InitializeIList(source, index, rawTarget, unityTarget);
                return(e);
            }
            catch (ArgumentOutOfRangeException)
            {
                Log("DictionaryDrawer: Accessing element out of range. Index: {0} Count {1}. This shouldn't really happen. Please report it with information on how to replicate it".FormatWith(index, elements.Count));
                return(null);
            }
        }
Example #3
0
        private void SetupMembers(int idx, Type[] paramTypes)
        {
            if (idx < argMembersList.Count)
            {
                return;
            }

            int len = paramTypes.Length;

            var argMembers = new EditorMember[len];
            var argValues  = argValuesList[idx];

            argMembersList.Add(argMembers);

            for (int iLoop = 0; iLoop < len; iLoop++)
            {
                int i         = iLoop;
                var paramType = paramTypes[i];

                var argMember = EditorMember.WrapGetSet(
                    get: () => argValues[i],
                    set: x => argValues[i] = x,
                    rawTarget: argValues,
                    @unityTarget: unityTarget,
                    @name: string.Format("({0})", paramType.GetNiceName()),
                    @id: id + i,
                    @dataType: paramType,
                    @attributes: null
                    );

                argMembers[i] = argMember;
            }
        }
Example #4
0
 public bool Member(EditorMember member, Attribute[] attributes, bool ignoreComposition)
 {
     attributes = attributes ?? Empty;
     var memberDrawer = MemberDrawersHandler.GetMemberDrawer(member, attributes, ignoreComposition);
     memberDrawer.Initialize(member, attributes, this);
     return Member(member, attributes, memberDrawer, ignoreComposition);
 }
Example #5
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);
        }
        public static List<BaseDrawer> GetCompositeDrawers(EditorMember member, Attribute[] attributes)
        {
            List<BaseDrawer> drawers;
            if (_cachedCompositeDrawers.TryGetValue(member.Id, out drawers))
                return drawers;

            drawers = new List<BaseDrawer>();

            var applied = GetAppliedAttributes(member.Type, attributes);
            if (applied != null)
            {
                var compositeAttributes = applied.OfType<CompositeAttribute>()
                                                 .OrderBy(x => x.id)
                                                 .ToList();

                for (int i = 0; i < compositeAttributes.Count; i++)
                {
                    var drawer = NewCompositeDrawer(compositeAttributes[i].GetType());
                    if (!drawer.CanHandle(member.Type))
                    {
                        Debug.LogError("Drawer {0} can't seem to handle type {1}. Make sure you're not applying attributes on the wrong members"
                             .FormatWith(drawer.GetType().GetNiceName(), member.TypeNiceName));
                        continue;
                    }
                    drawers.Add(drawer);
                }
            }

            _cachedCompositeDrawers.Add(member.Id, drawers);
            return drawers;
        }
Example #7
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));
        }
Example #8
0
        public void Initialize(MethodInfo method, object rawTarget, UnityObject unityTarget, int id, BaseGUI gui)
        {
            this.gui       = gui;
            this.rawTarget = rawTarget;
            this.id        = id;

            if (initialized)
            {
                return;
            }
            initialized = true;

            var commentAttr = method.GetCustomAttribute <CommentAttribute>();

            if (commentAttr != null)
            {
                comment = commentAttr.comment;
            }

            niceName = method.GetNiceName();

            if (niceName.IsPrefix("dbg") || niceName.IsPrefix("Dbg"))
            {
                niceName = niceName.Remove(0, 3);
            }

            invoke = method.DelegateForCall();
            var argInfos = method.GetParameters();
            int len      = argInfos.Length;

            argValues  = new object[len];
            argKeys    = new int[len];
            argMembers = new EditorMember[len];

            for (int iLoop = 0; iLoop < len; iLoop++)
            {
                int i       = iLoop;
                var argInfo = argInfos[i];

                argKeys[i] = RuntimeHelper.CombineHashCodes(id, argInfo.ParameterType.Name + argInfo.Name);

                argValues[i] = TryLoad(argInfos[i].ParameterType, argKeys[i]);

                argMembers[i] = EditorMember.WrapGetSet(
                    @get: () => argValues[i],
                    @set: x => argValues[i] = x,
                    @rawTarget: rawTarget,
                    @unityTarget: unityTarget,
                    @attributes: argInfo.GetCustomAttributes(true) as Attribute[],
                    @name: argInfo.Name,
                    @id: argKeys[i],
                    @dataType: argInfo.ParameterType
                    );
            }

#if DBG
            Log("Method drawer init");
#endif
        }
Example #9
0
        public BaseDrawer Initialize(EditorMember member, Attribute[] attributes, BaseGUI gui, EditorRecord prefs)
        {
            if (attributes == null)
                attributes = Empty;

            if (this.prefs == null)
                this.prefs = prefs;

            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;
        }
Example #10
0
 protected override void Initialize()
 {
     base.Initialize();
     _internalName = FindRelativeMember("_internalName");
     Debug.Log(_internalName.Value);
     _editorData =
         Resources.FindObjectsOfTypeAll <CharacterEditorData>()
         .FirstOrDefault(data => data.InternalName.GenericEquals(_internalName.Value));
     Debug.Log(_editorData);
 }
Example #11
0
        protected override void Initialize()
        {
            // this is only necessary if Index2D was a class
            //if (memberValue == null)
            //    memberValue = new Index2D();

            // 'i' and 'j' could be fields or properties
            i = FindRelativeMember("i");
            j = FindRelativeMember("j");
        }
 protected override void Initialize()
 {
     nullableMember = EditorMember.WrapGetSet(
         @get: member.Get,
         @set: member.Set,
         @rawTarget: member.RawTarget,
         @unityTarget: unityTarget,
         @dataType: typeof(T),
         @name: displayText,
         @id: id,
         @attributes: attributes
         );
 }
Example #13
0
 protected override void OnSingleInitialization()
 {
     nullableMember = EditorMember.WrapGetSet(
         @get: member.Get,
         @set: member.Set,
         @rawTarget: member.RawTarget,
         @unityTarget: unityTarget,
         @dataType: typeof(T),
         @name: niceName,
         @id: id,
         @attributes: attributes
         );
 }
 protected override void OnSingleInitialization()
 {
     nullableMember = new ArgMember(
         @getter: member.Get,
         @setter: member.Set,
         @target: member.Target,
         @unityTarget: unityTarget,
         @dataType: typeof(T),
         @attributes: attributes,
         @name: niceName,
         @id: id
         );
 }
        protected override void OnSingleInitialization()
        {
            keyElements   = new List <ElementMember <TKey> >();
            valueElements = new List <ElementMember <TValue> >();
            addInfo       = new AddInfo();
            addKeyInfo    = new EditorMember(typeof(AddInfo).Field("key"), addInfo, unityTarget, id);
            addValueInfo  = new EditorMember(typeof(AddInfo).Field("value"), addInfo, unityTarget, id);

            perKeyDrawing   = attributes.AnyIs <PerKeyAttribute>();
            perValueDrawing = attributes.AnyIs <PerValueAttribute>();
            ignoreAddArea   = attributes.AnyIs <IgnoreAddAreaAttribute>();
            Readonly        = attributes.AnyIs <ReadonlyAttribute>();

            var formatMember = attributes.OfType <FormatMemberAttribute>().FirstOrDefault();

            if (formatMember == null || string.IsNullOrEmpty(formatMember.pattern))
            {
                dictionaryName  = niceName;
                dictionaryName += " (" + memberType.GetNiceName() + ")";
            }
            else
            {
                dictionaryName = formatMember.Format(niceName, memberType.GetNiceName());
            }

            var pairFormat = attributes.GetAttribute <FormatPairAttribute>();

            if (pairFormat != null)
            {
                if (!string.IsNullOrEmpty(pairFormat.Method))
                {
                    pairFormatMethod = rawTarget.GetType().DelegateForCallMethod(pairFormat.Method, Flags.InstanceAnyVisibility, typeof(TKey), typeof(TValue));
                }
                else if (!string.IsNullOrEmpty(pairFormat.Pattern))
                {
                    pairFormatPattern = pairFormat.Pattern;
                }
            }

            if (Readonly)
            {
                dictionaryName += " (Readonly)";
            }

                        #if DBG
            Log("Dictionary drawer Initialized (" + dictionaryName + ")");
                        #endif
        }
Example #16
0
        protected override void OnSingleInitialization()
        {
            adding     = new AddingData();
            kAdvanced  = RuntimeHelper.CombineHashCodes(id, "advanced");
            kAdd       = RuntimeHelper.CombineHashCodes(id, "add");
            kInvoke    = RuntimeHelper.CombineHashCodes(id, "invoke");
            kHeaderStr = string.Format("{0} ({1})", niceName, memberTypeName);

            if (memberValue == null)
            {
                memberValue = memberType.Instance <IBaseDelegate>();
            }

            int len = memberValue.ParamTypes.Length;

            argValues  = new object[len];
            argMembers = new EditorMember[len];

            for (int iLoop = 0; iLoop < len; iLoop++)
            {
                int i         = iLoop;
                var paramType = memberValue.ParamTypes[i];

                argValues[i] = paramType.GetDefaultValueEmptyIfString();

                var argMember = EditorMember.WrapGetSet(
                    @get: () => argValues[i],
                    @set: x => argValues[i] = x,
                    @rawTarget: argValues,
                    @unityTarget: unityTarget,
                    @name: string.Format("({0})", paramType.GetNiceName()),
                    @attributes: null,
                    @id: RuntimeHelper.CombineHashCodes(id, i),
                    @dataType: paramType
                    );

                argMember.RawTarget = rawTarget;
                argMembers[i]       = argMember;
            }

#if DBG
            Log("Delegate drawer init. " + niceName);
#endif
        }
Example #17
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);
            }
        }
Example #18
0
        public BaseDrawer Initialize(EditorMember member, Attribute[] attributes, BaseGUI gui)
        {
            this.member     = member;
            this.attributes = attributes;
            this.gui        = gui;

            if (initialized)
            {
#if DBG
                Log(this + " is Already initialized");
#endif
                return(this);
            }
#if DBG
            Log("Initializing: " + this);
#endif
            initialized = true;
            InternalInitialize();
            Initialize();
            return(this);
        }
Example #19
0
        private EditorMember GetElement(int index)
        {
            if (index >= _elements.Count)
            {
                var element = EditorMember.WrapIListElement(
                    @attributes: _perItemAttributes,
                    @elementName: string.Empty,
                    @elementType: typeof(TElement),
                    @elementId: RuntimeHelper.CombineHashCodes(id, index)
                    );

                element.InitializeIList(memberValue, index, rawTarget, unityTarget);
                _elements.Add(element);
                return(element);
            }

            var e = _elements[index];

            e.InitializeIList(memberValue, index, rawTarget, unityTarget);
            return(e);
        }
Example #20
0
		public BaseDrawer Initialize(EditorMember member, Attribute[] attributes, BaseGUI gui)
		{
			this.member     = member;
			this.attributes = attributes;
			this.gui        = gui;

			if (initialized)
			{
//#if DBG
//				Log(this + " is Already initialized");
//#endif
				OnMultipleInitialization();
				return this;
			}
#if DBG
			Log("Initializing: " + this);
#endif
			initialized = true;
			OnInternalInitialization();
			OnSingleInitialization();
			OnMultipleInitialization();
			return this;
		}
Example #21
0
        /// <summary>
        /// Fetches visible members in the inspected target object and assigns them to their corresponding categories
        /// </summary>
        private void Initialize()
        {
            OnBeforeInitialized();

            // fetch visible members
            _visibleMembers = VisibilityLogic.CachedGetVisibleMembers(targetType);

            var drawnByUnity = _visibleMembers
                .Where(x => x.IsDefined<DrawByUnityAttribute>() || DrawnByUnityTypes.Any(x.GetDataType().IsA));

            _visibleMembers = _visibleMembers.Except(drawnByUnity).ToList();

            _membersDrawnByUnityLayout = drawnByUnity.Select(x => x.Name).ToArray();

            // allocate categories
            _categories = new List<MembersCategory>();

            var multiple	= targetType.GetCustomAttribute<DefineCategoriesAttribute>(true);
            var definitions = targetType.GetCustomAttributes<DefineCategoryAttribute>(true);
            if (multiple != null)
                definitions = definitions.Concat(multiple.names.Select(n => new DefineCategoryAttribute(n, 1000)));

            Func<string, string[]> ParseCategoryPath = fullPath =>
            {
                int nPaths = fullPath.Split('/').Length;
                string[] result = new string[nPaths];
                for (int i = 0, index = -1; i < nPaths - 1; i++)
                {
                    index = fullPath.IndexOf('/', index + 1);
                    result[i] = fullPath.Substring(0, index);
                }
                result[nPaths - 1] = fullPath;
                return result;
            };

            // Order by exclusivity
            var defs = from d in definitions
                       let paths = ParseCategoryPath(d.FullPath)
                       orderby !d.Exclusive
                       select new { def = d, paths };

            // Parse paths and resolve definitions
            var resolver = new CategoryDefinitionResolver();
            var lookup = new Dictionary<string, MembersCategory>();
            foreach (var x in defs)
            {
                var paths = x.paths;
                var d = x.def;

                MembersCategory parent = null;

                for (int i = 0; i < paths.Length; i++)
                {
                    var path = paths[i];

                    var current = (parent == null ?  _categories :
                        parent.NestedCategories).FirstOrDefault(c => c.FullPath == path);

                    if (current == null)
                    {
                        current = new MembersCategory(path, d.Order, id);
                        if (i == 0)
                            _categories.Add(current);
                        if (parent != null)
                            parent.NestedCategories.Add(current);
                    }
                    lookup[path] = current;
                    parent = current;
                }

                var last = lookup[paths.Last()];
                last.ForceExpand = d.ForceExpand;
                last.AlwaysHideHeader = d.AlwaysHideHeader;
                resolver.Resolve(_visibleMembers, d).Foreach(last.Members.Add);

                lookup.Clear();
                parent.Members = parent.Members.OrderBy<MemberInfo, float>(VisibilityLogic.GetMemberDisplayOrder).ToList();
            }

            // filter out empty categories
            _categories = _categories.Where(x => x.NestedCategories.Count > 0 || x.Members.Count > 0)
                                     .OrderBy(x => x.DisplayOrder)
                                     .ToList();

            for (int i = 0; i < _categories.Count; i++)
            {
                var c = _categories[i];
                c.RemoveEmptyNestedCategories();
            }

            var getDisplayOptions = targetType.GetMethod("GetDisplayOptions");
            if (getDisplayOptions == null)
                throw new vMemberNotFound(targetType, "GetDisplayOptions");

            var vfwSettings = VFWSettings.GetInstance();

            // does target override GetDisplayOptions? if so set that as the default value,
            // otherwise whatever value is in our settings asset
            var defaultDisplay = (getDisplayOptions.DeclaringType == typeof(BetterBehaviour) ||
                                  getDisplayOptions.DeclaringType == typeof(BetterScriptableObject)) ?
                                  vfwSettings.DefaultDisplay : (CategoryDisplay)getDisplayOptions.Invoke(target);

            var displayKey = RuntimeHelper.CombineHashCodes(id, "display");
            var displayValue = prefs.Ints.ValueOrDefault(displayKey, (int)defaultDisplay);
            _display = displayValue == -1 ? vfwSettings.DefaultDisplay : (CategoryDisplay)displayValue;
            prefs.Ints[displayKey] = (int)_display;

            var spacingKey = RuntimeHelper.CombineHashCodes(id, "spacing");
            _spacing = prefs.Ints.ValueOrDefault(spacingKey, vfwSettings.DefaultSpacing);
            prefs.Ints[spacingKey] = _spacing;

            var field = targetType.GetMemberFromAll("_serializationData", Flags.InstancePrivate);
            if (field == null)
            {
                if (targetType.IsA<BetterBehaviour>() || targetType.IsA<BetterScriptableObject>())
                    throw new vMemberNotFound(targetType, "_serializationData");
            }
            else _serializationData = EditorMember.WrapMember(field, target, target, id);

            field = targetType.GetField("dbg", Flags.InstanceAnyVisibility);
            if (field == null)
                throw new vMemberNotFound(targetType, "dbg");

            _debug = EditorMember.WrapMember(field, target, target, id);

            OnAfterInitialized();
        }
Example #22
0
 public void MemberField(EditorMember member)
 {
     gui.Member(member, false);
 }
Example #23
0
 protected EditorMember FindRelativeMember(string memberName)
 {
     return(EditorMember.WrapMember(memberName, typeof(T), memberValue, unityTarget, id));
 }
Example #24
0
        public bool Member(EditorMember member, Attribute[] attributes, BaseDrawer memberDrawer, bool ignoreComposition)
        {
            List<BaseDrawer> composites = null;

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

            #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;
        }
Example #25
0
 public bool Member(EditorMember member, BaseDrawer memberDrawer)
 {
     return(Member(member, member.Attributes, memberDrawer, false));
 }
Example #26
0
 public bool Member(EditorMember member, BaseDrawer memberDrawer)
 {
     return Member(member, member.Attributes, memberDrawer, false);
 }
Example #27
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));
            }
        }
Example #28
0
 public bool Member(EditorMember member)
 {
     return Member(member, false);
 }
Example #29
0
 public bool Member(EditorMember member, bool ignoreComposition)
 {
     return Member(member, member.Attributes, ignoreComposition);
 }
Example #30
0
 public bool Member(EditorMember member, bool ignoreComposition)
 {
     return(Member(member, member.Attributes, ignoreComposition));
 }
Example #31
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);
        }
Example #32
0
 public void MemberField(EditorMember dm)
 {
     gui.Member(dm, false);
 }
Example #33
0
 public ACPValue(EditorMember member) : base(member)
 {
 }
Example #34
0
 public StringValue(EditorMember member) : base(member)
 {
 }
Example #35
0
 public HashValue(EditorMember member) : base(member)
 {
 }
Example #36
0
        private void Initialize()
        {
            OnBeforeInitialized();

            // Init members
            _visibleMembers = VFWVisibilityLogic.GetCachedVisibleMembers.Invoke(targetType).ToList();

            _categories = new List <MembersCategory>();

            Func <string, float, MembersCategory> newCategory = (path, order) =>
                                                                new MembersCategory(path, new List <MemberInfo>(), order, id, prefs);

            var resolver = new MembersResolution();

            var multiple    = targetType.GetCustomAttribute <DefineCategoriesAttribute>(true);
            var definitions = targetType.GetCustomAttributes <DefineCategoryAttribute>(true);

            if (multiple != null)
            {
                definitions = definitions.Concat(multiple.names.Select(n => new DefineCategoryAttribute(n, 1000)));
            }

            Func <string, string[]> ParseCategoryPath = fullPath =>
            {
                int      nPaths = fullPath.Split('/').Length;
                string[] result = new string[nPaths];
                for (int i = 0, index = -1; i < nPaths - 1; i++)
                {
                    index     = fullPath.IndexOf('/', index + 1);
                    result[i] = fullPath.Substring(0, index);
                }
                result[nPaths - 1] = fullPath;
                return(result);
            };

            // Order by exclusivity
            var defs = from d in definitions
                       let paths = ParseCategoryPath(d.FullPath)
                                   orderby !d.Exclusive
                                   select new { def = d, paths };

            Func <MemberInfo, float> getDisplayOrder = member =>
            {
                var attr = member.GetCustomAttribute <DisplayOrderAttribute>();
                return(attr == null ? -1 : attr.displayOrder);
            };

            // Parse paths and resolve definitions
            var lookup = new Dictionary <string, MembersCategory>();

            foreach (var x in defs)
            {
                var paths = x.paths;
                var d     = x.def;

                MembersCategory parent = null;

                for (int i = 0; i < paths.Length; i++)
                {
                    var p = paths[i];

                    var current = (parent == null ?
                                   _categories : parent.NestedCategories).FirstOrDefault(c => c.FullPath == p);

                    if (current == null)
                    {
                        current = newCategory(p, d.DisplayOrder);
                        if (i == 0)
                        {
                            _categories.Add(current);
                        }
                        if (parent != null)
                        {
                            parent.NestedCategories.Add(current);
                        }
                    }
                    lookup[p] = current;
                    parent    = current;
                }

                var last = lookup[paths.Last()];
                last.ForceExpand      = d.ForceExpand;
                last.AlwaysHideHeader = d.AlwaysHideHeader;
                resolver.Resolve(_visibleMembers, d).Foreach(last.AddMember);

                lookup.Clear();
                parent.Members = parent.Members.OrderBy(getDisplayOrder).ToList();
            }

            // filter out empty categories
            _categories = _categories.Where(x => x.NestedCategories.Count > 0 || x.Members.Count > 0)
                          .OrderBy(x => x.DisplayOrder)
                          .ToList();

            for (int i = 0; i < _categories.Count; i++)
            {
                var c = _categories[i];
                c.RemoveEmptyNestedCategories();
            }

            var displayKey   = RuntimeHelper.CombineHashCodes(id, "display");
            var displayValue = prefs.Ints.ValueOrDefault(displayKey, -1);
            var vfwSettings  = VFWSettings.GetInstance();

            _display = displayValue == -1 ? vfwSettings.DefaultDisplay : (MembersDisplay)displayValue;
            prefs.Ints[displayKey] = (int)_display;

            var spacingKey = RuntimeHelper.CombineHashCodes(id, "spacing");

            _spacing = prefs.Ints.ValueOrDefault(spacingKey, vfwSettings.DefaultSpacing);
            prefs.Ints[spacingKey] = _spacing;

            var field = targetType.GetAllMembers(typeof(MonoBehaviour), Flags.InstancePrivate)
                        .FirstOrDefault(m => m.Name == "_serializationData");

            if (field == null)
            {
                throw new MemberNotFoundException("_serializationData in " + targetType.Name);
            }

            _serializationData = EditorMember.WrapMember(field, target, target, id);

            field = targetType.GetField("dbg", Flags.InstanceAnyVisibility);
            if (field == null)
            {
                throw new MemberNotFoundException("dbg");
            }

            _debug = EditorMember.WrapMember(field, target, target, id);

            OnAfterInitialized();
        }
Example #37
0
        /// <summary>
        /// Fetches visible members in the inspected target object and assigns them to their corresponding categories
        /// </summary>
        private void Initialize()
        {
            OnBeforeInitialized();

            // fetch visible members
            _visibleMembers = VisibilityLogic.CachedGetVisibleMembers(targetType);

            var drawnByUnity = _visibleMembers
                               .Where(x => x.IsDefined <DrawByUnityAttribute>() || DrawnByUnityTypes.Any(x.GetDataType().IsA));

            _visibleMembers = _visibleMembers.Except(drawnByUnity).ToList();

            _membersDrawnByUnityLayout = drawnByUnity.Select(x => x.Name).ToArray();

            // allocate categories
            _categories = new List <MembersCategory>();

            var multiple    = targetType.GetCustomAttribute <DefineCategoriesAttribute>(true);
            var definitions = targetType.GetCustomAttributes <DefineCategoryAttribute>(true);

            if (multiple != null)
            {
                definitions = definitions.Concat(multiple.names.Select(n => new DefineCategoryAttribute(n, 1000)));
            }

            Func <string, string[]> ParseCategoryPath = fullPath =>
            {
                int      nPaths = fullPath.Split('/').Length;
                string[] result = new string[nPaths];
                for (int i = 0, index = -1; i < nPaths - 1; i++)
                {
                    index     = fullPath.IndexOf('/', index + 1);
                    result[i] = fullPath.Substring(0, index);
                }
                result[nPaths - 1] = fullPath;
                return(result);
            };

            // Order by exclusivity
            var defs = from d in definitions
                       let paths = ParseCategoryPath(d.FullPath)
                                   orderby !d.Exclusive
                                   select new { def = d, paths };

            // Parse paths and resolve definitions
            var resolver = new CategoryDefinitionResolver();
            var lookup   = new Dictionary <string, MembersCategory>();

            foreach (var x in defs)
            {
                var paths = x.paths;
                var d     = x.def;

                MembersCategory parent = null;

                for (int i = 0; i < paths.Length; i++)
                {
                    var path = paths[i];

                    var current = (parent == null ? _categories :
                                   parent.NestedCategories).FirstOrDefault(c => c.FullPath == path);

                    if (current == null)
                    {
                        current = new MembersCategory(path, d.Order, id, prefs);
                        if (i == 0)
                        {
                            _categories.Add(current);
                        }
                        if (parent != null)
                        {
                            parent.NestedCategories.Add(current);
                        }
                    }
                    lookup[path] = current;
                    parent       = current;
                }

                var last = lookup[paths.Last()];
                last.ForceExpand      = d.ForceExpand;
                last.AlwaysHideHeader = d.AlwaysHideHeader;
                resolver.Resolve(_visibleMembers, d).Foreach(last.Members.Add);

                lookup.Clear();
                parent.Members = parent.Members.OrderBy <MemberInfo, float>(VisibilityLogic.GetMemberDisplayOrder).ToList();
            }

            // filter out empty categories
            _categories = _categories.Where(x => x.NestedCategories.Count > 0 || x.Members.Count > 0)
                          .OrderBy(x => x.DisplayOrder)
                          .ToList();

            for (int i = 0; i < _categories.Count; i++)
            {
                var c = _categories[i];
                c.RemoveEmptyNestedCategories();
            }

            var getDisplayOptions = targetType.GetMethod("GetDisplayOptions");

            Assert.IsNotNull(getDisplayOptions);

            // otherwise whatever value is in our settings asset
            // TODO CHANGED: A common interface is now used for both cases.
            var defaultDisplay = typeof(IVFWObject).IsAssignableFrom(getDisplayOptions.DeclaringType) ?
                                 VFWSettings.DefaultDisplay : (CategoryDisplay)getDisplayOptions.Invoke(target);

            //var defaultDisplay = (getDisplayOptions.DeclaringType == typeof(BaseBehaviour) ||
            //                      getDisplayOptions.DeclaringType == typeof(BaseScriptableObject)) ?
            //                      VFWSettings.DefaultDisplay : (CategoryDisplay)getDisplayOptions.Invoke(target);

            int displayKey   = RuntimeHelper.CombineHashCodes(id, "display");
            int displayValue = prefs.ValueOrDefault(displayKey, (int)defaultDisplay);

            _display          = displayValue == -1 ? VFWSettings.DefaultDisplay : (CategoryDisplay)displayValue;
            prefs[displayKey] = (int)_display;

            var spacingKey = RuntimeHelper.CombineHashCodes(id, "spacing");

            _spacing          = prefs.ValueOrDefault(spacingKey, VFWSettings.DefaultSpacing);
            prefs[spacingKey] = _spacing;

            FieldInfo field;

            field = targetType.GetField("dbg", Flags.InstanceAnyVisibility);
            if (field == null)
            {
                ErrorHelper.MemberNotFound(targetType, "dbg");
            }

            _debug = EditorMember.WrapMember(field, target, target, id);

            OnAfterInitialized();
        }
Example #38
0
 public bool Member(EditorMember member)
 {
     return(Member(member, false));
 }
Example #39
0
        //static bool clearedCache;
        //static BetterEditor()
        //{
        //	//if (!clearedCache)
        //	{
        //		clearedCache = true;
        //		MemberDrawersHandler.Instance.ClearCache();
        //	}
        //}

        protected override void OnAwake()
        {
            OnAwakeAssertion();

            // Fetch visible members
            {
                Func <MemberInfo, VisibleMember> newMember = m => new VisibleMember(m, target, target, id);
                var allMembers = ReflectionUtil.GetMemoizedMembers(targetType);
                visibleMembers = SerializationLogic.Default.GetVisibleMembers(allMembers).Select(newMember).ToList();

                // Initialize view
                {
                    minimalView = targetType.IsDefined <MinimalViewAttribute>(true);
                    if (minimalView)
                    {
                        visibleMembers = visibleMembers.OrderBy(x => x.DisplayOrder).ToList();
                    }
                    else
                    {
                        baseCategories = new List <MemberCategory>();

                        Func <string, float, MemberCategory> newCategory = (path, order) =>
                                                                           new MemberCategory(path, new List <ICanBeDrawn>(), order, id, prefs);

                        var basic = targetType.GetCustomAttribute <BasicViewAttribute>(true);
                        if (basic != null)
                        {
                            var c = newCategory(string.Empty, 0f);
                            c.Indent     = false;
                            c.HideHeader = true;
                            visibleMembers.OrderBy(x => x.DisplayOrder).Foreach(c.AddMember);
                            baseCategories.Add(c);
                        }
                        else
                        {
                            // Create the intial input from the target's visible members
                            var input = new MemberGroup(visibleMembers, newMember);

                            // Create resolvers
                            var resolvers = new GroupResolver[]
                            {
                                new PatternResolver(), new MemberTypesResolver(),
                                new ReturnTypeResolver(), new ExplicitMemberAddResolver(),
                                new CategoryMembersResolver()
                            };
                            var core = new CoreResolver(resolvers, () => new MemberGroup(newMember));

                            Action <DefineCategoryAttribute, MemberCategory> resolve = (def, category) =>
                                                                                       core.Resolve(input, def).Members.Foreach(category.AddMember);

                            var multiple    = targetType.GetCustomAttribute <DefineCategoriesAttribute>(true);
                            var ignored     = targetType.GetCustomAttributes <IgnoreCategoriesAttribute>(true);
                            var definitions = targetType.GetCustomAttributes <DefineCategoryAttribute>(true);
                            if (multiple != null)
                            {
                                definitions = definitions.Concat(multiple.names.Select(n => new DefineCategoryAttribute(n, 1000)));
                            }

                            definitions = definitions.Where(d => !ignored.Any(ig => ig.Paths.Contains(d.FullPath)))
                                          .ToList();

                            Func <string, string[]> ParseCategoryPath = fullPath =>
                            {
                                int      nPaths = fullPath.Split('/').Length;
                                string[] result = new string[nPaths];
                                for (int i = 0, index = -1; i < nPaths - 1; i++)
                                {
                                    index     = fullPath.IndexOf('/', index + 1);
                                    result[i] = fullPath.Substring(0, index);
                                }
                                result[nPaths - 1] = fullPath;
                                return(result);
                            };

                            // Order by exclusivity then path lengths
                            var defs = from d in definitions
                                       let paths = ParseCategoryPath(d.FullPath)
                                                   orderby !d.Exclusive                        //, paths.Length
                                                   select new { def = d, paths };

                            Func <MemberCategory, List <MemberCategory> > getParentCats = parent =>
                                                                                          parent == null ? baseCategories :
                                                                                          (from m in parent.Members
                                                                                           let cat = m as MemberCategory
                                                                                                     where cat != null
                                                                                                     select cat).ToList();

                            // Parse paths and resolve definitions
                            var categories = new Dictionary <string, MemberCategory>();
                            foreach (var x in defs)
                            {
                                var paths = x.paths;
                                var d     = x.def;

                                MemberCategory parent = null;

                                for (int i = 0; i < paths.Length; i++)
                                {
                                    var p       = paths[i];
                                    var current = getParentCats(parent).FirstOrDefault(c => c.FullPath == p);
                                    if (current == null)
                                    {
                                        current = newCategory(p, d.DisplayOrder);
                                        if (i == 0)
                                        {
                                            baseCategories.Add(current);
                                        }
                                        if (parent != null)
                                        {
                                            parent.AddMember(current);
                                        }
                                    }
                                    categories[p] = current;
                                    parent        = current;
                                }

                                categories[paths.Last()].ForceExpand = d.ForceExpand;
                                resolve(d, categories[paths.Last()]);
                                categories.Clear();
                                parent.Members = parent.Members.OrderBy(m => m.DisplayOrder).ToList();
                            }
                            baseCategories = baseCategories.OrderBy(x => x.DisplayOrder).ToList();
                        }
                    }

                    script = serializedObject.FindProperty("m_Script");

                    var disInt = prefs.Ints.ValueOrDefault(id + "display", -1);
                    display = disInt == -1 ? DefaultDisplay : (MembersDisplay)disInt;

                    var field = targetType.Field("_serializationData", Flags.InstancePrivate);
                    if (field == null)
                    {
                        throw new MemberNotFoundException("_serializationData");
                    }

                    serializationData = new EditorMember(field, target, target, id);

                    OnInitialized();

#if DBG
                    Log(GetType().Name + " for " + target.GetType().Name + " Initialized");
#endif
                }
            }
        }
Example #40
0
 protected TargetValue(EditorMember member)
 {
     Member = member;
 }