/// <inheritdoc /> public override void OnAfterMembersBuilt() { UpdateDrawInSingleRow(); base.OnAfterMembersBuilt(); if (!IsNull) { var valueDrawer = ValueDrawer; if (drawInSingleRow) { valueDrawer.Label = GUIContentPool.Empty(); } #if DEV_MODE && PI_ASSERTATIONS if (!ValueEquals(valueDrawer.GetValue())) { Debug.LogError(Msg("Value ", Value, " != valueDrawer.Value ", valueDrawer.GetValue())); } #endif } }
/// <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() { var value = Value; if (value == null) { DrawerArrayPool.Resize(ref members, 2); members[0] = NullToggleDrawer.Create(OnNullToggleButtonClicked, this, ReadOnly); members[1] = ObjectReferenceDrawer.Create(null, Types.UnityObject, this, GUIContent.none, true, false, ReadOnly); } else { var target = value.Target; bool hasTarget = target != null; Object unityObject; bool isUnityObject; bool isAnonymous; string methodName; Type targetType; int methodIndex; var method = value.Method; if (hasTarget) { targetType = target.GetType(); UpdateMethodOptions(targetType, true); unityObject = target as Object; isUnityObject = unityObject != null; methodName = method.Name; isAnonymous = methodName[0] == '<'; if (isAnonymous) { string methodOrigin = methodName.Substring(1, methodName.IndexOf('>') - 1); methodName = string.Concat("Anonymous Method (", methodOrigin, ")"); } methodIndex = Array.IndexOf(methodOptionNames, methodName); if (methodIndex == -1) { methodOptions = methodOptions.InsertAt(0, method); methodOptionNames = methodOptionNames.InsertAt(0, methodName); methodIndex = 0; } } else { methodIndex = 0; if (method == null) { targetType = null; methodName = "{ }"; unityObject = null; isUnityObject = false; isAnonymous = false; ArrayPool <MethodInfo> .Resize(ref methodOptions, 1); methodOptions[0] = method; ArrayPool <string> .Resize(ref methodOptionNames, 1); methodOptionNames[0] = methodName; } else { targetType = method.ReflectedType; UpdateMethodOptions(targetType, false); methodName = method.Name; unityObject = null; isUnityObject = false; isAnonymous = methodName[0] == '<'; if (isAnonymous) { string methodOrigin = methodName.Substring(1, methodName.IndexOf('>') - 1); methodName = string.Concat("Anonymous Method (", methodOrigin, ")"); } methodIndex = Array.IndexOf(methodOptionNames, methodName); if (methodIndex == -1) { methodOptions = methodOptions.InsertAt(0, method); methodOptionNames = methodOptionNames.InsertAt(0, methodName); methodIndex = 0; } } } #if DEV_MODE && PI_ASSERTATIONS Debug.Assert(methodOptions.Length == methodOptionNames.Length); #endif #if DEV_MODE Debug.Log(Msg(ToString() + ".DoBuildMembers with target=", target, ", type=", targetType, ", isUnityObject=", isUnityObject, ", methodName=", methodName, ", isAnonymous=", isAnonymous + ", methodNames=", StringUtils.ToString(methodOptionNames))); #endif if (isUnityObject) { DrawerArrayPool.Resize(ref members, 2); members[0] = ObjectReferenceDrawer.Create(unityObject, Types.UnityObject, this, GUIContentPool.Empty(), true, false, ReadOnly); members[1] = PopupMenuDrawer.Create(methodIndex, methodOptionNames, null, this, GUIContentPool.Empty(), ReadOnly); } else { DrawerArrayPool.Resize(ref members, 3); members[0] = NullToggleDrawer.Create(OnNullToggleButtonClicked, this, ReadOnly); members[1] = TypeDrawer.Create(targetType, null, this, GUIContentPool.Empty(), ReadOnly); members[2] = PopupMenuDrawer.Create(methodIndex, methodOptionNames, null, this, GUIContentPool.Empty(), ReadOnly); } } }
/// <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 DoBuildMembers() { int count = genericArguments.Length; drawInSingleRow = count == 1; DrawerArrayPool.Resize(ref members, count); if (count == 1) { var genericArgument = genericArguments[0]; label.text = GetLabel(genericArgument); label.tooltip = "Generic Argument"; members[0] = TypeDrawer.Create(GetDefaultValue(genericArgument), null, this, GUIContentPool.Empty(), false); } else { for (int n = count - 1; n >= 0; n--) { var genericArgument = genericArguments[n]; string labelText = GetLabel(genericArgument); string tooltip = string.Concat("Generic Argument ", StringUtils.ToString(n + 1), "/", StringUtils.ToString(count)); members[n] = TypeDrawer.Create(GetDefaultValue(genericArgument), null, this, GUIContentPool.Create(labelText, tooltip), false); } } #if DEV_MODE try { Debug.Log(ToString() + ".RebuildIntructionsInChildren() - now has " + members.Length + " members:\n" + StringUtils.ToString(members)); } catch (Exception e) //had a bug where even trying to access "this" resulted in a null reference exception { Debug.LogError("MethodDrawer.RebuildIntructionsInChildren() " + e); return; } for (int n = 0; n < members.Length; n++) { Debug.Log(GetType().Name + " Created #" + n + " " + members[n].GetType().Name); } #endif }