Skip to content

Commit

Permalink
Merge pull request #54 from mackysoft/fix/dropdown-overlap
Browse files Browse the repository at this point in the history
Fix dropdown overlap in Unity 2023.2
  • Loading branch information
mackysoft committed Feb 17, 2024
2 parents 7f424c0 + 5f54c25 commit e5627b1
Show file tree
Hide file tree
Showing 4 changed files with 88 additions and 22 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,17 @@
using UnityEditor;
using UnityEngine;

namespace MackySoft.SerializeReferenceExtensions.Editor {
namespace MackySoft.SerializeReferenceExtensions.Editor
{

public static class ManagedReferenceUtility {

public static object SetManagedReference (this SerializedProperty property,Type type) {
object result = null;

#if UNITY_2021_3_OR_NEWER
// NOTE: managedReferenceValue getter is available only in Unity 2021.3 or later.
if (property.managedReferenceValue != null && type != null)
if ((type != null) && (property.managedReferenceValue != null))
{
// Restore an previous values from json.
string json = JsonUtility.ToJson(property.managedReferenceValue);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
#if UNITY_2019_3_OR_NEWER
using System.Collections.Generic;
using UnityEditor;

namespace MackySoft.SerializeReferenceExtensions.Editor
{
public static class SerializedPropertyExtensions
{
public static IEnumerable<SerializedProperty> GetChildProperties (this SerializedProperty parent, int depth = 1)
{
parent = parent.Copy();

int depthOfParent = parent.depth;
var enumerator = parent.GetEnumerator();

while (enumerator.MoveNext())
{
if (enumerator.Current is not SerializedProperty childProperty)
{
continue;
}
if (childProperty.depth > (depthOfParent + depth))
{
continue;
}
yield return childProperty.Copy();
}
}
}
}
#endif

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -31,51 +31,74 @@ struct TypePopupCache {

SerializedProperty m_TargetProperty;

public override void OnGUI (Rect position,SerializedProperty property,GUIContent label) {
EditorGUI.BeginProperty(position,label,property);

if (property.propertyType == SerializedPropertyType.ManagedReference) {
public override void OnGUI (Rect position, SerializedProperty property, GUIContent label)
{
EditorGUI.BeginProperty(position, label, property);

// render label first to avoid label overlap for lists
if (property.propertyType == SerializedPropertyType.ManagedReference)
{
// Render label first to avoid label overlap for lists
Rect foldoutLabelRect = new Rect(position);
foldoutLabelRect.height = EditorGUIUtility.singleLineHeight;
foldoutLabelRect.x += EditorGUI.indentLevel * 12;
foldoutLabelRect = EditorGUI.IndentedRect(foldoutLabelRect);
Rect popupPosition = EditorGUI.PrefixLabel(foldoutLabelRect, label);

// Draw the subclass selector popup.
if (EditorGUI.DropdownButton(popupPosition,GetTypeName(property),FocusType.Keyboard)) {
if (EditorGUI.DropdownButton(popupPosition, GetTypeName(property), FocusType.Keyboard))
{
TypePopupCache popup = GetTypePopup(property);
m_TargetProperty = property;
popup.TypePopup.Show(popupPosition);
}

// Check if a custom property drawer exists for this type.
PropertyDrawer customDrawer = GetCustomPropertyDrawer(property);
if (customDrawer != null)
// Draw the foldout.
if (!string.IsNullOrEmpty(property.managedReferenceFullTypename))
{
// Draw the property with custom property drawer.
Rect foldoutRect = new Rect(position);
foldoutRect.height = EditorGUIUtility.singleLineHeight;
foldoutRect.x -= 12;
property.isExpanded = EditorGUI.Foldout(foldoutRect, property.isExpanded, GUIContent.none, true);
}

if (property.isExpanded)
// Draw property if expanded.
if (property.isExpanded)
{
using (new EditorGUI.IndentLevelScope())
{
using (new EditorGUI.IndentLevelScope())
// Check if a custom property drawer exists for this type.
PropertyDrawer customDrawer = GetCustomPropertyDrawer(property);
if (customDrawer != null)
{
// Draw the property with custom property drawer.
Rect indentedRect = position;
float foldoutDifference = EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
indentedRect.height = customDrawer.GetPropertyHeight(property, label);
indentedRect.y += foldoutDifference;
customDrawer.OnGUI(indentedRect, property, label);
}
else
{
// Draw the properties of the child elements.
// NOTE: In the following code, since the foldout layout isn't working properly, I'll iterate through the properties of the child elements myself.
// EditorGUI.PropertyField(position, property, GUIContent.none, true);

Rect childPosition = position;
childPosition.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
foreach (SerializedProperty childProperty in property.GetChildProperties())
{
float height = EditorGUI.GetPropertyHeight(childProperty, new GUIContent(childProperty.displayName, childProperty.tooltip), true);
childPosition.height = height;
EditorGUI.PropertyField(childPosition, childProperty, true);

childPosition.y += height + EditorGUIUtility.standardVerticalSpacing;
}
}
}
}
else
{
EditorGUI.PropertyField(position, property, GUIContent.none, true);
}
} else {
EditorGUI.LabelField(position,label,k_IsNotManagedReferenceLabel);
}
else
{
EditorGUI.LabelField(position, label, k_IsNotManagedReferenceLabel);
}

EditorGUI.EndProperty();
Expand Down Expand Up @@ -117,7 +140,6 @@ PropertyDrawer GetCustomPropertyDrawer (SerializedProperty property)
foreach (var targetObject in m_TargetProperty.serializedObject.targetObjects) {
SerializedObject individualObject = new SerializedObject(targetObject);
SerializedProperty individualProperty = individualObject.FindProperty(m_TargetProperty.propertyPath);
object obj = individualProperty.SetManagedReference(type);
individualProperty.isExpanded = (obj != null);
Expand Down

0 comments on commit e5627b1

Please sign in to comment.