module-navigation-tool/Editor/Toolbar/MainToolbarElements/MainToolbarScenePickerElement.cs

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