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; }
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); } }
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; } }
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); }
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; }
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)); }
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 }
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; }
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); }
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 ); }
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 }
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 }
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); } }
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); }
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); }
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; }
/// <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(); }
public void MemberField(EditorMember member) { gui.Member(member, false); }
protected EditorMember FindRelativeMember(string memberName) { return(EditorMember.WrapMember(memberName, typeof(T), memberValue, unityTarget, id)); }
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; }
public bool Member(EditorMember member, BaseDrawer memberDrawer) { return(Member(member, member.Attributes, memberDrawer, false)); }
public bool Member(EditorMember member, BaseDrawer memberDrawer) { return Member(member, member.Attributes, memberDrawer, false); }
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)); } }
public bool Member(EditorMember member) { return Member(member, false); }
public bool Member(EditorMember member, bool ignoreComposition) { return Member(member, member.Attributes, ignoreComposition); }
public bool Member(EditorMember member, bool ignoreComposition) { return(Member(member, member.Attributes, ignoreComposition)); }
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); }
public void MemberField(EditorMember dm) { gui.Member(dm, false); }
public ACPValue(EditorMember member) : base(member) { }
public StringValue(EditorMember member) : base(member) { }
public HashValue(EditorMember member) : base(member) { }
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(); }
/// <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(); }
public bool Member(EditorMember member) { return(Member(member, false)); }
//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 } } }
protected TargetValue(EditorMember member) { Member = member; }