private static void DoPropertyFieldKeyboardHandling(RuntimeSerializedProperty property) { // Delete & Duplicate commands if (Event.current.type == EventType.ExecuteCommand || Event.current.type == EventType.ValidateCommand) { if (GUIUtility.keyboardControl == EditorGUIUtilityHelper.s_LastControlID && (Event.current.commandName == EventCommandNamesHelper.Delete || Event.current.commandName == EventCommandNamesHelper.SoftDelete)) { if (Event.current.type == EventType.ExecuteCommand) { // Wait with deleting the property until the property stack is empty. See EndProperty. s_PendingPropertyDelete = property.Copy(); } Event.current.Use(); } if (GUIUtility.keyboardControl == EditorGUIUtilityHelper.s_LastControlID && Event.current.commandName == EventCommandNamesHelper.Duplicate) { if (Event.current.type == EventType.ExecuteCommand) { property.DuplicateCommand(); } Event.current.Use(); } } s_PendingPropertyKeyboardHandling = null; }
private void Initialize(RuntimeSerializedProperty property) { if (isInitialized) { return; } FindTargetProperties(property.Copy()); }
public static void SetExpandedRecurse(RuntimeSerializedProperty property, bool expanded) { RuntimeSerializedProperty search = property.Copy(); search.IsExpanded = expanded; int depth = search.Depth; while (search.NextVisible(true) && search.Depth > depth) { if (search.HasVisibleChildren) { search.IsExpanded = expanded; } } }
public float GetHeight(RuntimeSerializedProperty property, GUIContent label, bool includeChildren) { float height = 0; if (DecoratorDrawers != null && !IsCurrentlyNested) { foreach (var drawer in DecoratorDrawers) { height += drawer.GetHeight(); } } if (RuntimePropertyDrawer != null) { height += RuntimePropertyDrawer.GetPropertyHeightSafe(property, label ?? EditorGUIUtilityHelper.TempContent(property.DisplayName)); } else if (!includeChildren) { height += RuntimeEasyGUI.GetSinglePropertyHeight(property, label); } else { RuntimeSerializedProperty prop = property.Copy(); // First property with custom label height += RuntimeEasyGUI.GetSinglePropertyHeight(prop, label); bool childrenAreExpanded = prop.IsExpanded && RuntimeEasyGUI.HasVisibleChildFields(prop); // Loop through all child properties if (childrenAreExpanded) { RuntimeSerializedProperty endProperty = prop.GetEndProperty(); while (prop.NextVisible(childrenAreExpanded) && !RuntimeSerializedProperty.EqualContents(prop, endProperty)) { height += RuntimeScriptAttributeUtility.GetHandler(prop, null).GetHeight(prop, EditorGUIUtilityHelper.TempContent(prop.DisplayName), true); childrenAreExpanded = false; height += EasyGUI.kControlVerticalSpacing; } } } return(height); }
public bool OnGUI(Rect position, RuntimeSerializedProperty property, GUIContent label, bool includeChildren, Rect visibleArea) { float oldLabelWidth, oldFieldWidth; float propHeight = position.height; position.height = 0; if (DecoratorDrawers != null && !IsCurrentlyNested) { foreach (var decorator in DecoratorDrawers) { position.height = decorator.GetHeight(); oldLabelWidth = EditorGUIUtility.labelWidth; oldFieldWidth = EditorGUIUtility.fieldWidth; decorator.OnGUI(position); EditorGUIUtility.labelWidth = oldLabelWidth; EditorGUIUtility.fieldWidth = oldFieldWidth; position.y += position.height; propHeight -= position.height; } } position.height = propHeight; if (RuntimePropertyDrawer != null) { // Remember widths oldLabelWidth = EditorGUIUtility.labelWidth; oldFieldWidth = EditorGUIUtility.fieldWidth; // Draw with custom drawer RuntimePropertyDrawer.OnGUISafe(position, property, label ?? EditorGUIUtilityHelper.TempContent(property.DisplayName)); // Restore widths EditorGUIUtility.labelWidth = oldLabelWidth; EditorGUIUtility.fieldWidth = oldFieldWidth; return(false); } else { if (!includeChildren) { return(RuntimeEasyGUI.DefaultPropertyField(position, property, label)); } // Remember state Vector2 oldIconSize = EditorGUIUtility.GetIconSize(); bool wasEnabled = GUI.enabled; int origIndent = EditorGUI.indentLevel; int relIndent = origIndent - property.Depth; RuntimeSerializedProperty prop = property.Copy(); position.height = RuntimeEasyGUI.GetSinglePropertyHeight(property, label); // First property with custom label EditorGUI.indentLevel = property.Depth + relIndent; bool childrenAreExpanded = RuntimeEasyGUI.DefaultPropertyField(position, property, label) && RuntimeEasyGUI.HasVisibleChildFields(property); position.y += position.height + EasyGUI.kControlVerticalSpacing; // Loop through all child properties if (childrenAreExpanded) { RuntimeSerializedProperty endProperty = property.GetEndProperty(); while (prop.NextVisible(childrenAreExpanded) && !RuntimeSerializedProperty.EqualContents(prop, endProperty)) { var handler = RuntimeScriptAttributeUtility.GetHandler(prop, null); EditorGUI.indentLevel = prop.Depth + relIndent; position.height = handler.GetHeight(prop, null, false); if (position.Overlaps(visibleArea)) { EditorGUI.BeginChangeCheck(); childrenAreExpanded = handler.OnGUI(position, prop, null, false) && RuntimeEasyGUI.HasVisibleChildFields(prop); // Changing child properties (like array size) may invalidate the iterator, // so stop now, or we may get errors. if (EditorGUI.EndChangeCheck()) { break; } } position.y += position.height + EasyGUI.kControlVerticalSpacing; } } // Restore state GUI.enabled = wasEnabled; EditorGUIUtility.SetIconSize(oldIconSize); EditorGUI.indentLevel = origIndent; return(false); } }