DragonECS-Unity/src/DragonDocs/Editors/DragonDocsWindow.cs

294 lines
10 KiB
C#
Raw Normal View History

2024-06-10 18:05:06 +08:00
#if UNITY_EDITOR
using DCFApixels.DragonECS.Unity.Editors;
using DCFApixels.DragonECS.Unity.Internal;
using UnityEditor;
using UnityEngine;
namespace DCFApixels.DragonECS.Unity.Docs.Editors
{
internal class DragonDocsWindow : EditorWindow
{
[MenuItem("Tools/" + EcsConsts.FRAMEWORK_NAME + "/Documentation")]
static void Open()
{
var wnd = GetWindow<DragonDocsWindow>();
wnd.titleContent = new GUIContent($"{EcsConsts.FRAMEWORK_NAME} Documentation");
wnd.Show();
}
private int _selectedIndex = 0;
private Vector2 ButtonsScrolPosition;
private Vector2 DataScrolPosition;
private Vector2 _buttonsWidthDragStartPos = Vector2.zero;
private float _buttonsWidthDragStartValue = 200f;
private float _buttonsWidth = 200f;
private DragState _dragState;
private enum DragState
{
None,
Init,
Update,
}
private DragonDocsPrefs Prefs { get { return DragonDocsPrefs.instance; } }
private static bool IsShowHidden
{
get { return SettingsPrefs.instance.IsShowHidden; }
set { SettingsPrefs.instance.IsShowHidden = value; }
}
private void OnGUI()
{
Event current = Event.current;
DragonDocs docs = DragonDocsPrefs.instance.Docs;
if(docs == null || docs.Metas.IsEmpty)
{
docs = DragonDocs.Generate();
DragonDocsPrefs.instance.Save(docs);
}
GUILayout.BeginHorizontal(GUILayout.ExpandHeight(true));
2024-06-11 02:30:10 +08:00
ButtonsScrolPosition = GUILayout.BeginScrollView(ButtonsScrolPosition, UnityEditorUtility.GetStyle(Color.black, 0.1f), GUILayout.Width(_buttonsWidth));
2024-06-10 18:05:06 +08:00
var selectedGroupInfo = DrawGroups();
GUILayout.EndScrollView();
DrawDragger();
2024-06-11 02:30:10 +08:00
GUILayout.Space(EditorGUIUtility.standardVerticalSpacing * -2f);
2024-06-10 18:05:06 +08:00
DataScrolPosition = GUILayout.BeginScrollView(DataScrolPosition, UnityEditorUtility.GetStyle(Color.black, 0.2f), GUILayout.ExpandWidth(true));
DrawSelectedGroupMeta(selectedGroupInfo);
GUILayout.EndScrollView();
GUILayout.EndHorizontal();
GUI.enabled = true;
IsShowHidden = EditorGUILayout.Toggle("Show Hidden", IsShowHidden);
if (GUILayout.Button("Update"))
{
docs = DragonDocs.Generate();
DragonDocsPrefs.instance.Save(docs);
}
}
private void DrawSelectedGroupMeta(MetaGroupInfo info)
{
var metas = Prefs.Docs.Metas;
for (int i = 0, j = info.StartIndex; i < info.Length; i++, j++)
{
DrawMeta(metas[j], i, 12);
}
}
private void DrawMeta(DragonDocsMeta meta, int index, int total)
{
using (EcsGUI.SetIndentLevel(0))
{
Color panelColor = EcsGUI.SelectPanelColor(meta.Color, meta.IsCustomColor, index, total).Desaturate(EscEditorConsts.COMPONENT_DRAWER_DESATURATE);
Color alphaPanelColor = panelColor;
alphaPanelColor.a = EscEditorConsts.COMPONENT_DRAWER_ALPHA;
GUILayout.BeginVertical(UnityEditorUtility.GetStyle(alphaPanelColor));
GUILayout.Space(1f);
GUILayout.TextArea(meta.Name, EditorStyles.boldLabel);
Rect lastRect = GUILayoutUtility.GetLastRect();
2024-06-11 02:30:10 +08:00
if (string.IsNullOrEmpty(meta.Description) == false)
2024-06-10 18:05:06 +08:00
{
Rect lineRect = lastRect;
lineRect.yMin = lineRect.yMax;
lineRect.yMax += 1f;
lineRect.y += 5f;
EditorGUI.DrawRect(lineRect, new Color(1, 1, 1, 0.12f));
GUILayout.Space(7f);
GUILayout.TextArea(meta.Description, EditorStyles.wordWrappedLabel);
}
2024-06-11 02:30:10 +08:00
if (meta._tags.Length > 0)
{
Rect lineRect = GUILayoutUtility.GetLastRect();
lineRect.yMin = lineRect.yMax;
lineRect.yMax += 1f;
lineRect.y += 5f;
EditorGUI.DrawRect(lineRect, new Color(1, 1, 1, 0.12f));
GUILayout.Space(3f);
var tagsstring = string.Join(',', meta._tags);
using (EcsGUI.SetAlpha(0.5f))
{
GUILayout.TextArea(tagsstring, EditorStyles.wordWrappedMiniLabel);
}
}
2024-06-10 18:05:06 +08:00
GUILayout.Space(1f);
GUILayout.EndVertical();
}
}
private MetaGroupInfo DrawGroups()
{
using (EcsGUI.SetIndentLevel(0))
{
Event current = Event.current;
MetaGroupInfo result = new MetaGroupInfo("NO_NAME", "NO_NAME", 0, 0, 0);
var infos = Prefs.Infos;
var IsExpands = Prefs.IsExpands;
int clippingDepth = int.MaxValue;
for (int i = 0; i < infos.Length; i++)
{
var groupInfo = infos[i];
if (groupInfo.Depth > clippingDepth)
{
continue;
}
else
{
clippingDepth = int.MaxValue;
}
EditorGUI.indentLevel = groupInfo.Depth;
GUIContent label = UnityEditorUtility.GetLabel(groupInfo.Name);
Rect r = GUILayoutUtility.GetRect(label, EditorStyles.foldout);
if (i == _selectedIndex)
{
EditorGUI.DrawRect(r, new Color(0.12f, 0.5f, 1f, 0.40f));
result = groupInfo;
}
bool isClick;
using (EcsGUI.SetColor(0, 0, 0, 0))
using (EcsGUI.Disable)
{
isClick = GUI.Button(r, "");
}
if (EcsGUI.HitTest(r))
{
EditorGUI.DrawRect(r, new Color(1f, 1f, 1f, 0.12f));
if (current.type == EventType.MouseDown)
{
_selectedIndex = i;
}
}
if (i + 1 == infos.Length || infos[i + 1].Depth <= groupInfo.Depth)
{
using (EcsGUI.SetBackgroundColor(0, 0, 0, 0))
EditorGUI.Foldout(r, false, label, EditorStyles.foldout);
}
else
{
IsExpands[i] = EditorGUI.Foldout(r, IsExpands[i], label, EditorStyles.foldout);
if (i == 0)
{
IsExpands[i] = true;
}
}
if (IsExpands[i] == false)
{
clippingDepth = groupInfo.Depth;
}
if (groupInfo.Length > 0)
{
r.xMax = r.xMin;
r.xMin -= 2f;
r.yMin += 1;
r.yMax -= 1;
EditorGUI.DrawRect(r, new Color(0.2f, 0.6f, 1f));
}
}
return result;
}
}
private void DrawDragger()
{
const float DRAG_RESIZE_WIDTH = 4f;
2024-06-11 02:30:10 +08:00
Rect rect = GUILayoutUtility.GetLastRect();
2024-06-10 18:05:06 +08:00
float m = DRAG_RESIZE_WIDTH;
if (_dragState != DragState.None)
{
2024-06-11 02:30:10 +08:00
m *= 2f;
2024-06-10 18:05:06 +08:00
}
rect.xMin = rect.xMax;
2024-06-11 02:30:10 +08:00
rect.x -= m / 2f;
rect.width = m;
EditorGUI.DrawRect(rect.AddPadding(1f, 0), new Color(0,0,0,0.5f));
2024-06-10 18:05:06 +08:00
Event current = Event.current;
switch (current.type)
{
case EventType.MouseDown:
if (EcsGUI.HitTest(rect))
{
_buttonsWidthDragStartPos = current.mousePosition;
_buttonsWidthDragStartValue = _buttonsWidth;
_dragState = DragState.Init;
2024-06-11 02:30:10 +08:00
current.Use();
2024-06-10 18:05:06 +08:00
}
break;
case EventType.MouseUp:
2024-06-11 02:30:10 +08:00
if(_dragState != DragState.None)
{
_dragState = DragState.None;
current.Use();
}
2024-06-10 18:05:06 +08:00
break;
case EventType.MouseDrag:
{
switch (_dragState)
{
case DragState.Init:
{
if ((Event.current.mousePosition - _buttonsWidthDragStartPos).sqrMagnitude > 16f)
{
_dragState = DragState.Update;
}
}
break;
case DragState.Update:
{
_buttonsWidth = _buttonsWidthDragStartValue + (Event.current.mousePosition.x - _buttonsWidthDragStartPos.x);
_buttonsWidth = Mathf.Max(6f, _buttonsWidth);
current.Use();//TODO кажется это можно использовать вместо лайфахака с кнопкой для моментальной реакции пир наведении курсора для кнопок с иконками
}
break;
}
}
break;
case EventType.Repaint:
{
EditorGUIUtility.AddCursorRect(rect, MouseCursor.SlideArrow);
}
break;
}
}
}
}
#endif