Skip to content

Commit 5913ab7

Browse files
committed
feat: added passing serialized property to CustomObjectDrawer and Dropdown
1 parent aba0c30 commit 5913ab7

File tree

5 files changed

+50
-46
lines changed

5 files changed

+50
-46
lines changed

Editor/Drawers/CustomObjectDrawer.cs

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,13 @@ namespace TNRD.Drawers
55
{
66
public partial class CustomObjectDrawer
77
{
8-
public delegate void ButtonClickedDelegate(Rect position);
8+
public delegate void ButtonClickedDelegate(Rect position, SerializedProperty property);
99

10-
public delegate void ClickedDelegate();
10+
public delegate void ClickedDelegate(SerializedProperty property);
1111

12-
public delegate void DeletePressedDelegate();
12+
public delegate void DeletePressedDelegate(SerializedProperty property);
1313

14-
public delegate void PropertiesClickedDelegate();
14+
public delegate void PropertiesClickedDelegate(SerializedProperty property);
1515

1616
private bool isSelected;
1717

@@ -21,18 +21,18 @@ public partial class CustomObjectDrawer
2121
public event ClickedDelegate Clicked;
2222
public event DeletePressedDelegate DeletePressed;
2323
public event PropertiesClickedDelegate PropertiesClicked;
24-
25-
public void OnGUI(Rect position, GUIContent label, GUIContent content)
24+
25+
public void OnGUI(Rect position, GUIContent label, GUIContent content, SerializedProperty property)
2626
{
2727
Rect positionWithoutThumb = new Rect(position);
2828
positionWithoutThumb.xMax -= 20;
2929

3030
position = DrawPrefixLabel(position, label);
3131
DrawObjectField(position, content);
32-
DrawButton(position);
32+
DrawButton(position, property);
3333

34-
HandleMouseDown(position, positionWithoutThumb);
35-
HandleKeyDown();
34+
HandleMouseDown(position, positionWithoutThumb, property);
35+
HandleKeyDown(property);
3636
}
3737

3838
private Rect DrawPrefixLabel(Rect position, GUIContent label)
@@ -66,7 +66,7 @@ private void ForceRepaintEditors()
6666
}
6767
}
6868

69-
private void DrawButton(Rect position)
69+
private void DrawButton(Rect position, SerializedProperty property)
7070
{
7171
Rect buttonRect = new Rect(position);
7272
buttonRect.yMin += 1;
@@ -76,11 +76,11 @@ private void DrawButton(Rect position)
7676

7777
if (GUI.Button(buttonRect, string.Empty, "objectFieldButton"))
7878
{
79-
ButtonClicked?.Invoke(position);
79+
ButtonClicked?.Invoke(position, property);
8080
}
8181
}
8282

83-
private void HandleMouseDown(Rect position, Rect positionWithoutThumb)
83+
private void HandleMouseDown(Rect position, Rect positionWithoutThumb, SerializedProperty property)
8484
{
8585
if (Event.type != EventType.MouseDown)
8686
return;
@@ -89,26 +89,26 @@ private void HandleMouseDown(Rect position, Rect positionWithoutThumb)
8989
{
9090
isSelected = positionWithoutThumb.Contains(Event.mousePosition);
9191
ForceRepaintEditors();
92-
Clicked?.Invoke();
92+
Clicked?.Invoke(property);
9393
}
9494
else if (Event.button == 1 && positionWithoutThumb.Contains(Event.mousePosition))
9595
{
9696
GenericMenu menu = new GenericMenu();
97-
menu.AddItem(new GUIContent("Clear"), false, () => { DeletePressed?.Invoke(); });
98-
menu.AddItem(new GUIContent("Properties..."), false, () => { PropertiesClicked?.Invoke(); });
97+
menu.AddItem(new GUIContent("Clear"), false, () => { DeletePressed?.Invoke(property); });
98+
menu.AddItem(new GUIContent("Properties..."), false, () => { PropertiesClicked?.Invoke(property); });
9999
menu.DropDown(position);
100100
Event.Use();
101101
}
102102
}
103103

104-
private void HandleKeyDown()
104+
private void HandleKeyDown(SerializedProperty property)
105105
{
106106
if (!isSelected)
107107
return;
108108

109109
if (Event.type == EventType.KeyDown && Event.keyCode == KeyCode.Delete)
110110
{
111-
DeletePressed?.Invoke();
111+
DeletePressed?.Invoke(property);
112112
}
113113
}
114114
}

Editor/Drawers/RawReferenceDrawer.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public void OnGUI(Rect position)
4545
? EditorGUIUtility.ObjectContent((MonoScript)null, typeof(MonoScript))
4646
: new GUIContent(rawReferenceValue.GetType().Name, IconUtility.ScriptIcon);
4747

48-
CustomObjectDrawer.OnGUI(objectFieldRect, label, content);
48+
CustomObjectDrawer.OnGUI(objectFieldRect, label, content, Property);
4949

5050
HandleDragAndDrop(objectFieldRect);
5151

@@ -79,13 +79,13 @@ private void DrawLine(Rect position)
7979
EditorGUI.DrawRect(line, Styles.LineColor);
8080
}
8181

82-
protected override void PingObject()
82+
protected override void PingObject(SerializedProperty property)
8383
{
8484
// No support for pinging raw objects for now (I guess this would ping the MonoScript?)
8585
}
8686

8787
/// <inheritdoc />
88-
protected override void OnPropertiesClicked()
88+
protected override void OnPropertiesClicked(SerializedProperty property)
8989
{
9090
if (RawReferenceValue == null)
9191
return;

Editor/Drawers/ReferenceDrawer.cs

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -67,18 +67,18 @@ protected void Initialize(SerializedProperty property, Type genericType, FieldIn
6767
FieldInfo = fieldInfo;
6868
}
6969

70-
private void OnButtonClicked(Rect position)
70+
private void OnButtonClicked(Rect position, SerializedProperty property)
7171
{
7272
AdvancedDropdownState state = new AdvancedDropdownState();
7373
SerializableInterfaceAdvancedDropdown dropdown =
74-
new SerializableInterfaceAdvancedDropdown(state, GenericType, GetRelevantScene());
74+
new SerializableInterfaceAdvancedDropdown(state, GenericType, GetRelevantScene(property), property);
7575
dropdown.ItemSelectedEvent += OnItemSelected;
7676
dropdown.Show(position);
7777
}
7878

79-
private Scene? GetRelevantScene()
79+
private static Scene? GetRelevantScene(SerializedProperty property)
8080
{
81-
Object target = Property.serializedObject.targetObject;
81+
Object target = property.serializedObject.targetObject;
8282

8383
if (target is ScriptableObject)
8484
return null;
@@ -90,30 +90,30 @@ private void OnButtonClicked(Rect position)
9090
return null;
9191
}
9292

93-
private void OnClicked()
93+
private void OnClicked(SerializedProperty property)
9494
{
95-
PingObject();
95+
PingObject(property);
9696
}
9797

98-
private void OnDeletePressed()
98+
private void OnDeletePressed(SerializedProperty property)
9999
{
100-
ModeValue = default;
101-
PropertyValue = null;
100+
SetModeValue(property, default);
101+
SetPropertyValue(property, null);
102102
}
103103

104-
private void OnItemSelected(ReferenceMode mode, object reference)
104+
private void OnItemSelected(SerializedProperty property, ReferenceMode mode, object reference)
105105
{
106-
ModeValue = mode;
107-
PropertyValue = reference;
106+
SetModeValue(property, mode);
107+
SetPropertyValue(property, reference);
108108
}
109109

110-
protected abstract void OnPropertiesClicked();
110+
protected abstract void OnPropertiesClicked(SerializedProperty property);
111111

112112
protected void HandleDragAndDrop(Rect position)
113113
{
114114
if (!position.Contains(Event.current.mousePosition))
115115
return;
116-
116+
117117
if (Event.current.type == EventType.DragPerform)
118118
{
119119
HandleDragUpdated();
@@ -200,12 +200,12 @@ private void HandleDragPerform()
200200

201201
private Object GetUnityObject(Object objectReference)
202202
{
203-
if(objectReference is GameObject gameObject)
203+
if (objectReference is GameObject gameObject)
204204
return gameObject.GetComponent(GenericType);
205205
return objectReference;
206206
}
207207

208-
protected abstract void PingObject();
208+
protected abstract void PingObject(SerializedProperty property);
209209

210210
protected ReferenceMode GetModeValue(SerializedProperty property)
211211
{

Editor/Drawers/UnityReferenceDrawer.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,18 +27,18 @@ public void OnGUI(Rect position)
2727
Object unityReference = UnityReferenceProperty.objectReferenceValue;
2828
Type referenceType = unityReference == null ? typeof(Object) : unityReference.GetType();
2929
GUIContent objectContent = EditorGUIUtility.ObjectContent(unityReference, referenceType);
30-
CustomObjectDrawer.OnGUI(position, label, objectContent);
30+
CustomObjectDrawer.OnGUI(position, label, objectContent, Property);
3131
HandleDragAndDrop(position);
3232
}
3333

34-
protected override void PingObject()
34+
protected override void PingObject(SerializedProperty property)
3535
{
36-
EditorGUIUtility.PingObject((Object)PropertyValue);
36+
EditorGUIUtility.PingObject((Object)GetPropertyValue(property));
3737
}
3838

39-
protected override void OnPropertiesClicked()
39+
protected override void OnPropertiesClicked(SerializedProperty property)
4040
{
41-
PropertyEditorUtility.Show(UnityReferenceProperty.objectReferenceValue);
41+
PropertyEditorUtility.Show(property.UnityReferenceProperty().objectReferenceValue);
4242
}
4343
}
4444
}

Editor/Utilities/SerializableInterfaceAdvancedDropdown.cs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using System.Reflection;
44
using TNRD.Builders;
55
using TNRD.Items;
6+
using UnityEditor;
67
using UnityEditor.IMGUI.Controls;
78
using UnityEngine;
89
using UnityEngine.Assertions;
@@ -16,16 +17,18 @@ internal sealed class SerializableInterfaceAdvancedDropdown : AdvancedDropdown
1617
private readonly MethodInfo sortChildrenMethod;
1718
private readonly bool canSort;
1819
private readonly Scene? relevantScene;
20+
private readonly SerializedProperty property;
1921

20-
public delegate void ItemSelectedDelegate(ReferenceMode mode, object reference);
22+
public delegate void ItemSelectedDelegate(SerializedProperty property, ReferenceMode mode, object reference);
2123

2224
public event ItemSelectedDelegate ItemSelectedEvent; // Suffixed with Event because of the override
2325

2426
/// <inheritdoc />
2527
public SerializableInterfaceAdvancedDropdown(
2628
AdvancedDropdownState state,
2729
Type interfaceType,
28-
Scene? relevantScene
30+
Scene? relevantScene,
31+
SerializedProperty property
2932
)
3033
: base(state)
3134
{
@@ -38,6 +41,7 @@ public SerializableInterfaceAdvancedDropdown(
3841
minimumSize = new Vector2(0, 300);
3942
this.interfaceType = interfaceType;
4043
this.relevantScene = relevantScene;
44+
this.property = property;
4145
}
4246

4347
/// <inheritdoc />
@@ -52,7 +56,7 @@ protected override AdvancedDropdownItem BuildRoot()
5256
{
5357
dropdownItem.AddChild(new NoneDropdownItem());
5458
}
55-
59+
5660
if (canSort)
5761
{
5862
sortChildrenMethod.Invoke(item,
@@ -72,7 +76,7 @@ private int Sort(AdvancedDropdownItem a, AdvancedDropdownItem b)
7276
return -1;
7377
if (b is NoneDropdownItem)
7478
return 1;
75-
79+
7680
int childrenA = a.children.Count();
7781
int childrenB = b.children.Count();
7882

@@ -90,7 +94,7 @@ protected override void ItemSelected(AdvancedDropdownItem item)
9094
{
9195
if (item is IDropdownItem dropdownItem)
9296
{
93-
ItemSelectedEvent?.Invoke(dropdownItem.Mode, dropdownItem.GetValue());
97+
ItemSelectedEvent?.Invoke(property, dropdownItem.Mode, dropdownItem.GetValue());
9498
}
9599
}
96100
}

0 commit comments

Comments
 (0)