99 lines
2.4 KiB
C#
99 lines
2.4 KiB
C#
|
using System;
|
||
|
using System.Collections;
|
||
|
using System.Collections.Generic;
|
||
|
using Sirenix.OdinInspector.Editor;
|
||
|
using UnityEngine;
|
||
|
|
||
|
namespace Ether
|
||
|
{
|
||
|
public abstract class OdinWindowBase<T> : OdinMenuEditorWindow where T : OdinWindowBase<T>
|
||
|
{
|
||
|
protected OdinWindowBase()
|
||
|
{
|
||
|
OnInit();
|
||
|
}
|
||
|
|
||
|
protected abstract void OnInit();
|
||
|
|
||
|
protected bool SupportsMultiSelect = false; //允许多选
|
||
|
protected bool DrawSearchToolbar = false; //显示搜索框
|
||
|
|
||
|
protected List<(Type, OdinSubWindowBase)> SubWindows = new List<(Type, OdinSubWindowBase)>();
|
||
|
protected List<string> SubWindowNames = new List<string>();
|
||
|
|
||
|
private OdinSubWindowBase selectedSubWindow;
|
||
|
|
||
|
/// <summary>
|
||
|
/// 添加子界面
|
||
|
/// </summary>
|
||
|
/// <param name="windowName">子界面名称(列表中显示)</param>
|
||
|
/// <typeparam name="K">子界面类型</typeparam>
|
||
|
protected void AddSubWindow<K>(string windowName) where K : OdinSubWindowBase
|
||
|
{
|
||
|
Type type = typeof(K);
|
||
|
OdinSubWindowBase subWindow = (OdinSubWindowBase)Activator.CreateInstance(type);
|
||
|
SubWindowNames.Add(windowName);
|
||
|
SubWindows.Add((type, subWindow));
|
||
|
}
|
||
|
|
||
|
protected override OdinMenuTree BuildMenuTree()
|
||
|
{
|
||
|
var tree = new OdinMenuTree();
|
||
|
|
||
|
tree.Selection.SupportsMultiSelect = SupportsMultiSelect;
|
||
|
tree.Config.DrawSearchToolbar = DrawSearchToolbar;
|
||
|
|
||
|
for (int i = 0; i < SubWindows.Count; i++)
|
||
|
{
|
||
|
var subWindowItem = SubWindows[i];
|
||
|
if (subWindowItem.Item2 != null)
|
||
|
continue;
|
||
|
|
||
|
Type type = subWindowItem.Item1;
|
||
|
OdinSubWindowBase subWindow = (OdinSubWindowBase)Activator.CreateInstance(type);
|
||
|
subWindowItem.Item2 = subWindow;
|
||
|
}
|
||
|
|
||
|
for (int i = 0; i < SubWindows.Count; i++)
|
||
|
{
|
||
|
tree.Add(SubWindowNames[i], SubWindows[i].Item2);
|
||
|
}
|
||
|
|
||
|
tree.Selection.SelectionChanged += (type) =>
|
||
|
{
|
||
|
if (tree.Selection.SelectedValue == null)
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
selectedSubWindow?.OnClose();
|
||
|
|
||
|
OdinSubWindowBase selectWindow = tree.Selection.SelectedValue as OdinSubWindowBase;
|
||
|
selectWindow.OnShow();
|
||
|
selectedSubWindow = selectWindow;
|
||
|
};
|
||
|
|
||
|
return tree;
|
||
|
}
|
||
|
|
||
|
protected override void OnImGUI()
|
||
|
{
|
||
|
base.OnImGUI();
|
||
|
|
||
|
if (this.MenuTree.Selection.SelectedValue == null)
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
OdinSubWindowBase selectWindow = this.MenuTree.Selection.SelectedValue as OdinSubWindowBase;
|
||
|
selectWindow.OnGUI();
|
||
|
}
|
||
|
|
||
|
protected override void OnDestroy()
|
||
|
{
|
||
|
selectedSubWindow?.OnClose();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|