100 lines
3.4 KiB
C#
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
|