Navigation tools upgraded to use the new MainToolbarElement API
This commit is contained in:
parent
708b99f763
commit
3e1602162c
52 changed files with 837 additions and 66 deletions
99
Editor/Toolbar/MainToolbarElements/MainToolbarUIElement.cs
Normal file
99
Editor/Toolbar/MainToolbarElements/MainToolbarUIElement.cs
Normal file
|
|
@ -0,0 +1,99 @@
|
|||
#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
|
||||
Loading…
Add table
Add a link
Reference in a new issue