188 lines
6.6 KiB
C#
188 lines
6.6 KiB
C#
#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
|