private void UpdateDrawInSingleRow() { bool setDrawInSingleRow; if (IsNull) { setDrawInSingleRow = true; } #if DRAW_VALUE_IN_SINGLE_ROW_IF_POSSIBLE else if (memberBuildState == MemberBuildState.MembersBuilt) { setDrawInSingleRow = DrawerUtility.CanDrawInSingleRow(ValueDrawer); } else if (memberBuildState == MemberBuildState.BuildListGenerated) { setDrawInSingleRow = DrawerUtility.CanDrawInSingleRow(instanceType, DebugMode); } #else else if (memberBuildState != MemberBuildState.Unstarted) { setDrawInSingleRow = DrawerUtility.CanDrawMultipleControlsOfTypeInSingleRow(instanceType); } #endif else { setDrawInSingleRow = true; } if (setDrawInSingleRow != drawInSingleRow) { #if DEV_MODE && DEBUG_UPDATE_DRAW_IN_SINGLE_ROW Debug.Log(Msg(ToString(), ".drawInSingleRow = ", setDrawInSingleRow, " (was: ", drawInSingleRow, ") with IsNull=", IsNull, ", memberBuildState = ", memberBuildState, ", instanceType=", instanceType)); #endif drawInSingleRow = setDrawInSingleRow; UpdatePrefixDrawer(); if (DrawInSingleRow) { if (inactive) { SetUnfoldedInstantly(true); } else { SetUnfolded(true); } } UpdateVisibleMembers(); } else if (prefixLabelDrawer == null) { #if DEV_MODE Debug.LogError("This null check was needed!"); #endif UpdatePrefixDrawer(); } }
/// <summary> /// Sets up the drawer so that it is ready to be used. /// LateSetup should be called right after this. /// </summary> /// <param name="setStyle"> GUIStyle inside which to draw members. </param> /// <param name="indentLevel"> How many levels of indentation to add when drawing members. </param> /// <param name="setDrawHeader"> Should the prefix label header be drawn for the dataset. </param> /// <param name="setValue"> The initial cached value of the drawers. </param> /// <param name="setValueType"> Type constraint for the value. </param> /// <param name="setMemberInfo"> LinkedMemberInfo for the field or property that these drawers represent. </param> /// <param name="setParent"> Drawer whose member these Drawer are. Can be null. </param> /// <param name="setLabel"> The label (name) of the field. Can be null. </param> /// <param name="setReadOnly"> True if Drawer should be read only. </param> private void Setup(GUIStyle setStyle, int indentLevel, bool setDrawHeader, object setValue, Type setValueType, LinkedMemberInfo setMemberInfo, IParentDrawer setParent, GUIContent setLabel, bool setReadOnly) { style = new GUIStyle(setStyle); style.fixedHeight = 0f; style.fixedWidth = 0f; style.stretchHeight = true; style.stretchWidth = true; appendIndentLevel = indentLevel; drawHeader = setDrawHeader; if (setValueType == null) { #if DEV_MODE Debug.LogWarning(GetType().Name + ".Setup called with null setValueType"); #endif setValueType = DrawerUtility.GetType(setMemberInfo, setValue); } // This is an important step, because parent is referenced by DebugMode parent = setParent; drawInSingleRow = DrawerUtility.CanDrawInSingleRow(setValueType, DebugMode); base.Setup(setValue, setValueType, setMemberInfo, setParent, setLabel, setReadOnly); #if DEV_MODE && DEBUG_DRAW_IN_SINGLE_ROW if (drawInSingleRow) { Debug.Log(Msg(ToString(setLabel, setMemberInfo) + ".Setup with drawInSingleRow=", drawInSingleRow, ", type=", setValueType, ", DebugMode=", DebugMode)); } #endif }
/// <summary> /// Given a non-abstract explicitly chosen type, returns the drawer for the value of the drawer using said type. /// </summary> /// <param name="typeForValue"> Type of value. </param> /// <returns> Drawer instance to use for the value. </returns> protected virtual IDrawer BuildDrawerForValue(Type typeForValue) { #if DEV_MODE && DEBUG_DRAW_IN_SINGLE_ROW Debug.Log("BuildDrawerForValue(" + typeForValue.Name + ") called with DrawInSingleRow=" + DrawInSingleRow + ", CanDrawInSingleRow(" + typeForValue.Name + ")=" + DrawerUtility.CanDrawInSingleRow(typeForValue, DebugMode) + ", CanDrawMultipleControlsOfTypeInSingleRow(" + typeForValue.Name + ")=" + DrawerUtility.CanDrawMultipleControlsOfTypeInSingleRow(typeForValue)); #endif if (typeForValue.IsUnityObject()) { return(ObjectReferenceDrawer.Create(null, memberInfo, GetTypeForObjectReferenceField(), this, GUIContent.none, AllowSceneObjects(), false, ReadOnly)); } var label = GUIContentPool.Create(StringUtils.SplitPascalCaseToWords(StringUtils.ToStringSansNamespace(typeForValue))); // infinite loop danger! if (memberInfo != null && typeForValue == memberInfo.Type) { #if DEV_MODE Debug.LogError("Infinite loop! typeForValue " + StringUtils.ToString(typeForValue) + " same as Type! instanceType=" + StringUtils.ToString(instanceType) + ", userSelectedType=" + StringUtils.ToString(userSelectedType)); #endif return(ReadOnlyTextDrawer.Create(StringUtils.ToString(Value), memberInfo, this, label)); } return(BuildDrawerForValue(typeForValue, Value, memberInfo, this, label, ReadOnly)); }
/// <inheritdoc /> protected override void DoBuildMembers() { #if DEV_MODE && DEBUG_BUILD_MEMBERS Debug.Log(StringUtils.ToColorizedString(ToString(), ".DoBuildMembers called with memberBuildList=", memberBuildList, ", IsNull = ", IsNull, ", CanBeUnityObject=", CanBeUnityObject, ", DrawToggleNullButton=", DrawToggleNullButton, ", memberInfo=", memberInfo, ", memberInfo.Data=", (memberInfo == null ? "n/a" : StringUtils.ToString(memberInfo.Data)))); #endif var typeForValue = TypeForValue; if (typeForValue == null) { if (CanBeUnityObject) { var referenceField = ObjectReferenceDrawer.Create(null, memberInfo, GetTypeForObjectReferenceField(), this, GUIContent.none, AllowSceneObjects(), false, ReadOnly); if (DrawToggleNullButton) { DrawerArrayPool.Resize(ref members, 2); members[0] = NullToggleDrawer.Create(OnNullToggleButtonClicked, this, ReadOnly); members[1] = referenceField; } else { DrawerArrayPool.Resize(ref members, 1); members[0] = referenceField; } } else if (DrawToggleNullButton) { DrawerArrayPool.Resize(ref members, 1); members[0] = NullToggleDrawer.Create(OnNullToggleButtonClicked, this, ReadOnly); } else { DrawerArrayPool.Resize(ref members, 1); members[0] = ReadOnlyTextDrawer.Create("null", null, this, GUIContent.none); } } else { #if DEV_MODE && PI_ASSERTATIONS Assert(typeForValue != null, ToString(), ".BuildMembers was called with isNull=false but with userSelectedType=", null, ".\nDrawInSingleRow=", DrawInSingleRow, ", Value=", Value, ", Value.Type=", StringUtils.TypeToString(Value)); Assert(!typeForValue.IsAbstract, ToString(), ".BuildMembers was called with isNull=false but with userSelectedType ", userSelectedType, " IsAbstract=" + true + ".\nDrawInSingleRow=", DrawInSingleRow, ", Value=", Value, ", Value.Type=", StringUtils.TypeToString(Value)); #endif var valueDrawer = BuildDrawerForValue(typeForValue); #if DEV_MODE && PI_ASSERTATIONS Assert(valueDrawer.GetType() != GetType()); #endif valueDrawer.OnValueChanged += (changed, setValue) => SetValue(setValue); if (DrawToggleNullButton) { DrawerArrayPool.Resize(ref members, 2); members[0] = NullToggleDrawer.Create(OnNullToggleButtonClicked, this, ReadOnly); members[1] = valueDrawer; } else { DrawerArrayPool.Resize(ref members, 1); members[0] = valueDrawer; } #if DRAW_VALUE_IN_SINGLE_ROW_IF_POSSIBLE if (DrawerUtility.CanDrawInSingleRow(valueDrawer)) { valueDrawer.Label = GUIContentPool.Empty(); } #endif } }
/// <inheritdoc /> protected override void DoBuildMembers() { int count = memberBuildList.Count; #if DEV_MODE && PI_ASSERTATIONS Debug.Assert(count == parameterInfos.Length, "memberBuildList.Count=" + memberBuildList.Count + " != " + parameterInfos.Length); #endif #if DEV_MODE Debug.Log("ParameterDrawer.DoBuildMembers called with parameterInfos.Length=" + parameterInfos.Length + ", memberBuildList.Count=" + memberBuildList.Count + ", drawInSingleRow=" + drawInSingleRow); #endif DrawerArrayPool.Resize(ref members, count); //If only has one parameter, can be drawn in a single row if (drawInSingleRow) { #if DEV_MODE && PI_ASSERTATIONS Debug.Assert(memberBuildList.Count == 1); Debug.Assert(parameterInfos.Length == 1); #endif var memberFieldInfo = memberBuildList[0]; var parameterInfo = memberFieldInfo.ParameterInfo; var type = GetParameterTypeAndLabel(memberFieldInfo, ref label); var member = DrawerProvider.GetForField(ParameterValues.GetValue(parameterInfo), type, memberFieldInfo, this, GUIContent.none, ReadOnly); #if DEV_MODE || SAFE_MODE if (member == null) { Debug.LogError(ToString() + " Failed to create Drawer for member " + memberFieldInfo + " of type " + StringUtils.ToString(type) + ".\nparent=" + StringUtils.ToString(parent)); DrawerArrayPool.Resize(ref members, 0); return; } #endif //can't draw the member in a single row after all! if (!DrawerUtility.CanDrawInSingleRow(member)) { drawInSingleRow = false; member.Dispose(); DoBuildMembers(); return; } members[0] = member; } else { for (int n = count - 1; n >= 0; n--) { var memberFieldInfo = memberBuildList[n]; var parameterInfo = memberFieldInfo.ParameterInfo; var memberLabel = GUIContentPool.Empty(); var type = GetParameterTypeAndLabel(memberFieldInfo, ref memberLabel); var member = DrawerProvider.GetForField(ParameterValues.GetValue(parameterInfo), type, memberFieldInfo, this, memberLabel, ReadOnly); #if DEV_MODE || SAFE_MODE if (member == null) { for (int d = count - 1; d > n; d--) { members[d].Dispose(); } Debug.LogError(ToString() + " Failed to create Drawer for members[" + n + "] " + memberFieldInfo + " of type " + StringUtils.ToString(type) + ".\nparent=" + StringUtils.ToString(parent)); DrawerArrayPool.Resize(ref members, 0); return; } #endif members[n] = member; } } }
/// <inheritdoc/> protected override void Setup(object setValue, Type setValueType, LinkedMemberInfo setMemberInfo, IParentDrawer setParent, GUIContent setLabel, bool setReadOnly) { #if DEV_MODE && PI_ASSERTATIONS Debug.Assert(memberBuildState == MemberBuildState.Unstarted); #endif if (setValue == null) { setValueType = DrawerUtility.GetType(setMemberInfo, setValue); } // This is an important step, because parent is referenced by DebugMode parent = setParent; drawInSingleRow = (setMemberInfo != null && setMemberInfo.GetAttribute <Attributes.DrawInSingleRowAttribute>() != null) || (setValueType != null && setValueType.GetCustomAttributes(typeof(Attributes.DrawInSingleRowAttribute), false).Length > 0) || DrawerUtility.CanDrawInSingleRow(setValueType, DebugMode); base.Setup(setValue, setValueType, setMemberInfo, setParent, setLabel, setReadOnly); #if DEV_MODE && DEBUG_DRAW_IN_SINGLE_ROW if (drawInSingleRow) { Debug.Log(Msg(ToString(setLabel, setMemberInfo) + ".Setup with drawInSingleRow=", drawInSingleRow, ", setValueType=", setValueType, ", DebugMode=", DebugMode, ", setMemberInfo.Type=" + (setMemberInfo == null ? "n/a" : StringUtils.ToString(setMemberInfo.Type)) + ", setValue.GetType()=", StringUtils.TypeToString(setValue))); } #endif }