DragonECS-Unity/src/RefRepairer/Editor/RefRepairerWindow.cs

103 lines
3.5 KiB
C#
Raw Normal View History

2024-09-29 15:59:14 +08:00
#if UNITY_EDITOR
2024-09-29 23:31:12 +08:00
using DCFApixels.DragonECS.Unity.RefRepairer.Editors;
2024-09-29 15:59:14 +08:00
using System.Linq;
using UnityEditor;
using UnityEditor.SceneManagement;
2024-10-01 09:09:40 +08:00
using UnityEditorInternal;
2024-09-29 15:59:14 +08:00
using UnityEngine;
namespace DCFApixels.DragonECS.Unity.Editors
{
internal class RefRepairerWindow : EditorWindow
{
public const string TITLE = "Reference Repairer";
[MenuItem("Tools/" + EcsConsts.FRAMEWORK_NAME + "/" + TITLE)]
static void Open()
{
var wnd = GetWindow<RefRepairerWindow>();
wnd.titleContent = new GUIContent(TITLE);
wnd.minSize = new Vector2(100f, 120f);
wnd.Show();
}
2024-10-01 07:42:54 +08:00
private MissingRefContainer _missingRefContainer = new MissingRefContainer();
2024-10-01 09:09:40 +08:00
private MissingsResolvingData[] _cachedMissingsResolvingDatas = null;
2024-10-01 07:42:54 +08:00
2024-10-01 09:09:40 +08:00
private ReorderableList _reorderableList;
private void InitList()
{
if(_reorderableList == null)
{
_reorderableList = new ReorderableList(_cachedMissingsResolvingDatas, typeof(MissingsResolvingData), false, false, false, false);
_reorderableList.headerHeight = 0;
_reorderableList.footerHeight = 0;
}
_reorderableList.list = _cachedMissingsResolvingDatas;
}
2024-10-01 07:42:54 +08:00
private void OnGUI()
{
if (_missingRefContainer.IsEmplty)
{
2024-10-01 09:09:40 +08:00
if (GUILayout.Button("Collect missing references"))
2024-10-01 07:42:54 +08:00
{
if (TryInit())
{
_missingRefContainer.Collect();
2024-10-01 09:09:40 +08:00
_cachedMissingsResolvingDatas = _missingRefContainer.MissingsResolvingDatas.Values.ToArray();
InitList();
2024-10-01 07:42:54 +08:00
}
}
return;
}
2024-10-01 09:09:40 +08:00
if (GUILayout.Button("Repaire missing references"))
{
Debug.Log(_missingRefContainer.IsEmplty);
var x = _missingRefContainer.collectedMissingTypesBuffer[0];
Debug.Log(x.ResolvingData.NewTypeData.AutoToString());
RepaireFileUtility.RepaieAsset(_missingRefContainer);
}
if (_missingRefContainer.MissingsResolvingDatas.Count != _cachedMissingsResolvingDatas.Length)
{
_cachedMissingsResolvingDatas = _missingRefContainer.MissingsResolvingDatas.Values.ToArray();
InitList();
}
2024-10-01 07:42:54 +08:00
2024-10-01 09:09:40 +08:00
_reorderableList.DoLayoutList();
2024-10-01 07:42:54 +08:00
}
2024-09-29 15:59:14 +08:00
private bool TryInit()
{
var allCurrentDirtyScenes = EditorSceneManager
.GetSceneManagerSetup()
.Where(sceneSetup => sceneSetup.isLoaded)
.Select(sceneSetup => EditorSceneManager.GetSceneByPath(sceneSetup.path))
.Where(scene => scene.isDirty)
.ToArray();
if (allCurrentDirtyScenes.Length != 0)
{
bool result = EditorUtility.DisplayDialog(
"Current active scene(s) is dirty",
"Please save all active scenes as they may be overwritten",
"Save active scene and Continue",
"Cancel update"
);
if (result == false)
return false;
foreach (var dirtyScene in allCurrentDirtyScenes)
EditorSceneManager.SaveScene(dirtyScene);
}
2024-10-01 07:42:54 +08:00
_missingRefContainer.Collect();
2024-09-29 15:59:14 +08:00
return true;
}
}
}
#endif