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(); } }
private void Setup(ParameterInfo[] setParameterInfos, LinkedMemberInfo setMemberInfo, IParentDrawer setParent, GUIContent setLabel, bool setReadOnly) { #if DEV_MODE if (setReadOnly) { Debug.LogWarning(StringUtils.ToColorizedString(ToString(), ".Setup - readonly=", true, ". Really don't allow editing parameter value? This is usually desired even for read-only properties.")); } #endif parameterInfos = setParameterInfos; drawInSingleRow = parameterInfos.Length == 1 && DrawerUtility.CanDrawMultipleControlsOfTypeInSingleRow(parameterInfos[0].ParameterType); if (setLabel == null) { setLabel = GUIContentPool.Create("Parameters"); } int count = parameterInfos.Length; var setValue = ArrayPool <object> .Create(count); for (int n = count - 1; n >= 0; n--) { setValue[n] = ParameterValues.GetValue(parameterInfos[n]); } // always set readonly to false to fix issue where // parameters of read-only indexer Properties could not be modified base.Setup(setValue, typeof(object[]), setMemberInfo, setParent, setLabel, setReadOnly); }
/// <summary> /// Sets up the drawer so that it is ready to be used. /// LateSetup should be called right after this. /// </summary> /// <param name="setKeyType"> The type of the key used in the dictionary. Can not be null. </param> /// <param name="setValidateKey"> Function used for validating the current key value set up in the add button. Can be null. </param> /// <param name="setOnAddButtonClicked"> Delegate called when the add button is clicked. Can be null. </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 not 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([NotNull] Type setKeyType, [CanBeNull] Func <object[], bool> setValidateKey, [CanBeNull] Action setOnAddButtonClicked, [CanBeNull] LinkedMemberInfo setMemberInfo, [NotNull] IParentDrawer setParent, GUIContent setLabel, bool setReadOnly) { keyType = setKeyType; drawInSingleRow = DrawerUtility.CanDrawMultipleControlsOfTypeInSingleRow(keyType); validateKey = setValidateKey; onAddButtonClicked = setOnAddButtonClicked; base.Setup(keyType.DefaultValue(), keyType, setMemberInfo, setParent, setLabel, setReadOnly); }
/// <inheritdoc /> protected override void Setup(Type[] setValue, Type setValueType, LinkedMemberInfo setMemberInfo, IParentDrawer setParent, GUIContent setLabel, bool setReadOnly) { memberInfo = setMemberInfo; genericArguments = setMemberInfo.MethodInfo.GetGenericArguments(); drawInSingleRow = genericArguments.Length == 1 && DrawerUtility.CanDrawMultipleControlsOfTypeInSingleRow(genericArguments[0]); if (setLabel == null) { setLabel = GUIContentPool.Create("Generics"); } base.Setup(setValue, setValueType, setMemberInfo, setParent, setLabel, setReadOnly); }
private void Setup(DictionaryEntry setValue, Type setValueType, Type entryKeyType, Type entryValueType, LinkedMemberInfo setMemberInfo, IParentDrawer setParent, GUIContent setLabel, bool setReadOnly, [CanBeNull] Func <int, object[], bool> setValidateKey) { keyType = entryKeyType; valueType = entryValueType; validateKey = setValidateKey == null ? ValidateNotNull : setValidateKey; drawInSingleRow = DrawerUtility.CanDrawMultipleControlsOfTypeInSingleRow(entryKeyType) && DrawerUtility.CanDrawMultipleControlsOfTypeInSingleRow(entryValueType); base.Setup(setValue, setValueType, setMemberInfo, setParent, setLabel, setReadOnly); #if DEV_MODE && DEBUG_SETUP Debug.Log("DictionaryEntryDrawer<" + StringUtils.ToString(keyType) + "," + StringUtils.ToString(valueType) + "> created with drawInSingleRow=" + StringUtils.ToColorizedString(drawInSingleRow) + ", value=" + StringUtils.ToString(Value)); #endif }
/// <inheritdoc /> protected override void Setup(object setValue, Type setValueType, LinkedMemberInfo setMemberInfo, IParentDrawer setParent, GUIContent setLabel, bool setReadOnly) { if (setValueType == null) { #if DEV_MODE Debug.LogWarning(GetType().Name + ".Setup called with setValueType=null"); #endif setValueType = DrawerUtility.GetType(setMemberInfo, setValue); } var types = setValueType.GetGenericArguments(); var keyType = types[0]; var valueType = types[1]; drawInSingleRow = DrawerUtility.CanDrawMultipleControlsOfTypeInSingleRow(keyType) && DrawerUtility.CanDrawMultipleControlsOfTypeInSingleRow(valueType); base.Setup(setValue, setValueType, setMemberInfo, setParent, setLabel, setReadOnly); #if DEV_MODE && DEBUG_SETUP Debug.Log(StringUtils.ToColorizedString("ReadOnly=", ReadOnly)); #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)); }