diff --git a/CHANGELOG.md b/CHANGELOG.md index b457c0f..87da13a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,16 +2,30 @@ All notable changes to this project will be documented in this file. +## [1.11.0] - 2025-03-29 + +### Changed +- Scene groups to contain three different types of behaviours for grouping: + - Load As Group: Groups all scenes into a single entry + - Sort As Group: Sorts all scenes into entries close to each other in the dropdown + - Sort In Submenu As Group: Sorts all scenes into entries in a submenu + +### Removed +- Removed "Scene sorting by Asset label" groups + + ## [1.10.2] - 2024-11-25 ### Fixed - Fixed issue, where scene picker would not prompt about unsaved scene changes + ## [1.10.1] - 2024-11-25 ### Fixed - Fixed issue, where scene picker settings wouldn't save, if removing a group element + ## [1.10.0] - 2024-11-17 ### Added diff --git a/Editor/SceneView/EditorSceneViewToolHandleOverlay.cs b/Editor/SceneView/EditorSceneViewToolHandleOverlay.cs index 91f2052..e611816 100644 --- a/Editor/SceneView/EditorSceneViewToolHandleOverlay.cs +++ b/Editor/SceneView/EditorSceneViewToolHandleOverlay.cs @@ -4,7 +4,7 @@ using UnityEditor.Overlays; namespace Module.NavigationTool.Editor.SceneViewToolbar { - [Overlay(typeof(SceneView), "unity-custom-tool-handle-utility", "Custom/Tool Settings", true)] + [Overlay(typeof(SceneView), "unity-custom-tool-handle-utility", "Custom/Tool Settings")] internal sealed class EditorSceneViewToolHandleOverlay : ToolbarOverlay { public EditorSceneViewToolHandleOverlay() diff --git a/Editor/Toolbar/Tools/ScenePickerObjects/ESceneGroupBehaviourType.cs b/Editor/Toolbar/Tools/ScenePickerObjects/ESceneGroupBehaviourType.cs new file mode 100644 index 0000000..db25b26 --- /dev/null +++ b/Editor/Toolbar/Tools/ScenePickerObjects/ESceneGroupBehaviourType.cs @@ -0,0 +1,9 @@ +namespace Module.NavigationTool.Editor.Toolbar +{ + public enum ESceneGroupBehaviourType + { + LoadAsGroup, + SortAsGroup, + SortInSubmenuAsGroup + } +} \ No newline at end of file diff --git a/Editor/Toolbar/Tools/ScenePickerObjects/ESceneGroupBehaviourType.cs.meta b/Editor/Toolbar/Tools/ScenePickerObjects/ESceneGroupBehaviourType.cs.meta new file mode 100644 index 0000000..23244b1 --- /dev/null +++ b/Editor/Toolbar/Tools/ScenePickerObjects/ESceneGroupBehaviourType.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 71206076ab694b109f3391c4f28bc506 +timeCreated: 1743238963 \ No newline at end of file diff --git a/Editor/Toolbar/Tools/ScenePickerObjects/SceneGroup.cs b/Editor/Toolbar/Tools/ScenePickerObjects/SceneGroup.cs index 031cae5..0bac14c 100644 --- a/Editor/Toolbar/Tools/ScenePickerObjects/SceneGroup.cs +++ b/Editor/Toolbar/Tools/ScenePickerObjects/SceneGroup.cs @@ -8,7 +8,9 @@ namespace Module.NavigationTool.Editor.Toolbar { public string name; public ESceneGroupFilterType filterType; + public ESceneGroupBehaviourType behaviourType; public string optionalMainScenePath; + public string subMenuPath = "Submenu"; public List filters = new(); } } \ No newline at end of file diff --git a/Editor/Toolbar/Tools/ScenePickerObjects/ScenePickerList.cs b/Editor/Toolbar/Tools/ScenePickerObjects/ScenePickerList.cs index f93beae..5131874 100644 --- a/Editor/Toolbar/Tools/ScenePickerObjects/ScenePickerList.cs +++ b/Editor/Toolbar/Tools/ScenePickerObjects/ScenePickerList.cs @@ -24,7 +24,6 @@ namespace Module.NavigationTool.Editor.Toolbar List assets = GetWorkingSet(); FetchAllScenesFromBuildSettings(assets); - FetchAllScenesFromLabels(assets, settings.labels); FetchAllScenesFromSceneGroups(assets, settings.sceneGroups); FetchAllRemainingScenes(assets); @@ -49,32 +48,9 @@ namespace Module.NavigationTool.Editor.Toolbar }); } } - - private void FetchAllScenesFromLabels(List assets, List labels) - { - List filteredScenes = GetAllWorkingSetScenesWithLabels(assets, labels); - filteredScenes = FilterToUniques(filteredScenes); - filteredScenes = FilterAllExcept(filteredScenes, scenes); - - if (filteredScenes.Count != 0) - scenes.Add(new SceneElement{ includeAsSelectable = false }); - - for (var i = 0; i < filteredScenes.Count; i++) - { - scenes.Add(new SceneElement - { - name = filteredScenes[i].name, - shortname = filteredScenes[i].shortname, - paths = { filteredScenes[i].path } - }); - } - } - + private void FetchAllScenesFromSceneGroups(List assets, SceneGroupArray sceneGroups) { - if (sceneGroups.Count != 0) - scenes.Add(new SceneElement{ includeAsSelectable = false }); - for (var i = 0; i < sceneGroups.Count; i++) { SceneGroup sceneGroup = sceneGroups[i]; @@ -95,28 +71,73 @@ namespace Module.NavigationTool.Editor.Toolbar name = sceneGroup.name.Replace("/", "\\"); } - if (!string.IsNullOrEmpty(sceneGroup.optionalMainScenePath)) - SetWorkingSceneAsFirst(filteredScenes, sceneGroup.optionalMainScenePath); - - filteredScenes = FilterToUniques(filteredScenes); - - var scene = new SceneElement + if (sceneGroup.behaviourType == ESceneGroupBehaviourType.LoadAsGroup) { - name = name, - shortname = name, - isGroup = true - }; - - for (var j = 0; j < filteredScenes.Count; j++) - { - scene.paths.Add(filteredScenes[j].path); + if (sceneGroups.Count != 0) + scenes.Add(new SceneElement{ includeAsSelectable = false }); + + if (!string.IsNullOrEmpty(sceneGroup.optionalMainScenePath)) + SetWorkingSceneAsFirst(filteredScenes, sceneGroup.optionalMainScenePath); + + filteredScenes = FilterToUniques(filteredScenes); + + var scene = new SceneElement + { + name = name, + shortname = name, + isGroup = true + }; + + for (var j = 0; j < filteredScenes.Count; j++) + { + scene.paths.Add(filteredScenes[j].path); + } + + scene.name += $" ({scene.paths.Count})"; + scenes.Add(scene); + } + else if (sceneGroup.behaviourType == ESceneGroupBehaviourType.SortAsGroup) + { + filteredScenes = FilterToUniques(filteredScenes); + filteredScenes = FilterAllExcept(filteredScenes, scenes); + + if (filteredScenes.Count != 0) + scenes.Add(new SceneElement{ includeAsSelectable = false }); + + for (var j = 0; j < filteredScenes.Count; j++) + { + scenes.Add(new SceneElement + { + name = filteredScenes[j].name, + shortname = filteredScenes[j].shortname, + paths = { filteredScenes[j].path } + }); + } + } + else if (sceneGroup.behaviourType == ESceneGroupBehaviourType.SortInSubmenuAsGroup) + { + if (string.IsNullOrEmpty(sceneGroup.subMenuPath)) + continue; + + filteredScenes = FilterToUniques(filteredScenes); + filteredScenes = FilterAllExcept(filteredScenes, scenes); + + if (filteredScenes.Count != 0) + scenes.Add(new SceneElement{ includeAsSelectable = false }); + + for (var j = 0; j < filteredScenes.Count; j++) + { + scenes.Add(new SceneElement + { + name = $"{sceneGroup.subMenuPath}/{filteredScenes[j].name}", + shortname = filteredScenes[j].shortname, + paths = { filteredScenes[j].path } + }); + } } - - scene.name += $" ({scene.paths.Count})"; - scenes.Add(scene); } } - + private void FetchAllRemainingScenes(List assets) { List filteredScenes = FilterAllExcept(assets, scenes); diff --git a/Editor/Toolbar/Tools/Settings/ToolbarScenePickerProjectSettings.cs b/Editor/Toolbar/Tools/Settings/ToolbarScenePickerProjectSettings.cs index e503fdf..7414569 100644 --- a/Editor/Toolbar/Tools/Settings/ToolbarScenePickerProjectSettings.cs +++ b/Editor/Toolbar/Tools/Settings/ToolbarScenePickerProjectSettings.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; namespace Module.NavigationTool.Editor.Toolbar { @@ -8,7 +7,6 @@ namespace Module.NavigationTool.Editor.Toolbar public string Title => "Scene"; public bool IsSettingsDirty { get; private set; } - private StringReorderableListDrawer assetLabelList; private SceneGroupReorderableListDrawer sceneGroupList; private ToolbarProjectSettings projectSettings; @@ -19,18 +17,14 @@ namespace Module.NavigationTool.Editor.Toolbar this.projectSettings = projectSettings; settings = projectSettings.GetValueAs(); - assetLabelList = new StringReorderableListDrawer(settings.labels, "Scene sorting by Asset label"); - assetLabelList.onChanged += ToolScenePicker.SetAsDirty; - sceneGroupList = new SceneGroupReorderableListDrawer(settings.sceneGroups.groups, "Scene groups"); sceneGroupList.onChanged += ToolScenePicker.SetAsDirty; } public void Draw() { - assetLabelList.DoLayoutList(); sceneGroupList.DoLayoutList(); - IsSettingsDirty = assetLabelList.IsDirty || sceneGroupList.IsDirty; + IsSettingsDirty = sceneGroupList.IsDirty; } public void SetSettingsValue() @@ -41,7 +35,6 @@ namespace Module.NavigationTool.Editor.Toolbar [Serializable] public sealed class Settings { - public List labels = new(); public SceneGroupArray sceneGroups = new(); } } diff --git a/Editor/Toolbar/Tools/ToolBuild.cs b/Editor/Toolbar/Tools/ToolBuild.cs index b8acbb7..ef42c4d 100644 --- a/Editor/Toolbar/Tools/ToolBuild.cs +++ b/Editor/Toolbar/Tools/ToolBuild.cs @@ -1,7 +1,6 @@ using JetBrains.Annotations; using UnityEditor; using UnityEngine; -using UTools = UnityEditor.Tools; namespace Module.NavigationTool.Editor.Toolbar { diff --git a/Editor/Toolbar/Utilities/ReordableList/SceneGroupReorderableListDrawer.cs b/Editor/Toolbar/Utilities/ReordableList/SceneGroupReorderableListDrawer.cs index 9e2e68d..8b8a1ca 100644 --- a/Editor/Toolbar/Utilities/ReordableList/SceneGroupReorderableListDrawer.cs +++ b/Editor/Toolbar/Utilities/ReordableList/SceneGroupReorderableListDrawer.cs @@ -24,26 +24,39 @@ namespace Module.NavigationTool.Editor.Toolbar SceneGroup group = list[index]; var rectName = new Rect(rect.x, rect.y, rect.width, EditorGUIUtility.singleLineHeight); - var rectType = new Rect(rect.x, rectName.yMax + 2f, rect.width, EditorGUIUtility.singleLineHeight); - var rectOptional = new Rect(rect.x, rectType.yMax + 2f, rect.width - 80f, EditorGUIUtility.singleLineHeight); - var rectOptionalBtn = new Rect(rectOptional.xMax, rectType.yMax + 2f, 80f, EditorGUIUtility.singleLineHeight); - var rectLabels = new Rect(rect.x, rectOptional.yMax + 2f, rect.width, rect.height - (rectName.y - rectOptional.yMax) - 4f); + var rectBehaviourType = new Rect(rect.x, rectName.yMax + 2f, rect.width, EditorGUIUtility.singleLineHeight); + var rectType = new Rect(rect.x, rectBehaviourType.yMax + 2f, rect.width, EditorGUIUtility.singleLineHeight); + var rectLabels = new Rect(rect.x, rectType.yMax + 2f, rect.width, rect.height - (rectName.y - rectType.yMax) - 4f); EditorGUI.BeginChangeCheck(); group.name = EditorGUI.TextField(rectName, "Name", group.name); - group.optionalMainScenePath = EditorGUI.TextField(rectOptional, "Optional Main Scene Path", group.optionalMainScenePath); - - if (GUI.Button(rectOptionalBtn, "Find")) + + if (group.behaviourType == ESceneGroupBehaviourType.LoadAsGroup) { - string mainScenePath = EditorUtility.OpenFilePanel("Scene", "Assets", "unity"); + var rectOptional = new Rect(rect.x, rectType.yMax + 2f, rect.width - 80f, EditorGUIUtility.singleLineHeight); + var rectOptionalBtn = new Rect(rectOptional.xMax, rectType.yMax + 2f, 80f, EditorGUIUtility.singleLineHeight); + rectLabels = new Rect(rect.x, rectOptional.yMax + 2f, rect.width, rect.height - (rectName.y - rectOptional.yMax) - 4f); + group.optionalMainScenePath = EditorGUI.TextField(rectOptional, "Optional Main Scene Path", group.optionalMainScenePath); - if (!string.IsNullOrEmpty(mainScenePath)) + if (GUI.Button(rectOptionalBtn, "Find")) { - mainScenePath = mainScenePath.Substring(Application.dataPath.Length - 6); - group.optionalMainScenePath = mainScenePath; + string mainScenePath = EditorUtility.OpenFilePanel("Scene", "Assets", "unity"); + + if (!string.IsNullOrEmpty(mainScenePath)) + { + mainScenePath = mainScenePath.Substring(Application.dataPath.Length - 6); + group.optionalMainScenePath = mainScenePath; + } } } + else if (group.behaviourType == ESceneGroupBehaviourType.SortInSubmenuAsGroup) + { + var rectOptional = new Rect(rect.x, rectType.yMax + 2f, rect.width, EditorGUIUtility.singleLineHeight); + rectLabels = new Rect(rect.x, rectOptional.yMax + 2f, rect.width, rect.height - (rectName.y - rectOptional.yMax) - 4f); + group.subMenuPath = EditorGUI.TextField(rectOptional, "Sub-menu Path", group.subMenuPath); + } + group.behaviourType = (ESceneGroupBehaviourType)EditorGUI.EnumPopup(rectBehaviourType, "Behaviour Type", group.behaviourType); group.filterType = (ESceneGroupFilterType)EditorGUI.EnumPopup(rectType, "Filter Type", group.filterType); elements[index].DoList(rectLabels); @@ -75,7 +88,7 @@ namespace Module.NavigationTool.Editor.Toolbar return base.OnElementHeight(index) * 3f + Mathf.Max(0, labelCount - 1) * (EditorGUIUtility.singleLineHeight + 2f) - + 78f; + + 104f; } } } \ No newline at end of file diff --git a/README.md b/README.md index 15ba10f..be6eb4a 100644 --- a/README.md +++ b/README.md @@ -22,12 +22,15 @@ Toolbars to the left and right of the play-buttons. Anything can be added, as lo Several tools are available from start: -* UI Layer: Toggle the UI layer on/off -* UI Canvas: Select and center the camera on any Canvases in the scene -* Scene: Load any scene in the project easily by using the dropdown -* Time Scale: Adjust the time scale from [0;1] from a slider -* Target Frame Rate Scale: Adjust target frame rate from [10;144] from a slider +* Build: Select build target and build * Player Prefs: Delete all PlayerPrefs data +* Scene: Load any scene in the project easily by using the dropdown +* Target Frame Rate Scale: Adjust target frame rate from [10;144] from a slider +* Time Scale: Adjust the time scale from [0;1] from a slider +* UI Canvas: Select and center the camera on any Canvases in the scene +* UI Layer: Toggle the UI layer on/off +* Settings: Open project or preferences +* Save: Project save ### Customization diff --git a/package.json b/package.json index b4b3243..148e9d4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "com.module.navigationtool", - "version": "1.10.2", + "version": "1.11.0", "displayName": "Module.NavigationTool", "description": "Support for navigation tools, like favorites, history and toolbars", "unity": "2019.2",