Skip to content

Commit

Permalink
Fix AmbiguousMatchException while searching for overrided fields & pr…
Browse files Browse the repository at this point in the history
…operties; expose OnToolbarGuiRight callback
  • Loading branch information
arimger committed Feb 22, 2025
1 parent 5ee484f commit 92d5047
Show file tree
Hide file tree
Showing 3 changed files with 82 additions and 24 deletions.
64 changes: 49 additions & 15 deletions Assets/Editor Toolbox/Editor/ToolboxEditorToolbar.cs
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ static ToolboxEditorToolbar()

private static IEnumerator Initialize()
{
while (ToolboxEditorToolbar.toolbar == null)
while (toolbar == null)
{
var toolbars = Resources.FindObjectsOfTypeAll(toolbarType);
if (toolbars == null || toolbars.Length == 0)
Expand All @@ -63,15 +63,15 @@ private static IEnumerator Initialize()
}
else
{
ToolboxEditorToolbar.toolbar = toolbars[0];
toolbar = toolbars[0];
}
}

#if UNITY_2021_1_OR_NEWER
var rootField = ToolboxEditorToolbar.toolbar.GetType().GetField("m_Root", BindingFlags.NonPublic | BindingFlags.Instance);
var root = rootField.GetValue(ToolboxEditorToolbar.toolbar) as VisualElement;
var toolbar = root.Q("ToolbarZoneLeftAlign");
var rootField = toolbar.GetType().GetField("m_Root", BindingFlags.NonPublic | BindingFlags.Instance);
var root = rootField.GetValue(toolbar) as VisualElement;

var toolbarLeftZone = root.Q("ToolbarZoneLeftAlign");
var element = new VisualElement()
{
style =
Expand All @@ -83,10 +83,25 @@ private static IEnumerator Initialize()

var container = new IMGUIContainer();
container.style.flexGrow = 1;
container.onGUIHandler += OnGui;

container.onGUIHandler += OnGuiLeft;
element.Add(container);
toolbar.Add(element);
toolbarLeftZone.Add(element);

var toolbarRightZone = root.Q("ToolbarZoneRightAlign");
var rightElement = new VisualElement()
{
style =
{
flexGrow = 1,
flexDirection = FlexDirection.Row,
}
};

var rightContainer = new IMGUIContainer();
rightContainer.style.flexGrow = 1;
rightContainer.onGUIHandler += OnGuiRight;
rightElement.Add(rightContainer);
toolbarRightZone.Add(rightElement);
#else
#if UNITY_2020_1_OR_NEWER
var backend = guiBackend.GetValue(toolbar);
Expand All @@ -101,23 +116,23 @@ private static IEnumerator Initialize()
var container = elements[0] as IMGUIContainer;
#endif
var handler = onGuiHandler.GetValue(container) as Action;
handler -= OnGui;
handler += OnGui;
handler -= OnGuiLeft;
handler += OnGuiLeft;
onGuiHandler.SetValue(container, handler);
#endif
}

private static void OnGui()
private static void OnGuiLeft()
{
if (!IsToolbarAllowed || !IsToolbarValid)
if (!IsToolbarAllowed || !IsLeftToolbarValid)
{
return;
}

#if UNITY_2021_1_OR_NEWER
using (new GUILayout.HorizontalScope())
{
OnToolbarGui.Invoke();
OnToolbarGuiLeft();
}
#else
var screenWidth = EditorGUIUtility.currentViewWidth;
Expand All @@ -139,12 +154,25 @@ private static void OnGui()
{
using (new GUILayout.HorizontalScope())
{
OnToolbarGui?.Invoke();
OnToolbarGuiLeft();
}
}
#endif
}

private static void OnGuiRight()
{
if (!IsToolbarAllowed || !IsRightToolbarValid)
{
return;
}

using (new EditorGUILayout.HorizontalScope())
{
OnToolbarGuiRight();
}
}

public static void Repaint()
{
if (toolbar == null)
Expand All @@ -156,11 +184,17 @@ public static void Repaint()
}

public static bool IsToolbarAllowed { get; set; } = true;
public static bool IsToolbarValid => toolbar != null && OnToolbarGui != null;
public static bool IsLeftToolbarValid => toolbar != null && OnToolbarGuiLeft != null;
public static bool IsRightToolbarValid => toolbar != null && OnToolbarGuiRight != null;
public static float FromToolsOffset { get; set; } = 400.0f;
public static float FromStripOffset { get; set; } = 150.0f;

#pragma warning disable 0067
[Obsolete("Use OnToolbarGuiLeft instead")]
public static event Action OnToolbarGui;
#pragma warning restore 0067
public static event Action OnToolbarGuiLeft;
public static event Action OnToolbarGuiRight;

private static class Style
{
Expand Down
6 changes: 4 additions & 2 deletions Assets/Editor Toolbox/Editor/Utilities/ReflectionUtility.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,9 @@ internal static FieldInfo GetField(Type targetType, string fieldName)

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

internal static PropertyInfo GetProperty(Type targetType, string propertyName, BindingFlags bindingFlags)
{
bindingFlags |= BindingFlags.DeclaredOnly;
var property = targetType.GetProperty(propertyName, bindingFlags);
if (property == null && bindingFlags.HasFlag(BindingFlags.NonPublic))
if (property == null)
{
//NOTE: if a method is not found and we searching for a private method we should look into parent classes
Type baseType = targetType.BaseType;
Expand Down
36 changes: 29 additions & 7 deletions Assets/Examples/Editor/SampleToolbar.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ public static class SampleToolbar
/// <summary>
/// This field will be used to exclude toolbar buttons for all scenes except this one.
/// </summary>
private readonly static string mySampleSceneName = "SampleScene";
private static readonly string mySampleSceneName = "SampleScene";

static SampleToolbar()
{
Expand Down Expand Up @@ -43,19 +43,18 @@ private static void ValidateFirstScene()
/// <param name="mode"></param>
private static void SceneOpenedCallback(Scene scene, OpenSceneMode mode)
{
ToolboxEditorToolbar.OnToolbarGui -= OnToolbarGui;
ToolboxEditorToolbar.OnToolbarGuiLeft -= OnToolbarGuiLeft;
ToolboxEditorToolbar.OnToolbarGuiRight -= OnToolbarGuiRight;
if (scene.name != mySampleSceneName)
{
return;
}

ToolboxEditorToolbar.OnToolbarGui += OnToolbarGui;
ToolboxEditorToolbar.OnToolbarGuiLeft += OnToolbarGuiLeft;
ToolboxEditorToolbar.OnToolbarGuiRight += OnToolbarGuiRight;
}

/// <summary>
/// Layout-based GUI call.
/// </summary>
private static void OnToolbarGui()
private static void OnToolbarGuiLeft()
{
GUILayout.FlexibleSpace();
if (GUILayout.Button("1", Style.commandLeftStyle))
Expand All @@ -79,6 +78,29 @@ private static void OnToolbarGui()
}
}

private static void OnToolbarGuiRight()
{
if (GUILayout.Button("1"))
{
Debug.Log("1");
}

if (GUILayout.Button("2"))
{
Debug.Log("2");
}

if (GUILayout.Button("3"))
{
Debug.Log("3");
}

if (GUILayout.Button("4"))
{
Debug.Log("4");
}
}

private static class Style
{
internal static readonly GUIStyle commandMidStyle = new GUIStyle("CommandMid")
Expand Down

0 comments on commit 92d5047

Please sign in to comment.