UP-Viagg-io/Viagg-io/Assets/Packages/Asset Usage Finder/Editor/GuiManager.cs

169 lines
5.7 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using UnityEditor;
using UnityEditor.SceneManagement;
using UnityEngine;
using UnityEngine.SceneManagement;
namespace AssetUsageFinder {
[InitializeOnLoad]
public class GuiManager : UnityEditor.AssetModificationProcessor {
static string _version = "v4.0";
static GuiManager() {
EditorSceneManager.sceneSaved += OnSceneSaved;
}
static void OnSceneSaved(Scene scene) { }
public static string[] OnWillSaveAssets(string[] paths) {
return paths;
}
static void InitCache() {
Globals<CacheManager>.GetOrCreate(() => {
var res = new CacheManager();
res.Init();
return res;
});
}
#region Menu
[MenuItem("Assets/ Find Usages in Project", false, 30)]
static void FileMenu(MenuCommand command) {
InitCache();
var continueFinding = DoYouWantToSaveScene();
if (!continueFinding) return;
var pickupMessage = $"Please pick up a file from the project!";
var selected = Selection.activeObject;
if (selected == null) return;
var type = selected.GetType();
if (selected == null ||
type == typeof(DefaultAsset) ||
type == typeof(SceneAsset)) {
EditorUtility.DisplayDialog($"{_version}", $"{pickupMessage}", "Ok");
return;
}
if (type == typeof(GameObject)) {
var prefabProperties = PrefabUtilities.GetPrefabProperties(Selection.activeObject as GameObject);
if (prefabProperties.IsPartOfStage || prefabProperties.IsSceneObject) {
EditorUtility.DisplayDialog($"{_version}", $"{pickupMessage}", "Ok");
return;
}
}
EditorApplication.ExecuteMenuItem("File/Save Project");
OpenFileWindow(selected);
return;
}
[MenuItem("GameObject/ Find Usages in Scene && Stage", false, -1)]
public static void SceneOrStageMenu(MenuCommand data) {
InitCache();
var message = $"Please pick up an object from the scene && stage!";
var selected = Selection.activeObject;
if (selected == null) return;
if (selected == null || !(selected is GameObject)) {
EditorUtility.DisplayDialog($"{_version}", $"{message}", "Ok");
return;
}
var continueFinding = DoYouWantToSaveScene();
if (!continueFinding) return;
var prefabProperties = PrefabUtilities.GetPrefabProperties(Selection.activeObject as GameObject);
if (prefabProperties.IsPartOfStage) {
OpenStageWindow(selected, prefabProperties.Path);
}
else if (prefabProperties.IsSceneObject) {
OpenSceneWindow(selected, SceneManager.GetActiveScene().path);
}
else {
EditorUtility.DisplayDialog($"{_version}", $"{message}", "Ok");
return;
}
}
[MenuItem("CONTEXT/Component/ Find Usages of Component", false, 159)]
public static void FindReferencesToComponent(MenuCommand data) {
InitCache();
Object selected = data.context;
if (!selected) return;
var continueFinding = DoYouWantToSaveScene();
if (!continueFinding) return;
var scenePath = SceneManager.GetActiveScene().path;
OpenSceneWindow(selected, scenePath);
}
static bool DoYouWantToSaveScene() {
var scene = SceneManager.GetActiveScene();
if (scene.isDirty || string.IsNullOrEmpty(scene.path)) {
var response = EditorUtility.DisplayDialogComplex(
title: "Asset Usage Finder v4.0",
message: "Current scene is not saved yet!",
ok: "Save scene and find usages",
cancel: "Cancel usage finding",
alt: "Find without saving");
switch (response) {
case 0: // ok
EditorApplication.ExecuteMenuItem("File/Save");
return true;
case 1: // cancel
return false;
case 2: // find without saving
return true;
default:
return true;
}
}
return true;
}
#endregion Menu
#region InitWindow
static void OpenFileWindow(Object selected) {
var finder = new FileDependencyFinder(selected);
var window = ScriptableObject.CreateInstance<FileDependencyWindow>();
window.Init(finder);
var p = window.position;
p.size = DependencyWindow.StyleInstance.Size;
window.position = p;
window.Show();
}
public static void OpenSceneWindow(Object target, string scenePath) {
var finder = new InSceneDependencyFinder(target, scenePath);
var window = ScriptableObject.CreateInstance<SceneDependencyWindow>();
window.Init(finder);
window.Show();
}
static void OpenStageWindow(Object target, string stagePath) {
var finder = new InStageDependencyFinder(target, stagePath);
var window = ScriptableObject.CreateInstance<StageDependencyWindow>();
window.Init(finder);
window.Show();
}
#endregion InitWindow
}
}