diff --git a/Editor/Toolbar/ToolbarDrawer.cs b/Editor/Toolbar/ToolbarDrawer.cs index ce61303..38cb9ba 100644 --- a/Editor/Toolbar/ToolbarDrawer.cs +++ b/Editor/Toolbar/ToolbarDrawer.cs @@ -36,16 +36,17 @@ namespace Game.NavigationTool.Editor private static void OnGUI() { const float Y = 5.0f; - const float SPACING = 8.0f; + const float SPACING = 4.0f; const float HEIGHT = 22.0f; - const float PLAY_BUTTON_EXTENT = 48.0f; - + const float PLAY_BUTTON_EXTENT = 75.0f; + const float PLAY_BUTTON_OFFSET = -23.0f; + if (DRAWERS == null) return; styles.Initialize(GUI.skin); - float xLeft = EditorGUIUtility.currentViewWidth * 0.5f - PLAY_BUTTON_EXTENT; - float xRight = EditorGUIUtility.currentViewWidth * 0.5f + PLAY_BUTTON_EXTENT; + float xLeft = EditorGUIUtility.currentViewWidth * 0.5f + PLAY_BUTTON_OFFSET - PLAY_BUTTON_EXTENT; + float xRight = EditorGUIUtility.currentViewWidth * 0.5f + PLAY_BUTTON_OFFSET + PLAY_BUTTON_EXTENT; for (var i = 0; i < DRAWERS.Length; i++) { diff --git a/Editor/Toolbar/Tools/ToolScenePickerPostProcess.cs b/Editor/Toolbar/Tools/ToolScenePickerPostProcess.cs index ba6434c..ebb15d6 100644 --- a/Editor/Toolbar/Tools/ToolScenePickerPostProcess.cs +++ b/Editor/Toolbar/Tools/ToolScenePickerPostProcess.cs @@ -4,7 +4,7 @@ using UnityEditor; namespace Game.NavigationTool.Editor.Toolbar { - internal sealed class ToolbarPostProcess : AssetPostprocessor + internal sealed class ToolScenePickerPostProcess : AssetPostprocessor { private static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths) { @@ -14,7 +14,7 @@ namespace Game.NavigationTool.Editor.Toolbar private static bool HasChange(string[] assets) { - return assets.Any(s => s.EndsWith(".unity")); + return assets.Any(s => s.EndsWith(".unity")) || assets.Any(s => s.EndsWith("EditorBuildSettings.asset")); } } } \ No newline at end of file diff --git a/Editor/Toolbar/Tools/ToolUICanvasPicker.cs b/Editor/Toolbar/Tools/ToolUICanvasPicker.cs new file mode 100644 index 0000000..1a7ca92 --- /dev/null +++ b/Editor/Toolbar/Tools/ToolUICanvasPicker.cs @@ -0,0 +1,98 @@ +using System.Collections.Generic; +using Game.NavigationTool.Editor.Toolbar; +using JetBrains.Annotations; +using UnityEditor; +using UnityEditorInternal; +using UnityEngine; +using UTools = UnityEditor.Tools; + +namespace Game.NavigationTool.Editor.Tools +{ + [UsedImplicitly] + internal sealed class ToolUICanvasPicker : IToolbarDrawer + { + public bool Visible => true; + public bool Enabled => !EditorApplication.isPlayingOrWillChangePlaymode; + public EToolbarPlacement Placement => EToolbarPlacement.Left; + + private static bool IS_DIRTY = true; + private static string[] OPTIONS = new string[0]; + private static int[] INSTANCE_IDS = new int[0]; + + private void Initialize() + { + if (!IS_DIRTY) + return; + + Canvas[] canvases = Object.FindObjectsOfType(); + var list = new List(canvases.Length); + var listNames = new List(canvases.Length); + var listIds = new List(canvases.Length); + + listNames.Add("Select"); + listIds.Add(-1); + + for (var i = 0; i < canvases.Length; i++) + { + Canvas root = canvases[i].rootCanvas; + + if (list.Contains(root)) + continue; + + list.Add(root); + listNames.Add(root.name); + listIds.Add(root.GetInstanceID()); + } + + OPTIONS = listNames.ToArray(); + INSTANCE_IDS = listIds.ToArray(); + IS_DIRTY = false; + } + + public void Update() + { + Initialize(); + } + + public void Draw(Rect rect, Styles styles) + { + Initialize(); + int temp = EditorGUI.Popup(rect, 0, OPTIONS, styles.popup); + + if (temp != 0 && OPTIONS.Length != 1) + Focus(INSTANCE_IDS[temp]); + } + + public float CalculateWidth() + { + return 100.0f; + } + + private static void Focus(int instanceId) + { + var canvas = EditorUtility.InstanceIDToObject(instanceId) as Canvas; + + if (canvas == null) + return; + + Selection.activeObject = canvas; + Bounds bounds = InternalEditorUtility.CalculateSelectionBounds(false, true, true); + Vector3 point = bounds.center; + Quaternion direction = canvas.transform.rotation; + float size = Mathf.Max(bounds.extents.x, bounds.extents.y); + bool 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 SetAsDirty() + { + IS_DIRTY = true; + } + } +} \ No newline at end of file diff --git a/Editor/Toolbar/Tools/ToolUICanvasPicker.cs.meta b/Editor/Toolbar/Tools/ToolUICanvasPicker.cs.meta new file mode 100644 index 0000000..414951b --- /dev/null +++ b/Editor/Toolbar/Tools/ToolUICanvasPicker.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 43fccdd423a34d8f9505996a9102888f +timeCreated: 1615549429 \ No newline at end of file diff --git a/Editor/Toolbar/Tools/ToolUICanvasPickerPostProcess.cs b/Editor/Toolbar/Tools/ToolUICanvasPickerPostProcess.cs new file mode 100644 index 0000000..559b407 --- /dev/null +++ b/Editor/Toolbar/Tools/ToolUICanvasPickerPostProcess.cs @@ -0,0 +1,35 @@ +using Game.NavigationTool.Editor.Tools; +using UnityEditor.SceneManagement; +using UnityEngine.SceneManagement; + +namespace Game.NavigationTool.Editor.Toolbar +{ + internal static class ToolUICanvasPickerPostProcess + { + static ToolUICanvasPickerPostProcess() + { + EditorSceneManager.sceneSaved -= OnSceneSaved; + EditorSceneManager.sceneOpened -= OnSceneOpened; + EditorSceneManager.sceneClosed -= OnSceneClosed; + + EditorSceneManager.sceneSaved += OnSceneSaved; + EditorSceneManager.sceneOpened += OnSceneOpened; + EditorSceneManager.sceneClosed += OnSceneClosed; + } + + private static void OnSceneSaved(Scene scene) + { + ToolUICanvasPicker.SetAsDirty(); + } + + private static void OnSceneOpened(Scene scene, OpenSceneMode mode) + { + ToolUICanvasPicker.SetAsDirty(); + } + + private static void OnSceneClosed(Scene scene) + { + ToolUICanvasPicker.SetAsDirty(); + } + } +} \ No newline at end of file diff --git a/Editor/Toolbar/Tools/ToolUICanvasPickerPostProcess.cs.meta b/Editor/Toolbar/Tools/ToolUICanvasPickerPostProcess.cs.meta new file mode 100644 index 0000000..3feea06 --- /dev/null +++ b/Editor/Toolbar/Tools/ToolUICanvasPickerPostProcess.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 19979bf45bee4bad9f060e404dac726e +timeCreated: 1615563991 \ No newline at end of file diff --git a/Editor/Toolbar/Tools/ToolUILayerToggle.cs b/Editor/Toolbar/Tools/ToolUILayerToggle.cs new file mode 100644 index 0000000..97fcce3 --- /dev/null +++ b/Editor/Toolbar/Tools/ToolUILayerToggle.cs @@ -0,0 +1,47 @@ +using Game.NavigationTool.Editor.Toolbar; +using JetBrains.Annotations; +using UnityEditor; +using UnityEngine; +using UTools = UnityEditor.Tools; + +namespace Game.NavigationTool.Editor.Tools +{ + [UsedImplicitly] + internal sealed class ToolUILayerToggle : IToolbarDrawer + { + public bool Visible => true; + public bool Enabled => !EditorApplication.isPlayingOrWillChangePlaymode; + public EToolbarPlacement Placement => EToolbarPlacement.Left; + + public void Update() + { + } + + public void Draw(Rect rect, Styles styles) + { + int layer = 1 << LayerMask.NameToLayer("UI"); + bool value = (UTools.visibleLayers & layer) != 0; + bool temp = EditorGUI.Toggle(rect, value, styles.button); + GUI.Label(rect, "UI", styles.labelCenter); + + if (temp == value) + return; + + if (temp) + { + UTools.visibleLayers |= layer; + SceneView.RepaintAll(); + } + else + { + UTools.visibleLayers &= ~layer; + SceneView.RepaintAll(); + } + } + + public float CalculateWidth() + { + return 30.0f; + } + } +} \ No newline at end of file diff --git a/Editor/Toolbar/Tools/ToolUILayerToggle.cs.meta b/Editor/Toolbar/Tools/ToolUILayerToggle.cs.meta new file mode 100644 index 0000000..ae87bf6 --- /dev/null +++ b/Editor/Toolbar/Tools/ToolUILayerToggle.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 067b241abe324f7ead0fb8c076f89f5e +timeCreated: 1615550968 \ No newline at end of file diff --git a/Editor/Toolbar/Utilities/Styles.cs b/Editor/Toolbar/Utilities/Styles.cs index c191ba9..baebff9 100644 --- a/Editor/Toolbar/Utilities/Styles.cs +++ b/Editor/Toolbar/Utilities/Styles.cs @@ -7,7 +7,9 @@ namespace Game.NavigationTool.Editor.Toolbar public GUIStyle popup; public GUIStyle button; public GUIStyle slider; - + public GUIStyle label; + public GUIStyle labelCenter; + private GUISkin skin; public void Initialize(GUISkin skin) @@ -17,9 +19,12 @@ namespace Game.NavigationTool.Editor.Toolbar this.skin = skin; popup = skin.FindStyle("ToolbarPopup"); - button = skin.FindStyle("ToolbarButtonFlat"); + button = skin.FindStyle("toolbarbutton"); slider = skin.FindStyle("ToolbarSlider"); - + label = skin.FindStyle("ToolbarLabel"); + labelCenter = skin.FindStyle("ToolbarLabel"); + labelCenter.alignment = TextAnchor.MiddleCenter; + // Available: ToolbarBoldLabel, ToolbarBottom, ToolbarButtonLeft, ToolbarButtonRight, ToolbarDropDown, // ToolbarLabel, ToolbarTextField, ... } diff --git a/package.json b/package.json index 68f8989..991c728 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "com.module.navigationtool", - "version": "0.5.0", + "version": "0.6.0", "displayName": "Module.NavigationTool", "description": "Support for navigation tools, like favorites, history and toolbars", "unity": "2019.2",