/// <summary> /// Draws the property. /// </summary> protected override void DrawPropertyLayout(GUIContent label) { if (this.helper.ErrorMessage != null) { SirenixEditorGUI.ErrorMessageBox(this.helper.ErrorMessage); this.CallNextDrawer(label); } else { bool result = this.helper.GetValue(this.Attribute.Value); if (this.Attribute.Animate) { if (SirenixEditorGUI.BeginFadeGroup(UniqueDrawerKey.Create(this.Property, this), !result)) { this.CallNextDrawer(label); } SirenixEditorGUI.EndFadeGroup(); } else { if (!result) { this.CallNextDrawer(label); } } } }
/// <summary> /// Draws the property. /// </summary> protected override void DrawPropertyLayout(InspectorProperty property, ShowIfAttribute attribute, GUIContent label) { bool result; string errorMessage; IfAttributesHelper.HandleIfAttributesCondition(this, property, attribute.MemberName, attribute.Value, out result, out errorMessage); if (errorMessage != null) { AllEditorGUI.ErrorMessageBox(errorMessage); this.CallNextDrawer(property, label); } else { if (attribute.Animate) { if (AllEditorGUI.BeginFadeGroup(UniqueDrawerKey.Create(property, this), result)) { this.CallNextDrawer(property, label); } AllEditorGUI.EndFadeGroup(); } else { if (result) { this.CallNextDrawer(property, label); } } } }
protected override void Initialize() { var member = GetMember(this.Property); bool isCollectionElement = this.Property.Parent != null && this.Property.Parent.ChildResolver is ICollectionResolver; if (member != null && ValidationRunner.ValidatorLocator.PotentiallyHasValidatorsFor(member, typeof(T), isCollectionElement)) { ValidationRunner.ValidateMember(this.Property.ParentValues[0], member, this.ValueEntry.Values[0], typeof(T), this.Property.Tree.WeakTargets[0] as UnityEngine.Object, isCollectionElement, ref this.validationResults); } else { ValidationRunner.ValidateValue(this.ValueEntry.Values[0], this.Property.Tree.WeakTargets[0] as UnityEngine.Object, ref this.validationResults); } if (this.validationResults.Count > 0) { this.shakeGroupKey = UniqueDrawerKey.Create(this.Property, this); this.Property.Tree.OnUndoRedoPerformed += this.OnUndoRedoPerformed; this.ValueEntry.OnValueChanged += this.OnValueChanged; this.ValueEntry.OnChildValueChanged += this.OnChildValueChanged; } else { this.SkipWhenDrawing = true; } }
/// <summary> /// Draws the property. /// </summary> protected override void DrawPropertyLayout(InspectorProperty property, TableListAttribute attribute, GUIContent label) { var context = property.Context.Get(this, "Context", (Context)null); if (context.Value == null) { context.Value = new Context(); context.Value.ListChanger = property.ValueEntry.GetListValueEntryChanger(); context.Value.Paging = new GUIPagingHelper(); context.Value.Paging.NumberOfItemsPerPage = attribute.NumberOfItemsPerPage == 0 ? GeneralDrawerConfig.Instance.NumberOfItemsPrPage : attribute.NumberOfItemsPerPage; property.Context.GetPersistent(this, "DrawList", out context.Value.DrawList); } context.Value.ObjectPicker = ObjectPicker.GetObjectPicker(UniqueDrawerKey.Create(property, this), context.Value.ListChanger.ElementType); context.Value.UpdateTable(property, attribute, label == null ? string.Empty : label.text); // @todo @fix passing null to update table for label causes OutOfRangeExceptions to be thrown. if (context.Value.DrawList.Value) { if (GUILayout.Button("Show table")) { context.Value.SwitchView = true; } this.CallNextDrawer(property, label); } else { if (context.Value.Table != null) { if (context.Value.WasUpdated && Event.current.type == EventType.Repaint) { // Everything is messed up the first frame. Lets not show that. GUIHelper.PushColor(new Color(0, 0, 0, 0)); } context.Value.Table.DrawTable(); if (context.Value.WasUpdated && Event.current.type == EventType.Repaint) { context.Value.WasUpdated = false; GUIHelper.PopColor(); } } if (context.Value.ObjectPicker.IsReadyToClaim && Event.current.type == EventType.Repaint) { var value = context.Value.ObjectPicker.ClaimObject(); object[] values = new object[context.Value.ListChanger.ValueCount]; values[0] = value; for (int j = 1; j < values.Length; j++) { values[j] = SerializationUtility.CreateCopy(value); } context.Value.ListChanger.AddListElement(values, CHANGE_ID); } } GUILayout.Space(3); }
/// <summary> /// Draws the property. /// </summary> protected override void DrawPropertyLayout(GUIContent label) { bool result; string errorMessage; var property = this.Property; var attribute = this.Attribute; IfAttributesHelper.HandleIfAttributesCondition(this, property, attribute.MemberName, attribute.Value, out result, out errorMessage); if (errorMessage != null) { SirenixEditorGUI.ErrorMessageBox(errorMessage); this.CallNextDrawer(label); } else { if (attribute.Animate) { if (SirenixEditorGUI.BeginFadeGroup(UniqueDrawerKey.Create(property, this), result)) { this.CallNextDrawer(label); } SirenixEditorGUI.EndFadeGroup(); } else { if (result) { this.CallNextDrawer(label); } } } }
/// <summary> /// Draws the property. /// </summary> protected override void DrawPropertyLayout(InspectorProperty property, RequiredAttribute attribute, GUIContent label) { if (property.ValueEntry.BaseValueType.IsValueType) { AllEditorGUI.ErrorMessageBox("Value types cannot be null, and thus cannot be marked as required."); return; } // Message context. PropertyContext <StringMemberHelper> context = null; if (attribute.ErrorMessage != null) { context = property.Context.Get <StringMemberHelper>(this, "ErrorMessage", (StringMemberHelper)null); if (context.Value == null) { context.Value = new StringMemberHelper(property.ParentType, attribute.ErrorMessage); } if (context.Value.ErrorMessage != null) { AllEditorGUI.ErrorMessageBox(context.Value.ErrorMessage); } } var isMissing = CheckIsMissing(property); if (isMissing) { string msg = attribute.ErrorMessage != null?context.Value.GetString(property) : (property.NiceName + " is required."); if (attribute.MessageType == InfoMessageType.Warning) { AllEditorGUI.WarningMessageBox(msg); } else if (attribute.MessageType == InfoMessageType.Error) { AllEditorGUI.ErrorMessageBox(msg); } else { EditorGUILayout.HelpBox(msg, (MessageType)attribute.MessageType); } } var key = UniqueDrawerKey.Create(property, this); AllEditorGUI.BeginShakeableGroup(key); this.CallNextDrawer(property, label); AllEditorGUI.EndShakeableGroup(key); if (!isMissing && CheckIsMissing(property)) { AllEditorGUI.StartShakingGroup(key); } }
/// <summary> /// Draws the property. /// </summary> protected override void DrawPropertyLayout(IPropertyValueEntry <T> entry, GUIContent label) { if (entry.ValueState == PropertyValueState.Reference) { var isToggled = entry.Context.GetPersistent(this, "is_Toggled", false); var targetProp = entry.Property.Tree.GetPropertyAtPath(entry.TargetReferencePath); SirenixEditorGUI.BeginBox(); SirenixEditorGUI.BeginBoxHeader(); EditorGUILayout.BeginHorizontal(); isToggled.Value = label != null?SirenixEditorGUI.Foldout(isToggled.Value, label) : SirenixEditorGUI.Foldout(isToggled.Value, GUIHelper.TempContent("")); if (targetProp.Parent == null) { EditorGUILayout.LabelField("Reference to " + targetProp.Path, SirenixGUIStyles.RightAlignedGreyMiniLabel); } else { EditorGUILayout.LabelField("Reference to " + targetProp.Path, SirenixGUIStyles.RightAlignedGreyMiniLabel); } EditorGUILayout.EndHorizontal(); SirenixEditorGUI.EndBoxHeader(); if (SirenixEditorGUI.BeginFadeGroup(UniqueDrawerKey.Create(entry.Property, this), isToggled.Value)) { //EditorGUI.indentLevel++; //GUIHelper.PushGUIEnabled(true); var isInReference = targetProp.Context.GetGlobal("is_in_reference", false); bool previous = isInReference.Value; isInReference.Value = true; InspectorUtilities.DrawProperty(targetProp); isInReference.Value = previous; //GUIHelper.PopGUIEnabled(); //EditorGUI.indentLevel--; } SirenixEditorGUI.EndFadeGroup(); SirenixEditorGUI.EndBox(); } else { this.CallNextDrawer(entry.Property, label); } }
/// <summary> /// Draws the property. /// </summary> protected override void DrawPropertyLayout(GUIContent label) { // Message context. PropertyContext <StringMemberHelper> context = null; if (this.Attribute.ErrorMessage != null) { context = this.Property.Context.Get <StringMemberHelper>(this, "ErrorMessage", (StringMemberHelper)null); if (context.Value == null) { //context.Value = new StringMemberHelper(property.ParentType, attribute.ErrorMessage); context.Value = new StringMemberHelper(this.Property, this.Attribute.ErrorMessage); } if (context.Value.ErrorMessage != null) { SirenixEditorGUI.ErrorMessageBox(context.Value.ErrorMessage); } } var isMissing = CheckIsMissing(this.Property); if (isMissing) { string msg = this.Attribute.ErrorMessage != null?context.Value.GetString(this.Property) : (this.Property.NiceName + " is required."); if (this.Attribute.MessageType == InfoMessageType.Warning) { SirenixEditorGUI.WarningMessageBox(msg); } else if (this.Attribute.MessageType == InfoMessageType.Error) { SirenixEditorGUI.ErrorMessageBox(msg); } else { EditorGUILayout.HelpBox(msg, (MessageType)this.Attribute.MessageType); } } var key = UniqueDrawerKey.Create(this.Property, this); SirenixEditorGUI.BeginShakeableGroup(key); this.CallNextDrawer(label); SirenixEditorGUI.EndShakeableGroup(key); if (!isMissing && CheckIsMissing(this.Property)) { SirenixEditorGUI.StartShakingGroup(key); } }
private DropZoneHandle BeginDropZone(ListDrawerConfigInfo info) { var dropZone = DragAndDropManager.BeginDropZone(UniqueDrawerKey.Create(info.property, this), typeof(TElement), true); if (Event.current.type == EventType.Repaint && DragAndDropManager.IsDragInProgress) { var rect = dropZone.Rect; dropZone.Rect = rect; } dropZone.Enabled = info.IsReadOnly == false; info.DropZone = dropZone; return(dropZone); }
/// <summary> /// Draws the property. /// </summary> protected override void DrawPropertyLayout(IPropertyValueEntry <Rect> entry, GUIContent label) { if (label == null) { this.DrawValues(entry); } else { var isVisible = entry.Property.Context.GetPersistent <bool>(this, "IsVisible", GeneralDrawerConfig.Instance.ExpandFoldoutByDefault); isVisible.Value = AllEditorGUI.Foldout(isVisible.Value, label); if (AllEditorGUI.BeginFadeGroup(UniqueDrawerKey.Create(entry, this), isVisible.Value)) { EditorGUI.indentLevel++; this.DrawValues(entry); EditorGUI.indentLevel--; } AllEditorGUI.EndFadeGroup(); } }
public static void DrawPropertyGroupLayout <T>(OdinGroupDrawer <T> ogd, InspectorProperty property, T attribute, GUIContent label, bool result) where T : CrossSceneSideAttribute { if (SirenixEditorGUI.BeginFadeGroup(UniqueDrawerKey.Create(property, ogd), result)) { var labelGetter = property.Context.Get <StringMemberHelper>(ogd, "LabelContext", (StringMemberHelper)null); if (labelGetter.Value == null) { labelGetter.Value = new StringMemberHelper(property, attribute.GroupName); } SirenixEditorGUI.BeginBox(attribute.ShowLabel ? labelGetter.Value.GetString(property) : null, attribute.CenterLabel); for (int i = 0; i < property.Children.Count; i++) { property.Draw(property.Children[i].Label); } SirenixEditorGUI.EndBox(); } SirenixEditorGUI.EndFadeGroup(); }
/// <summary> /// Draws the property. /// </summary> protected override void DrawPropertyLayout(IPropertyValueEntry <TList> entry, GUIContent label) { var property = entry.Property; var infoContext = property.Context.Get(this, "Context", (ListDrawerConfigInfo)null); var info = infoContext.Value; bool isReadOnly = false; if (entry.TypeOfValue.IsArray == false) { for (int i = 0; i < entry.ValueCount; i++) { if ((entry.WeakValues[i] as IList <TElement>).IsReadOnly) { isReadOnly = true; break; } } } if (info == null) { var customListDrawerOptions = property.Info.GetAttribute <ListDrawerSettingsAttribute>() ?? new ListDrawerSettingsAttribute(); isReadOnly = entry.IsEditable == false || isReadOnly || customListDrawerOptions.IsReadOnlyHasValue && customListDrawerOptions.IsReadOnly; info = infoContext.Value = new ListDrawerConfigInfo() { StartIndex = 0, Toggled = entry.Context.GetPersistent <bool>(this, "ListDrawerToggled", customListDrawerOptions.ExpandedHasValue ? customListDrawerOptions.Expanded : GeneralDrawerConfig.Instance.OpenListsByDefault), RemoveAt = -1, label = new GUIContent(label == null || string.IsNullOrEmpty(label.text) ? property.ValueEntry.TypeOfValue.GetNiceName() : label.text, label == null ? string.Empty : label.tooltip), ShowAllWhilePageing = false, EndIndex = 0, CustomListDrawerOptions = customListDrawerOptions, IsReadOnly = isReadOnly, Draggable = !isReadOnly && (!customListDrawerOptions.IsReadOnlyHasValue) }; info.listConfig = GeneralDrawerConfig.Instance; info.property = property; if (customListDrawerOptions.DraggableHasValue && !customListDrawerOptions.DraggableItems) { info.Draggable = false; } if (info.CustomListDrawerOptions.OnBeginListElementGUI != null) { string errorMessage; MemberInfo memberInfo = property.ParentType .FindMember() .IsMethod() .IsNamed(info.CustomListDrawerOptions.OnBeginListElementGUI) .HasParameters <int>() .ReturnsVoid() .GetMember <MethodInfo>(out errorMessage); if (memberInfo == null || errorMessage != null) { Debug.LogError(errorMessage ?? "There should really be an error message here."); } else { info.OnBeginListElementGUI = EmitUtilities.CreateWeakInstanceMethodCaller <int>(memberInfo as MethodInfo); } } if (info.CustomListDrawerOptions.OnEndListElementGUI != null) { string errorMessage; MemberInfo memberInfo = property.ParentType .FindMember() .IsMethod() .IsNamed(info.CustomListDrawerOptions.OnEndListElementGUI) .HasParameters <int>() .ReturnsVoid() .GetMember <MethodInfo>(out errorMessage); if (memberInfo == null || errorMessage != null) { Debug.LogError(errorMessage ?? "There should really be an error message here."); } else { info.OnEndListElementGUI = EmitUtilities.CreateWeakInstanceMethodCaller <int>(memberInfo as MethodInfo); } } if (info.CustomListDrawerOptions.OnTitleBarGUI != null) { string errorMessage; MemberInfo memberInfo = property.ParentType .FindMember() .IsMethod() .IsNamed(info.CustomListDrawerOptions.OnTitleBarGUI) .HasNoParameters() .ReturnsVoid() .GetMember <MethodInfo>(out errorMessage); if (memberInfo == null || errorMessage != null) { Debug.LogError(errorMessage ?? "There should really be an error message here."); } else { info.OnTitleBarGUI = EmitUtilities.CreateWeakInstanceMethodCaller(memberInfo as MethodInfo); } } if (info.CustomListDrawerOptions.ListElementLabelName != null) { string errorMessage; MemberInfo memberInfo = typeof(TElement) .FindMember() .HasNoParameters() .IsNamed(info.CustomListDrawerOptions.ListElementLabelName) .HasReturnType <object>(true) .GetMember(out errorMessage); if (memberInfo == null || errorMessage != null) { Debug.LogError(errorMessage ?? "There should really be an error message here."); } else { string methodSuffix = memberInfo as MethodInfo == null ? "" : "()"; info.GetListElementLabelText = DeepReflection.CreateWeakInstanceValueGetter(typeof(TElement), typeof(object), info.CustomListDrawerOptions.ListElementLabelName + methodSuffix); } } } info.listConfig = GeneralDrawerConfig.Instance; info.property = property; info.ListItemStyle.padding.left = info.Draggable ? 25 : 7; info.ListItemStyle.padding.right = info.IsReadOnly ? 4 : 20; if (Event.current.type == EventType.Repaint) { info.DropZoneTopLeft = GUIUtility.GUIToScreenPoint(new Vector2(0, 0)); } info.ListValueChanger = property.ValueEntry.GetListValueEntryChanger(); info.Count = property.Children.Count; info.IsEmpty = property.Children.Count == 0; SirenixEditorGUI.BeginIndentedVertical(SirenixGUIStyles.PropertyPadding); this.BeginDropZone(info); { this.DrawToolbar(info); if (SirenixEditorGUI.BeginFadeGroup(UniqueDrawerKey.Create(property, this), info.Toggled.Value)) { GUIHelper.PushLabelWidth(EditorGUIUtility.labelWidth - info.ListItemStyle.padding.left); this.DrawItems(info); GUIHelper.PopLabelWidth(); } SirenixEditorGUI.EndFadeGroup(); } this.EndDropZone(info); SirenixEditorGUI.EndIndentedVertical(); if (info.RemoveAt >= 0 && Event.current.type == EventType.Repaint) { info.ListValueChanger.RemoveListElementAt(info.RemoveAt, CHANGE_ID); info.RemoveAt = -1; GUIHelper.RequestRepaint(); } if (info.ObjectPicker != null && info.ObjectPicker.IsReadyToClaim && Event.current.type == EventType.Repaint) { var value = info.ObjectPicker.ClaimObject(); if (info.JumpToNextPageOnAdd) { info.StartIndex = int.MaxValue; } object[] values = new object[info.ListValueChanger.ValueCount]; values[0] = value; for (int j = 1; j < values.Length; j++) { values[j] = SerializationUtility.CreateCopy(value); } info.ListValueChanger.AddListElement(values, CHANGE_ID); } }
/// <summary> /// Draws the property. /// </summary> protected override void DrawPropertyLayout(GUIContent label) { var property = this.Property; var attribute = this.Attribute; var toggleProperty = property.Children.Get(attribute.ToggleMemberName); if (toggleProperty == null) { SirenixEditorGUI.ErrorMessageBox(attribute.ToggleMemberName + " is not a member of " + property.NiceName + "."); } else if (toggleProperty.ValueEntry.TypeOfValue != typeof(bool)) { SirenixEditorGUI.ErrorMessageBox(attribute.ToggleMemberName + " on " + property.NiceName + " must be a boolean."); } else { bool isEnabled = (bool)toggleProperty.ValueEntry.WeakSmartValue; var isVisible = property.Context.GetPersistent(this, "isVisible", false); PropertyContext <string> openGroup = null; if (attribute.CollapseOthersOnExpand) { if (property.Parent == null) { //openGroup = GUIHelper.GetTemporaryContext<PropertyContext<string>>(property.Tree); openGroup = property.Context.Get <string>(this, "OpenGroup", (string)null); } else { var parent = (property.Parent.ValueEntry == null || property.Parent.Info.HasSingleBackingMember) ? property.Parent : property.Parent.Parent; openGroup = parent.Context.GetGlobal <string>("OpenFoldoutToggleGroup", (string)null); } if (openGroup.Value != null && openGroup.Value != property.Path) { isVisible.Value = false; } } bool prev = isVisible.Value; bool visibleBuffer = isVisible.Value; if (SirenixEditorGUI.BeginToggleGroup(UniqueDrawerKey.Create(property, this), ref isEnabled, ref visibleBuffer, label != null ? label.text : property.NiceName)) { for (int i = 0; i < property.Children.Count; i++) { var child = property.Children[i]; if (child != toggleProperty) { child.Draw(child.Label); } } } SirenixEditorGUI.EndToggleGroup(); isVisible.Value = visibleBuffer; if (openGroup != null && prev != isVisible.Value && isVisible.Value) { openGroup.Value = property.Path; } toggleProperty.ValueEntry.WeakSmartValue = isEnabled; } }
/// <summary> /// Draws the property. /// </summary> protected override void DrawPropertyLayout(IPropertyValueEntry <T> entry, GUIContent label) { var isToggled = entry.Property.Context.GetPersistent <bool>(this, "Toggled", SirenixEditorGUI.ExpandFoldoutByDefault); if (entry.ValueState == PropertyValueState.NullReference) { GUIHelper.PushGUIEnabled(GUI.enabled && entry.IsEditable); try { if (typeof(UnityEngine.Object).IsAssignableFrom(entry.TypeOfValue)) { entry.WeakSmartValue = label == null? EditorGUILayout.ObjectField((UnityEngine.Object) entry.WeakSmartValue, entry.TypeOfValue, entry.Property.Info.GetAttribute <AssetsOnlyAttribute>() == null) : EditorGUILayout.ObjectField(label, (UnityEngine.Object)entry.WeakSmartValue, entry.TypeOfValue, entry.Property.Info.GetAttribute <AssetsOnlyAttribute>() == null); } else { if (entry.SerializationBackend == SerializationBackend.Unity && entry.IsEditable && Event.current.type == EventType.Layout) { Debug.LogError("Unity-backed value is null. This should already be fixed by the FixUnityNullDrawer!"); } else { bool drawWithBox = ShouldDrawReferenceObjectPicker(entry); bool contextValue = isToggled.Value; if (drawWithBox) { SirenixEditorGUI.BeginBox(); SirenixEditorGUI.BeginBoxHeader(); { DrawObjectField(entry, label, ref contextValue); } SirenixEditorGUI.EndBoxHeader(); SirenixEditorGUI.EndBox(); } else { DrawObjectField(entry, label, ref contextValue, false); } isToggled.Value = contextValue; } } } finally { GUIHelper.PopGUIEnabled(); } } else { if (ShouldDrawReferenceObjectPicker(entry)) { SirenixEditorGUI.BeginBox(); SirenixEditorGUI.BeginBoxHeader(); { GUIHelper.PushGUIEnabled(GUI.enabled && entry.IsEditable); bool contextValue = isToggled.Value; DrawObjectField(entry, label, ref contextValue); isToggled.Value = contextValue; GUIHelper.PopGUIEnabled(); } SirenixEditorGUI.EndBoxHeader(); if (SirenixEditorGUI.BeginFadeGroup(UniqueDrawerKey.Create(entry, this), isToggled.Value)) { this.CallNextDrawer(entry.Property, null); } SirenixEditorGUI.EndFadeGroup(); SirenixEditorGUI.EndBox(); } else { this.CallNextDrawer(entry.Property, label); } } var objectPicker = ObjectPicker.GetObjectPicker(entry, entry.BaseValueType); if (objectPicker.IsReadyToClaim) { var obj = objectPicker.ClaimObject(); entry.Property.Tree.DelayActionUntilRepaint(() => entry.WeakSmartValue = obj); } }
/// <summary> /// Draws the property. /// </summary> protected override void DrawPropertyLayout(GUIContent label) { var entry = this.ValueEntry; this.dictionaryResolver = entry.Property.ChildResolver as StrongDictionaryPropertyResolver <TDictionary, TKey, TValue>; this.config = GeneralDrawerConfig.Instance; this.paging.NumberOfItemsPerPage = this.config.NumberOfItemsPrPage; listItemStyle.padding.right = !entry.IsEditable || this.attrSettings.IsReadOnly ? 4 : 20; SirenixEditorGUI.BeginIndentedVertical(SirenixGUIStyles.PropertyPadding); { this.paging.Update(elementCount: entry.Property.Children.Count); this.DrawToolbar(entry); this.paging.Update(elementCount: entry.Property.Children.Count); if (!this.disableAddKey && this.attrSettings.IsReadOnly == false) { this.DrawAddKey(entry); } float t; GUIHelper.BeginLayoutMeasuring(); if (SirenixEditorGUI.BeginFadeGroup(UniqueDrawerKey.Create(entry.Property, this), this.toggled.Value, out t)) { var rect = SirenixEditorGUI.BeginVerticalList(false); if (this.attrSettings.DisplayMode == DictionaryDisplayOptions.OneLine) { var maxWidth = rect.width - 90; rect.xMin = this.keyWidthOffset + 22; rect.xMax = rect.xMin + 10; this.keyWidthOffset = this.keyWidthOffset + SirenixEditorGUI.SlideRect(rect).x; if (Event.current.type == EventType.Repaint) { this.keyWidthOffset = Mathf.Clamp(this.keyWidthOffset, 90, maxWidth); } if (this.paging.ElementCount != 0) { var headerRect = SirenixEditorGUI.BeginListItem(false); { GUILayout.Space(14); if (Event.current.type == EventType.Repaint) { GUI.Label(headerRect.SetWidth(this.keyWidthOffset), this.keyLabel, SirenixGUIStyles.LabelCentered); GUI.Label(headerRect.AddXMin(this.keyWidthOffset), this.valueLabel, SirenixGUIStyles.LabelCentered); SirenixEditorGUI.DrawSolidRect(headerRect.AlignBottom(1), SirenixGUIStyles.BorderColor); } } SirenixEditorGUI.EndListItem(); } } GUIHelper.PushHierarchyMode(false); this.DrawElements(entry, label); GUIHelper.PopHierarchyMode(); SirenixEditorGUI.EndVerticalList(); } SirenixEditorGUI.EndFadeGroup(); // Draw borders var outerRect = GUIHelper.EndLayoutMeasuring(); if (t > 0.01f && Event.current.type == EventType.Repaint) { Color col = SirenixGUIStyles.BorderColor; outerRect.yMin -= 1; SirenixEditorGUI.DrawBorders(outerRect, 1, col); col.a *= t; if (this.attrSettings.DisplayMode == DictionaryDisplayOptions.OneLine) { // Draw Slide Rect Border outerRect.width = 1; outerRect.x += this.keyWidthOffset + 13; SirenixEditorGUI.DrawSolidRect(outerRect, col); } } } SirenixEditorGUI.EndIndentedVertical(); }
/// <summary> /// Draws the property. /// </summary> protected override void DrawPropertyLayout(IPropertyValueEntry <TDictionary> entry, GUIContent label) { var context = entry.Property.Context.Get(this, "context", (Context)null); if (context.Value == null) { context.Value = new Context(); context.Value.Toggled = entry.Context.GetPersistent(this, "Toggled", GeneralDrawerConfig.Instance.OpenListsByDefault); context.Value.KeyWidthOffset = 130; context.Value.Label = label ?? new GUIContent(typeof(TDictionary).GetNiceName()); context.Value.AttrSettings = entry.Property.Info.GetAttribute <DictionaryDrawerSettings>() ?? new DictionaryDrawerSettings(); context.Value.DisableAddKey = entry.Property.Tree.HasPrefabs && !entry.GetDictionaryHandler().SupportsPrefabModifications; if (!context.Value.DisableAddKey) { context.Value.TempKeyValue = new TempKeyValue(); var tree = PropertyTree.Create(context.Value.TempKeyValue); tree.UpdateTree(); context.Value.TempKeyEntry = (IPropertyValueEntry <TKey>)tree.GetPropertyAtPath("Key").ValueEntry; context.Value.TempValueEntry = (IPropertyValueEntry <TValue>)tree.GetPropertyAtPath("Value").ValueEntry; } } context.Value.DictionaryHandler = (DictionaryHandler <TDictionary, TKey, TValue>)entry.GetDictionaryHandler(); context.Value.Config = GeneralDrawerConfig.Instance; context.Value.Paging.NumberOfItemsPerPage = context.Value.Config.NumberOfItemsPrPage; context.Value.ListItemStyle.padding.right = !entry.IsEditable || context.Value.AttrSettings.IsReadOnly ? 4 : 20; //if (!IsSupportedKeyType) //{ // var message = entry.Property.Context.Get(this, "error_message", (string)null); // var detailedMessage = entry.Property.Context.Get(this, "error_message_detailed", (string)null); // var folded = entry.Property.Context.Get(this, "error_message_folded", true); // if (message.Value == null) // { // string str = ""; // if (label != null) // { // str += label.text + "\n\n"; // } // str += "The dictionary key type '" + typeof(TKey).GetNiceFullName() + "' is not supported in prefab instances. Expand this box to see which key types are supported."; // message.Value = str; // } // if (detailedMessage.Value == null) // { // var sb = new StringBuilder("The following key types are supported:"); // sb.AppendLine() // .AppendLine(); // foreach (var type in DictionaryKeyUtility.GetPersistentPathKeyTypes()) // { // sb.AppendLine(type.GetNiceName()); // } // sb.AppendLine("Enums of any type"); // detailedMessage.Value = sb.ToString(); // } // folded.Value = SirenixEditorGUI.DetailedMessageBox(message.Value, detailedMessage.Value, MessageType.Error, folded.Value); // return; //} SirenixEditorGUI.BeginIndentedVertical(SirenixGUIStyles.PropertyPadding); { context.Value.Paging.Update(elementCount: entry.Property.Children.Count); this.DrawToolbar(entry, context.Value); context.Value.Paging.Update(elementCount: entry.Property.Children.Count); if (!context.Value.DisableAddKey && context.Value.AttrSettings.IsReadOnly == false) { this.DrawAddKey(entry, context.Value); } float t; GUIHelper.BeginLayoutMeasuring(); if (SirenixEditorGUI.BeginFadeGroup(UniqueDrawerKey.Create(entry.Property, this), context.Value.Toggled.Value, out t)) { var rect = SirenixEditorGUI.BeginVerticalList(false); if (context.Value.AttrSettings.DisplayMode == DictionaryDisplayOptions.OneLine) { var maxWidth = rect.width - 90; rect.xMin = context.Value.KeyWidthOffset + 22; rect.xMax = rect.xMin + 10; context.Value.KeyWidthOffset = context.Value.KeyWidthOffset + SirenixEditorGUI.SlideRect(rect).x; if (Event.current.type == EventType.Repaint) { context.Value.KeyWidthOffset = Mathf.Clamp(context.Value.KeyWidthOffset, 90, maxWidth); } if (context.Value.Paging.ElementCount != 0) { var headerRect = SirenixEditorGUI.BeginListItem(false); { GUILayout.Space(14); if (Event.current.type == EventType.Repaint) { GUI.Label(headerRect.SetWidth(context.Value.KeyWidthOffset), context.Value.AttrSettings.KeyLabel, SirenixGUIStyles.LabelCentered); GUI.Label(headerRect.AddXMin(context.Value.KeyWidthOffset), context.Value.AttrSettings.ValueLabel, SirenixGUIStyles.LabelCentered); SirenixEditorGUI.DrawSolidRect(headerRect.AlignBottom(1), SirenixGUIStyles.BorderColor); } } SirenixEditorGUI.EndListItem(); } } this.DrawElements(entry, label, context.Value); SirenixEditorGUI.EndVerticalList(); } SirenixEditorGUI.EndFadeGroup(); // Draw borders var outerRect = GUIHelper.EndLayoutMeasuring(); if (t > 0.01f && Event.current.type == EventType.Repaint) { Color col = SirenixGUIStyles.BorderColor; outerRect.yMin -= 1; SirenixEditorGUI.DrawBorders(outerRect, 1, col); col.a *= t; if (context.Value.AttrSettings.DisplayMode == DictionaryDisplayOptions.OneLine) { // Draw Slide Rect Border outerRect.width = 1; outerRect.x += context.Value.KeyWidthOffset + 13; SirenixEditorGUI.DrawSolidRect(outerRect, col); } } } SirenixEditorGUI.EndIndentedVertical(); }
/// <summary> /// Draws the property. /// </summary> protected override void DrawPropertyLayout(GUIContent label) { var resolver = this.Property.ChildResolver as ICollectionResolver; bool isReadOnly = resolver.IsReadOnly; if (this.errorMessage != null) { SirenixEditorGUI.ErrorMessageBox(errorMessage); } if (info.Label == null || (label != null && label.text != info.Label.text)) { info.Label = new GUIContent(label == null || string.IsNullOrEmpty(label.text) ? Property.ValueEntry.TypeOfValue.GetNiceName() : label.text, label == null ? string.Empty : label.tooltip); } info.IsReadOnly = resolver.IsReadOnly; info.ListItemStyle.padding.left = info.Draggable ? 25 : 7; info.ListItemStyle.padding.right = info.IsReadOnly || info.HideRemoveButton ? 4 : 20; if (Event.current.type == EventType.Repaint) { info.DropZoneTopLeft = GUIUtility.GUIToScreenPoint(new Vector2(0, 0)); } info.CollectionResolver = Property.ChildResolver as ICollectionResolver; info.OrderedCollectionResolver = Property.ChildResolver as IOrderedCollectionResolver; info.Count = Property.Children.Count; info.IsEmpty = Property.Children.Count == 0; SirenixEditorGUI.BeginIndentedVertical(SirenixGUIStyles.PropertyPadding); this.BeginDropZone(); { this.DrawToolbar(); if (SirenixEditorGUI.BeginFadeGroup(UniqueDrawerKey.Create(Property, this), info.Toggled.Value)) { GUIHelper.PushLabelWidth(GUIHelper.BetterLabelWidth - info.ListItemStyle.padding.left); this.DrawItems(); GUIHelper.PopLabelWidth(); } SirenixEditorGUI.EndFadeGroup(); } this.EndDropZone(); SirenixEditorGUI.EndIndentedVertical(); if (info.OrderedCollectionResolver != null) { if (info.RemoveAt >= 0 && Event.current.type == EventType.Repaint) { try { if (info.CustomRemoveIndexFunction != null) { foreach (var parent in this.Property.ParentValues) { info.CustomRemoveIndexFunction( parent, info.RemoveAt); } } else if (info.CustomRemoveElementFunction != null) { for (int i = 0; i < this.Property.ParentValues.Count; i++) { info.CustomRemoveElementFunction( this.Property.ParentValues[i], this.Property.Children[info.RemoveAt].ValueEntry.WeakValues[i]); } } else { info.OrderedCollectionResolver.QueueRemoveAt(info.RemoveAt); } } finally { info.RemoveAt = -1; } GUIHelper.RequestRepaint(); } } else if (info.RemoveValues != null && Event.current.type == EventType.Repaint) { try { if (info.CustomRemoveElementFunction != null) { for (int i = 0; i < this.Property.ParentValues.Count; i++) { info.CustomRemoveElementFunction( this.Property.ParentValues[i], this.info.RemoveValues[i]); } } else { info.CollectionResolver.QueueRemove(info.RemoveValues); } } finally { info.RemoveValues = null; } GUIHelper.RequestRepaint(); } if (info.ObjectPicker != null && info.ObjectPicker.IsReadyToClaim && Event.current.type == EventType.Repaint) { var value = info.ObjectPicker.ClaimObject(); if (info.JumpToNextPageOnAdd) { info.StartIndex = int.MaxValue; } object[] values = new object[info.Property.Tree.WeakTargets.Count]; values[0] = value; for (int j = 1; j < values.Length; j++) { values[j] = SerializationUtility.CreateCopy(value); } info.CollectionResolver.QueueAdd(values); } }
/// <summary> /// Draws the property. /// </summary> protected override void DrawPropertyGroupLayout(InspectorProperty property, ToggleGroupAttribute attribute, GUIContent label) { var toggleProperty = property.Children.Get(attribute.ToggleMemberName); var context = property.Context.Get <ToggleGroupConfig>(this, "ToggleGroupConfig", (ToggleGroupConfig)null); if (context.Value == null) { context.Value = new ToggleGroupConfig(); context.Value.IsVisible = property.Context.GetPersistent <bool>(this, "IsVisible", false); if (toggleProperty == null) { context.Value.ErrorMessage = "No property or field named " + attribute.ToggleMemberName + " found. Make sure the property is part of the inspector and the group."; } else { context.Value.TitleHelper = new StringMemberHelper(property.ParentType, attribute.ToggleGroupTitle, ref context.Value.ErrorMessage); } } if (context.Value.ErrorMessage != null) { AllEditorGUI.ErrorMessageBox(context.Value.ErrorMessage); } else { PropertyContext <string> openGroup = null; if (attribute.CollapseOthersOnExpand) { if (property.Parent == null) { //openGroup = GUIHelper.GetTemporaryContext<PropertyContext<string>>(property.Tree); openGroup = property.Context.Get <string>(this, "OpenGroup", (string)null); } else { var parent = (property.Parent.ValueEntry == null || property.Parent.ValueEntry.ValueCategory == PropertyValueCategory.Member) ? property.Parent : property.Parent.Parent; openGroup = parent.Context.GetGlobal <string>("OpenFoldoutToggleGroup", (string)null); } if (openGroup.Value != null && openGroup.Value != property.Path) { context.Value.IsVisible.Value = false; } } bool isEnabled = (bool)toggleProperty.ValueEntry.WeakSmartValue; string title = context.Value.TitleHelper.GetString(property) ?? attribute.GroupName; bool prev = context.Value.IsVisible.Value; bool visibleBuffer = context.Value.IsVisible.Value; if (AllEditorGUI.BeginToggleGroup(UniqueDrawerKey.Create(property, this), ref isEnabled, ref visibleBuffer, title)) { for (int i = 0; i < property.Children.Count; i++) { var child = property.Children[i]; if (child != toggleProperty) { InspectorUtilities.DrawProperty(child); } } } else { // OnValueChanged is not fired if property is not drawn. GUIHelper.BeginDrawToNothing(); InspectorUtilities.DrawProperty(toggleProperty); GUIHelper.EndDrawToNothing(); } AllEditorGUI.EndToggleGroup(); context.Value.IsVisible.Value = visibleBuffer; if (openGroup != null && prev != context.Value.IsVisible.Value && context.Value.IsVisible.Value) { openGroup.Value = property.Path; } toggleProperty.ValueEntry.WeakSmartValue = isEnabled; // Why is this here? Commenting this out for now //toggleProperty.ValueEntry.ApplyChanges(); } }