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)); }
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); }
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 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 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); } } }
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); }