Skip to content

Commit 92d5047

Browse files
committed
Fix AmbiguousMatchException while searching for overrided fields & properties; expose OnToolbarGuiRight callback
1 parent 5ee484f commit 92d5047

File tree

3 files changed

+82
-24
lines changed

3 files changed

+82
-24
lines changed

Assets/Editor Toolbox/Editor/ToolboxEditorToolbar.cs

Lines changed: 49 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ static ToolboxEditorToolbar()
5353

5454
private static IEnumerator Initialize()
5555
{
56-
while (ToolboxEditorToolbar.toolbar == null)
56+
while (toolbar == null)
5757
{
5858
var toolbars = Resources.FindObjectsOfTypeAll(toolbarType);
5959
if (toolbars == null || toolbars.Length == 0)
@@ -63,15 +63,15 @@ private static IEnumerator Initialize()
6363
}
6464
else
6565
{
66-
ToolboxEditorToolbar.toolbar = toolbars[0];
66+
toolbar = toolbars[0];
6767
}
6868
}
6969

7070
#if UNITY_2021_1_OR_NEWER
71-
var rootField = ToolboxEditorToolbar.toolbar.GetType().GetField("m_Root", BindingFlags.NonPublic | BindingFlags.Instance);
72-
var root = rootField.GetValue(ToolboxEditorToolbar.toolbar) as VisualElement;
73-
var toolbar = root.Q("ToolbarZoneLeftAlign");
71+
var rootField = toolbar.GetType().GetField("m_Root", BindingFlags.NonPublic | BindingFlags.Instance);
72+
var root = rootField.GetValue(toolbar) as VisualElement;
7473

74+
var toolbarLeftZone = root.Q("ToolbarZoneLeftAlign");
7575
var element = new VisualElement()
7676
{
7777
style =
@@ -83,10 +83,25 @@ private static IEnumerator Initialize()
8383

8484
var container = new IMGUIContainer();
8585
container.style.flexGrow = 1;
86-
container.onGUIHandler += OnGui;
87-
86+
container.onGUIHandler += OnGuiLeft;
8887
element.Add(container);
89-
toolbar.Add(element);
88+
toolbarLeftZone.Add(element);
89+
90+
var toolbarRightZone = root.Q("ToolbarZoneRightAlign");
91+
var rightElement = new VisualElement()
92+
{
93+
style =
94+
{
95+
flexGrow = 1,
96+
flexDirection = FlexDirection.Row,
97+
}
98+
};
99+
100+
var rightContainer = new IMGUIContainer();
101+
rightContainer.style.flexGrow = 1;
102+
rightContainer.onGUIHandler += OnGuiRight;
103+
rightElement.Add(rightContainer);
104+
toolbarRightZone.Add(rightElement);
90105
#else
91106
#if UNITY_2020_1_OR_NEWER
92107
var backend = guiBackend.GetValue(toolbar);
@@ -101,23 +116,23 @@ private static IEnumerator Initialize()
101116
var container = elements[0] as IMGUIContainer;
102117
#endif
103118
var handler = onGuiHandler.GetValue(container) as Action;
104-
handler -= OnGui;
105-
handler += OnGui;
119+
handler -= OnGuiLeft;
120+
handler += OnGuiLeft;
106121
onGuiHandler.SetValue(container, handler);
107122
#endif
108123
}
109124

110-
private static void OnGui()
125+
private static void OnGuiLeft()
111126
{
112-
if (!IsToolbarAllowed || !IsToolbarValid)
127+
if (!IsToolbarAllowed || !IsLeftToolbarValid)
113128
{
114129
return;
115130
}
116131

117132
#if UNITY_2021_1_OR_NEWER
118133
using (new GUILayout.HorizontalScope())
119134
{
120-
OnToolbarGui.Invoke();
135+
OnToolbarGuiLeft();
121136
}
122137
#else
123138
var screenWidth = EditorGUIUtility.currentViewWidth;
@@ -139,12 +154,25 @@ private static void OnGui()
139154
{
140155
using (new GUILayout.HorizontalScope())
141156
{
142-
OnToolbarGui?.Invoke();
157+
OnToolbarGuiLeft();
143158
}
144159
}
145160
#endif
146161
}
147162

163+
private static void OnGuiRight()
164+
{
165+
if (!IsToolbarAllowed || !IsRightToolbarValid)
166+
{
167+
return;
168+
}
169+
170+
using (new EditorGUILayout.HorizontalScope())
171+
{
172+
OnToolbarGuiRight();
173+
}
174+
}
175+
148176
public static void Repaint()
149177
{
150178
if (toolbar == null)
@@ -156,11 +184,17 @@ public static void Repaint()
156184
}
157185

158186
public static bool IsToolbarAllowed { get; set; } = true;
159-
public static bool IsToolbarValid => toolbar != null && OnToolbarGui != null;
187+
public static bool IsLeftToolbarValid => toolbar != null && OnToolbarGuiLeft != null;
188+
public static bool IsRightToolbarValid => toolbar != null && OnToolbarGuiRight != null;
160189
public static float FromToolsOffset { get; set; } = 400.0f;
161190
public static float FromStripOffset { get; set; } = 150.0f;
162191

192+
#pragma warning disable 0067
193+
[Obsolete("Use OnToolbarGuiLeft instead")]
163194
public static event Action OnToolbarGui;
195+
#pragma warning restore 0067
196+
public static event Action OnToolbarGuiLeft;
197+
public static event Action OnToolbarGuiRight;
164198

165199
private static class Style
166200
{

Assets/Editor Toolbox/Editor/Utilities/ReflectionUtility.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,9 @@ internal static FieldInfo GetField(Type targetType, string fieldName)
2020

2121
internal static FieldInfo GetField(Type targetType, string fieldName, BindingFlags bindingFlags)
2222
{
23+
bindingFlags |= BindingFlags.DeclaredOnly;
2324
var field = targetType.GetField(fieldName, bindingFlags);
24-
if (field == null && bindingFlags.HasFlag(BindingFlags.NonPublic))
25+
if (field == null)
2526
{
2627
//NOTE: if a method is not found and we searching for a private method we should look into parent classes
2728
Type baseType = targetType.BaseType;
@@ -103,8 +104,9 @@ internal static PropertyInfo GetProperty(Type targetType, string propertyName)
103104

104105
internal static PropertyInfo GetProperty(Type targetType, string propertyName, BindingFlags bindingFlags)
105106
{
107+
bindingFlags |= BindingFlags.DeclaredOnly;
106108
var property = targetType.GetProperty(propertyName, bindingFlags);
107-
if (property == null && bindingFlags.HasFlag(BindingFlags.NonPublic))
109+
if (property == null)
108110
{
109111
//NOTE: if a method is not found and we searching for a private method we should look into parent classes
110112
Type baseType = targetType.BaseType;

Assets/Examples/Editor/SampleToolbar.cs

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ public static class SampleToolbar
1010
/// <summary>
1111
/// This field will be used to exclude toolbar buttons for all scenes except this one.
1212
/// </summary>
13-
private readonly static string mySampleSceneName = "SampleScene";
13+
private static readonly string mySampleSceneName = "SampleScene";
1414

1515
static SampleToolbar()
1616
{
@@ -43,19 +43,18 @@ private static void ValidateFirstScene()
4343
/// <param name="mode"></param>
4444
private static void SceneOpenedCallback(Scene scene, OpenSceneMode mode)
4545
{
46-
ToolboxEditorToolbar.OnToolbarGui -= OnToolbarGui;
46+
ToolboxEditorToolbar.OnToolbarGuiLeft -= OnToolbarGuiLeft;
47+
ToolboxEditorToolbar.OnToolbarGuiRight -= OnToolbarGuiRight;
4748
if (scene.name != mySampleSceneName)
4849
{
4950
return;
5051
}
5152

52-
ToolboxEditorToolbar.OnToolbarGui += OnToolbarGui;
53+
ToolboxEditorToolbar.OnToolbarGuiLeft += OnToolbarGuiLeft;
54+
ToolboxEditorToolbar.OnToolbarGuiRight += OnToolbarGuiRight;
5355
}
5456

55-
/// <summary>
56-
/// Layout-based GUI call.
57-
/// </summary>
58-
private static void OnToolbarGui()
57+
private static void OnToolbarGuiLeft()
5958
{
6059
GUILayout.FlexibleSpace();
6160
if (GUILayout.Button("1", Style.commandLeftStyle))
@@ -79,6 +78,29 @@ private static void OnToolbarGui()
7978
}
8079
}
8180

81+
private static void OnToolbarGuiRight()
82+
{
83+
if (GUILayout.Button("1"))
84+
{
85+
Debug.Log("1");
86+
}
87+
88+
if (GUILayout.Button("2"))
89+
{
90+
Debug.Log("2");
91+
}
92+
93+
if (GUILayout.Button("3"))
94+
{
95+
Debug.Log("3");
96+
}
97+
98+
if (GUILayout.Button("4"))
99+
{
100+
Debug.Log("4");
101+
}
102+
}
103+
82104
private static class Style
83105
{
84106
internal static readonly GUIStyle commandMidStyle = new GUIStyle("CommandMid")

0 commit comments

Comments
 (0)