module-navigation-tool/Editor/Toolbar/MainToolbarElements/MainToolbarUIElement.cs

100 lines
3.4 KiB
C#

#if UNITY_6000_3_OR_NEWER
using System.Collections.Generic;
using UnityEditor;
using UnityEditor.SceneManagement;
using UnityEditor.Toolbars;
using UnityEditorInternal;
using UnityEngine;
using UnityEngine.Scripting;
using UTools = UnityEditor.Tools;
namespace Module.NavigationTool.Editor.Toolbar
{
internal static class MainToolbarUIElement
{
[Preserve]
[MainToolbarElement("Toolbar/UI", ussName = "", defaultDockIndex = 0, defaultDockPosition = MainToolbarDockPosition.Middle, menuPriority = 500)]
public static IEnumerable<MainToolbarElement> Draw()
{
var layer = 1 << LayerMask.NameToLayer("UI");
var toggleValue = (UTools.visibleLayers & layer) != 0;
return new List<MainToolbarElement>(2)
{
new MainToolbarToggle(new MainToolbarContent("UI", "Toggles UI visible layer in SceneView"), toggleValue, OnToggleValueChanged),
new MainToolbarDropdown(new MainToolbarContent("Select"), OnDropdownOpen)
};
}
private static void OnToggleValueChanged(bool result)
{
var layer = 1 << LayerMask.NameToLayer("UI");
if (result)
UTools.visibleLayers |= layer;
else
UTools.visibleLayers &= ~layer;
SceneView.RepaintAll();
}
private static void OnDropdownOpen(Rect rect)
{
var prefabStage = PrefabStageUtility.GetCurrentPrefabStage();
var canvases = prefabStage != null
? prefabStage.prefabContentsRoot.GetComponentsInParent<Canvas>()
: Object.FindObjectsByType<Canvas>(FindObjectsInactive.Include, FindObjectsSortMode.InstanceID);
var list = new List<Canvas>(canvases.Length);
var menu = new GenericMenu();
for (var i = 0; i < canvases.Length; i++)
{
var root = canvases[i].rootCanvas;
if (list.Contains(root))
continue;
list.Add(root);
menu.AddItem(new GUIContent($"{i}: {root.name}"), false, () => Focus(root.GetInstanceID()));
}
menu.DropDown(rect);
}
private static void Focus(int instanceId)
{
var obj = EditorUtility.EntityIdToObject(instanceId);
var canvas = obj as Canvas;
if (canvas == null)
{
if (obj != null)
Debug.LogWarning("Failed to find Canvas component on object", obj);
return;
}
Selection.activeObject = canvas;
var bounds = InternalEditorUtility.CalculateSelectionBounds(false, true, true);
var point = bounds.center;
var direction = canvas.transform.rotation;
var size = Mathf.Max(bounds.extents.x, bounds.extents.y);
var ortho = canvas.renderMode == RenderMode.ScreenSpaceOverlay;
for (var i = 0; i < SceneView.sceneViews.Count; i++)
{
var view = (SceneView)SceneView.sceneViews[i];
view.in2DMode = false;
view.LookAt(point, direction, size, ortho, false);
}
}
public static void Refresh()
{
MainToolbar.Refresh("Toolbar/UI");
}
}
}
#endif