Files
DreadScripts-Archive/PackageProcessor/Editor/PackageProcessorWindow.cs
2025-07-19 01:03:02 +02:00

248 lines
10 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using Object = UnityEngine.Object;
namespace DreadScripts.PackageProcessor
{
public class PackageProcessorWindow : EditorWindow
{
private static SerializedObject settings;
private static SerializedProperty includeDependencies;
private static SerializedProperty active;
private static SerializedProperty exportDefaultOffTypes;
private static SerializedProperty exportDefaultOffFolders;
private static SerializedProperty exportDefaultOffExtensions;
private static SerializedProperty exportDefaultOffAssets;
private static Object targetObject;
private static Object targetFolder;
private static Object targetAsset;
[MenuItem("DreadTools/Utility/Package Processor")]
public static void ShowWindow() => GetWindow<PackageProcessorWindow>(false, "Package Processor Settings", true);
private void OnGUI()
{
settings.Update();
using (new BGColorScope(active.boolValue, Color.green, Color.grey))
active.boolValue = GUILayout.Toggle(active.boolValue, "Active", "toolbarbutton");
using (new EditorGUI.DisabledScope(!active.boolValue))
{
using (new LabelWidthScope(200))
EditorGUILayout.PropertyField(includeDependencies, new GUIContent("Default Include Dependencies"));
DrawListProperty(exportDefaultOffExtensions);
DrawListProperty(exportDefaultOffFolders, FolderPropertyGUI);
DrawListProperty(exportDefaultOffTypes, TypePropertyGUI);
DrawAssetProperty(exportDefaultOffAssets);
}
PackageProcessorData.folderPath = AssetFolderPath(PackageProcessorData.folderPath, "Settings Path", "ExportPostProcessorDataPath");
settings.ApplyModifiedProperties();
}
#region GUI Methods
private void DrawListProperty(SerializedProperty p, Action guiCall = null)
{
using (new GUILayout.VerticalScope("box"))
{
p.isExpanded = EditorGUILayout.Foldout(p.isExpanded, p.displayName);
if (!p.isExpanded) return;
guiCall?.Invoke();
EditorGUI.indentLevel++;
if (GUILayout.Button("+"))
p.arraySize++;
for (int i = p.arraySize-1; i >= 0; i--)
{
using (new GUILayout.HorizontalScope())
{
EditorGUILayout.PropertyField(p.GetArrayElementAtIndex(i));
if (GUILayout.Button("X", GUILayout.Width(18)))
p.DeleteArrayElementAtIndex(i);
}
}
EditorGUI.indentLevel--;
}
}
private void TypePropertyGUI()
{
using (new GUILayout.HorizontalScope())
{
targetObject = EditorGUILayout.ObjectField("Add Type Of", targetObject, typeof(Object), true);
EditorGUI.BeginDisabledGroup(!targetObject);
if (GUILayout.Button("Add Type"))
{
exportDefaultOffTypes.arraySize++;
exportDefaultOffTypes.GetArrayElementAtIndex(exportDefaultOffTypes.arraySize - 1).stringValue = targetObject.GetType().AssemblyQualifiedName;
}
EditorGUI.EndDisabledGroup();
}
}
private void FolderPropertyGUI()
{
using (new GUILayout.HorizontalScope())
{
EditorGUI.BeginChangeCheck();
targetFolder = EditorGUILayout.ObjectField("Folder", targetFolder, typeof(Object), true);
if (EditorGUI.EndChangeCheck() && targetFolder)
{
string assetPath = AssetDatabase.GetAssetPath(targetFolder);
if (!AssetDatabase.IsValidFolder(assetPath))
targetFolder = AssetDatabase.LoadMainAssetAtPath(System.IO.Path.GetDirectoryName(assetPath));
}
EditorGUI.BeginDisabledGroup(!targetFolder);
if (GUILayout.Button("Add Folder"))
{
exportDefaultOffFolders.arraySize++;
exportDefaultOffFolders.GetArrayElementAtIndex(exportDefaultOffFolders.arraySize - 1).stringValue = AssetDatabase.GetAssetPath(targetFolder);
}
EditorGUI.EndDisabledGroup();
}
}
private void DrawAssetProperty(SerializedProperty p)
{
using (new GUILayout.VerticalScope("box"))
{
p.isExpanded = EditorGUILayout.Foldout(p.isExpanded, p.displayName);
if (p.isExpanded)
{
using (new GUILayout.HorizontalScope())
{
targetAsset = EditorGUILayout.ObjectField("Add GUID Of", targetAsset, typeof(Object), false);
if (AssetDatabase.IsValidFolder(AssetDatabase.GetAssetPath(targetAsset)))
targetAsset = null;
EditorGUI.BeginDisabledGroup(!targetAsset);
if (GUILayout.Button("Add GUID"))
{
AssetDatabase.TryGetGUIDAndLocalFileIdentifier(targetAsset, out string newGUID, out long _);
exportDefaultOffAssets.arraySize++;
exportDefaultOffAssets.GetArrayElementAtIndex(exportDefaultOffAssets.arraySize - 1).stringValue = newGUID;
}
EditorGUI.EndDisabledGroup();
}
EditorGUI.indentLevel++;
if (GUILayout.Button("+"))
{
p.arraySize++;
}
for (int i = p.arraySize - 1; i >= 0; i--)
{
using (new GUILayout.HorizontalScope())
{
EditorGUILayout.PropertyField(p.GetArrayElementAtIndex(i));
if (GUILayout.Button("X", GUILayout.Width(18)))
p.DeleteArrayElementAtIndex(i);
if (GUILayout.Button("?",GUILayout.Width(18)))
{
Object asset = AssetDatabase.LoadMainAssetAtPath(AssetDatabase.GUIDToAssetPath(p.GetArrayElementAtIndex(i).stringValue));
if (!asset)
{
if (EditorUtility.DisplayDialog("Not Found", "Asset for this GUID was not found. Delete?", "Delete", "Ignore"))
p.DeleteArrayElementAtIndex(i);
}
else
EditorGUIUtility.PingObject(asset);
}
}
}
EditorGUI.indentLevel--;
}
}
}
private static string AssetFolderPath(string variable, string title, string playerpref, bool isPlayerPrefs = true)
{
using (new GUILayout.HorizontalScope())
{
using (new EditorGUI.DisabledScope(true))
EditorGUILayout.TextField(title, variable);
if (GUILayout.Button("...", GUILayout.Width(30)))
{
var dummyPath = EditorUtility.OpenFolderPanel(title, AssetDatabase.IsValidFolder(variable) ? variable : "Assets", string.Empty);
if (string.IsNullOrEmpty(dummyPath))
return variable;
string newPath = FileUtil.GetProjectRelativePath(dummyPath);
if (!newPath.StartsWith("Assets"))
{
Debug.LogWarning("New Path must be a folder within Assets!");
return variable;
}
variable = newPath;
if (isPlayerPrefs) PlayerPrefs.SetString(playerpref, variable);
else EditorPrefs.SetString(playerpref, variable);
}
}
return variable;
}
#endregion
private void OnEnable()
{
if (settings == null)
{
settings = new SerializedObject(PackageProcessorData.instance);
includeDependencies = settings.FindProperty("includeDependencies");
active = settings.FindProperty("active");
exportDefaultOffTypes = settings.FindProperty("exportDefaultOffTypes");
exportDefaultOffFolders = settings.FindProperty("exportDefaultOffFolders");
exportDefaultOffExtensions = settings.FindProperty("exportDefaultOffExtensions");
exportDefaultOffAssets = settings.FindProperty("exportDefaultOffAssets");
}
}
#region Scope Classes
public class LabelWidthScope : System.IDisposable
{
private readonly float originalWidth;
public LabelWidthScope(float newWidth)
{
originalWidth = EditorGUIUtility.labelWidth;
EditorGUIUtility.labelWidth = newWidth;
}
public void Dispose() => EditorGUIUtility.labelWidth = originalWidth;
}
public class BGColorScope : System.IDisposable
{
private readonly Color originalColor;
public BGColorScope(bool active, Color activeColor, Color inactiveColor)
{
originalColor = GUI.backgroundColor;
GUI.backgroundColor = active ? activeColor : inactiveColor;
}
public void Dispose() => GUI.backgroundColor = originalColor;
}
#endregion
}
}