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
|
|
@ -0,0 +1,187 @@
|
|||
#if UNITY_6000_3_OR_NEWER
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using UnityEditor;
|
||||
using UnityEditor.SceneManagement;
|
||||
using UnityEditor.Toolbars;
|
||||
using UnityEngine;
|
||||
using UnityEngine.SceneManagement;
|
||||
using UnityEngine.Scripting;
|
||||
|
||||
namespace Module.NavigationTool.Editor.Toolbar
|
||||
{
|
||||
internal static class MainToolbarScenePickerElement
|
||||
{
|
||||
private static readonly ScenePickerList SceneList = new();
|
||||
|
||||
[Preserve]
|
||||
[MainToolbarElement("Toolbar/Scene", ussName = "", defaultDockIndex = 100, defaultDockPosition = MainToolbarDockPosition.Middle, menuPriority = 1500)]
|
||||
public static IEnumerable<MainToolbarElement> Draw()
|
||||
{
|
||||
return new List<MainToolbarElement>(3)
|
||||
{
|
||||
CreateDropdownSceneList(),
|
||||
CreateToggleSceneLoad(),
|
||||
CreateButtonAddNewScene()
|
||||
};
|
||||
}
|
||||
|
||||
private static MainToolbarDropdown CreateDropdownSceneList()
|
||||
{
|
||||
SceneList.Refresh();
|
||||
var content = new MainToolbarContent(GetSceneLabel());
|
||||
return new MainToolbarDropdown(content, rect =>
|
||||
{
|
||||
var menu = new GenericMenu();
|
||||
|
||||
for (var i = 0; i < SceneList.labels.Length; i++)
|
||||
{
|
||||
var sceneIndex = i;
|
||||
menu.AddItem(SceneList.labels[i], SceneList.selected.Contains(i), () => SelectScene(sceneIndex));
|
||||
}
|
||||
|
||||
menu.DropDown(rect);
|
||||
});
|
||||
}
|
||||
|
||||
private static MainToolbarToggle CreateToggleSceneLoad()
|
||||
{
|
||||
var isScenePickerSetAsAdditive = ToolbarScenePickerSettings.IsScenePickerSetAsAdditive;
|
||||
var content = isScenePickerSetAsAdditive
|
||||
? new MainToolbarContent("A", "Additive scene loading (toogle to Single)")
|
||||
: new MainToolbarContent("S", "Single scene loading (toggle to Additive)");
|
||||
|
||||
return new MainToolbarToggle(content, isScenePickerSetAsAdditive, result =>
|
||||
{
|
||||
ToolbarScenePickerSettings.IsScenePickerSetAsAdditive = result;
|
||||
MainToolbar.Refresh("Toolbar/Scene");
|
||||
});
|
||||
}
|
||||
|
||||
private static MainToolbarButton CreateButtonAddNewScene()
|
||||
{
|
||||
var icon = EditorGUIUtility.IconContent("d_CreateAddNew").image as Texture2D;
|
||||
var content = new MainToolbarContent(icon, "Create a new scene");
|
||||
return new MainToolbarButton(content, () =>
|
||||
{
|
||||
try
|
||||
{
|
||||
var selection = EditorUtility.DisplayDialogComplex("Create new scene", "How do you want to add the scene?", "Single", "Additive", "Cancel");
|
||||
|
||||
if (selection == 2)
|
||||
return;
|
||||
|
||||
var scene = EditorSceneManager.NewScene(NewSceneSetup.EmptyScene, selection == 0 ? NewSceneMode.Single : NewSceneMode.Additive);
|
||||
|
||||
if (EditorUtility.DisplayDialog("Create new scene", "Save scene to disk?", "Yes", "No"))
|
||||
EditorSceneManager.SaveScene(scene);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
EditorUtility.DisplayDialog("Failed to add scene", e.Message, "Ok");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private static void SelectScene(int index)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (!EditorSceneManager.SaveCurrentModifiedScenesIfUserWantsTo())
|
||||
return;
|
||||
|
||||
var scenes = SceneList.scenes[index];
|
||||
var isScenePickerSetAsAdditive = ToolbarScenePickerSettings.IsScenePickerSetAsAdditive;
|
||||
|
||||
for (var i = 0; i < scenes.paths.Count; i++)
|
||||
{
|
||||
var path = scenes.paths[i];
|
||||
var scene = SceneManager.GetSceneByPath(path);
|
||||
|
||||
if (scenes.isGroup)
|
||||
{
|
||||
if (isScenePickerSetAsAdditive || i != 0)
|
||||
{
|
||||
EditorSceneManager.OpenScene(path, OpenSceneMode.Additive);
|
||||
var sceneIndex = SceneList.IndexOfPath(path, false);
|
||||
|
||||
if (sceneIndex != -1)
|
||||
SceneList.selected.Add(sceneIndex);
|
||||
}
|
||||
else
|
||||
{
|
||||
EditorSceneManager.OpenScene(path, OpenSceneMode.Single);
|
||||
var sceneIndex = SceneList.IndexOfPath(path, false);
|
||||
|
||||
SceneList.selected.Clear();
|
||||
|
||||
if (sceneIndex != -1)
|
||||
SceneList.selected.Add(index);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (scene.isLoaded)
|
||||
{
|
||||
if (SceneManager.sceneCount == 1)
|
||||
return;
|
||||
|
||||
EditorSceneManager.CloseScene(scene, true);
|
||||
SceneList.selected.Remove(index);
|
||||
}
|
||||
else if (isScenePickerSetAsAdditive)
|
||||
{
|
||||
EditorSceneManager.OpenScene(path, OpenSceneMode.Additive);
|
||||
SceneList.selected.Add(index);
|
||||
}
|
||||
else
|
||||
{
|
||||
EditorSceneManager.OpenScene(path, OpenSceneMode.Single);
|
||||
SceneList.selected.Clear();
|
||||
SceneList.selected.Add(index);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
GetSceneLabel();
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Debug.LogException(e);
|
||||
}
|
||||
finally
|
||||
{
|
||||
MainToolbar.Refresh("Toolbar/Scene");
|
||||
}
|
||||
}
|
||||
|
||||
private static string GetSceneLabel()
|
||||
{
|
||||
var builder = new StringBuilder();
|
||||
|
||||
if (SceneList.selected.Count != 0)
|
||||
{
|
||||
for (var i = 0; i < SceneList.selected.Count; i++)
|
||||
{
|
||||
if (i > 0)
|
||||
builder.Append(", ");
|
||||
|
||||
builder.Append(SceneList.scenes[SceneList.selected[i]].shortname);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
builder.Append("Unsaved scene(s)");
|
||||
}
|
||||
|
||||
return builder.ToString();
|
||||
}
|
||||
|
||||
public static void Refresh()
|
||||
{
|
||||
MainToolbar.Refresh("Toolbar/Scene");
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
Loading…
Add table
Add a link
Reference in a new issue