添加窗口控制器

This commit is contained in:
2026-07-26 10:43:28 +08:00
parent fe5ae4726c
commit fb78769170
18 changed files with 1426 additions and 0 deletions
+8
View File
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 2f18f75958efeb8428a4689e959e4350
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
+145
View File
@@ -0,0 +1,145 @@
using UnityEditor;
using UnityEngine;
namespace XericUIEditor.Form
{
[CustomEditor(typeof(XericUI.Form.UIFormController))]
public class UIFormControllerEditor : Editor
{
private XericUI.Form.UIFormController _controller;
private void OnEnable()
{
_controller = (XericUI.Form.UIFormController)target;
}
public override void OnInspectorGUI()
{
serializedObject.Update();
DrawBasicSection();
DrawEdgeSection();
DrawDebugSection();
serializedObject.ApplyModifiedProperties();
}
#region 基本设置
private void DrawBasicSection()
{
EditorGUILayout.LabelField("窗口基本设置", EditorStyles.boldLabel);
EditorGUILayout.PropertyField(serializedObject.FindProperty("m_WindowTitle"), new GUIContent("窗口标题 (Title)"));
EditorGUILayout.Space();
}
#endregion
#region 边缘行为
private void DrawEdgeSection()
{
EditorGUILayout.LabelField("边缘吸附", EditorStyles.boldLabel);
EditorGUILayout.PropertyField(serializedObject.FindProperty("m_EnableAutoSnap"), new GUIContent("启用边缘吸附 (Auto Snap)"));
if (_controller.AutoSnapEnabled)
{
EditorGUILayout.PropertyField(serializedObject.FindProperty("m_SnapThreshold"), new GUIContent("吸附阈值 (Snap Threshold, px)"));
}
EditorGUILayout.Space();
EditorGUILayout.LabelField("自动隐藏", EditorStyles.boldLabel);
EditorGUILayout.PropertyField(serializedObject.FindProperty("m_EnableAutoHide"), new GUIContent("启用自动隐藏 (Auto Hide)"));
if (_controller.AutoHideEnabled)
{
EditorGUILayout.PropertyField(serializedObject.FindProperty("m_AutoHideDirection"), new GUIContent("隐藏方向 (Direction)"));
}
EditorGUILayout.Space();
}
#endregion
#region 调试与测试
private void DrawDebugSection()
{
EditorGUILayout.LabelField("调试", EditorStyles.boldLabel);
EditorGUILayout.PropertyField(serializedObject.FindProperty("m_DebugMode"), new GUIContent("调试模式 (Debug Mode)"));
EditorGUILayout.PropertyField(serializedObject.FindProperty("m_DebugLogEvents"), new GUIContent("事件日志 (Log Events)"));
EditorGUILayout.Space();
// 当前状态
EditorGUILayout.LabelField("当前状态", EditorStyles.boldLabel);
var state = _controller.CurrentState;
Color stateColor;
string stateText;
switch (state)
{
case XericUI.Form.WindowState.Normal:
stateColor = Color.white;
stateText = "● 窗口化 (Normal)";
break;
case XericUI.Form.WindowState.Maximized:
stateColor = Color.green;
stateText = "■ 全屏 (Maximized)";
break;
case XericUI.Form.WindowState.Minimized:
stateColor = Color.gray;
stateText = "○ 最小化 (Minimized)";
break;
case XericUI.Form.WindowState.EdgeHidden:
stateColor = new Color(1f, 0.6f, 0f);
stateText = "◄ 边缘隐藏 (Edge Hidden)";
break;
default:
stateColor = Color.white;
stateText = state.ToString();
break;
}
GUI.color = stateColor;
EditorGUILayout.LabelField(stateText, EditorStyles.miniBoldLabel);
GUI.color = Color.white;
EditorGUILayout.Space();
// 手动测试按钮
EditorGUILayout.LabelField("手动测试", EditorStyles.boldLabel);
EditorGUILayout.BeginHorizontal();
if (GUILayout.Button("全屏/还原"))
{
_controller.ToggleMaximize();
SceneView.RepaintAll();
}
if (GUILayout.Button("模拟进入"))
{
_controller.SimulateEnter();
SceneView.RepaintAll();
}
if (GUILayout.Button("模拟退出"))
{
_controller.SimulateExit();
SceneView.RepaintAll();
}
EditorGUILayout.EndHorizontal();
EditorGUILayout.Space();
// 调试提示
if (!Application.isPlaying && _controller.DebugMode)
{
EditorGUILayout.HelpBox(
"调试模式已启用 — 在 SceneView 中移动鼠标即可预览。\n" +
"蓝色边框 = 窗口范围 | 绿色 = 鼠标悬停中 | 橙色 = 吸附阈值范围",
MessageType.Info);
}
}
#endregion
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 9f105e0b75b54e142b3844d8f657e32a
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
+36
View File
@@ -0,0 +1,36 @@
using UnityEditor;
using UnityEngine;
namespace XericUIEditor.Form
{
[CustomEditor(typeof(XericUI.Form.UITitleBar))]
public class UITitleBarEditor : Editor
{
private XericUI.Form.UITitleBar _titleBar;
private void OnEnable()
{
_titleBar = (XericUI.Form.UITitleBar)target;
}
public override void OnInspectorGUI()
{
serializedObject.Update();
EditorGUILayout.LabelField("标题栏控件引用", EditorStyles.boldLabel);
EditorGUILayout.HelpBox(
"将标题栏下的子控件拖入下方槽位即可。\n" +
"UITitleBar 会在 Start 时自动向上查找父级的 UIFormController 并绑定事件。",
MessageType.Info);
EditorGUILayout.PropertyField(serializedObject.FindProperty("m_TitleText"), new GUIContent("标题文本 (Title Text)"));
EditorGUILayout.PropertyField(serializedObject.FindProperty("m_CloseButton"), new GUIContent("关闭按钮 (Close)"));
EditorGUILayout.PropertyField(serializedObject.FindProperty("m_MaximizeButton"), new GUIContent("最大化按钮 (Maximize)"));
EditorGUILayout.PropertyField(serializedObject.FindProperty("m_MinimizeButton"), new GUIContent("最小化按钮 (Minimize)"));
EditorGUILayout.PropertyField(serializedObject.FindProperty("m_AutoSnapToggle"), new GUIContent("吸附开关 (Auto Snap)"));
EditorGUILayout.PropertyField(serializedObject.FindProperty("m_AutoHideToggle"), new GUIContent("隐藏开关 (Auto Hide)"));
serializedObject.ApplyModifiedProperties();
}
}
}
+11
View File
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 5c45b2d7be6212e479b5cf00a0369596
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: