Refactor XCUI editor module layout

This commit is contained in:
2026-04-10 00:41:28 +08:00
parent 4b47764f26
commit 02a0e626fe
263 changed files with 12396 additions and 7592 deletions

View File

@@ -1,10 +1,11 @@
#ifndef NOMINMAX
#ifndef NOMINMAX
#define NOMINMAX
#endif
#include <XCEditor/Core/UIEditorNumberFieldInteraction.h>
#include <XCEditor/Core/UIEditorTheme.h>
#include <XCEditor/Widgets/UIEditorNumberField.h>
#include <XCEditor/Fields/UIEditorNumberFieldInteraction.h>
#include <XCEditor/Foundation/UIEditorTheme.h>
#include <XCEditor/Fields/UIEditorFieldStyle.h>
#include <XCEditor/Fields/UIEditorNumberField.h>
#include "EditorValidationTheme.h"
#include "Host/AutoScreenshot.h"
#include "Host/NativeRenderer.h"
@@ -48,7 +49,6 @@ using XCEngine::UI::Editor::Widgets::HitTestUIEditorNumberField;
using XCEngine::UI::Editor::Widgets::UIEditorNumberFieldHitTarget;
using XCEngine::UI::Editor::Widgets::UIEditorNumberFieldHitTargetKind;
using XCEngine::UI::Editor::Widgets::UIEditorNumberFieldSpec;
namespace Style = XCEngine::UI::Style;
constexpr const wchar_t* kWindowClassName = L"XCUIEditorNumberFieldBasicValidation";
constexpr const wchar_t* kWindowTitle = L"XCUI Editor | NumberField Basic";
@@ -84,10 +84,6 @@ std::filesystem::path ResolveRepoRootPath() {
return std::filesystem::path(root).lexically_normal();
}
std::filesystem::path ResolveValidationThemePath() {
return (ResolveRepoRootPath() / "tests/UI/Editor/integration/shared/themes/editor_validation.xctheme")
.lexically_normal();
}
bool ContainsPoint(const UIRect& rect, float x, float y) {
return x >= rect.x &&
@@ -170,18 +166,16 @@ ScenarioLayout BuildScenarioLayout(
return layout;
}
XCEngine::UI::Editor::Widgets::UIEditorNumberFieldMetrics ResolveHostedNumberFieldMetrics(
const Style::UITheme& theme) {
const auto propertyMetrics = XCEngine::UI::Editor::ResolveUIEditorPropertyGridMetrics(theme);
const auto numberMetrics = XCEngine::UI::Editor::ResolveUIEditorNumberFieldMetrics(theme);
return XCEngine::UI::Editor::BuildUIEditorHostedNumberFieldMetrics(propertyMetrics, numberMetrics);
XCEngine::UI::Editor::Widgets::UIEditorNumberFieldMetrics ResolvePropertyGridNumberFieldMetrics() {
return XCEngine::UI::Editor::BuildUIEditorPropertyGridNumberFieldMetrics(
XCEngine::UI::Editor::ResolveUIEditorPropertyGridMetrics(),
XCEngine::UI::Editor::ResolveUIEditorNumberFieldMetrics());
}
XCEngine::UI::Editor::Widgets::UIEditorNumberFieldPalette ResolveHostedNumberFieldPalette(
const Style::UITheme& theme) {
const auto propertyPalette = XCEngine::UI::Editor::ResolveUIEditorPropertyGridPalette(theme);
const auto numberPalette = XCEngine::UI::Editor::ResolveUIEditorNumberFieldPalette(theme);
return XCEngine::UI::Editor::BuildUIEditorHostedNumberFieldPalette(propertyPalette, numberPalette);
XCEngine::UI::Editor::Widgets::UIEditorNumberFieldPalette ResolvePropertyGridNumberFieldPalette() {
return XCEngine::UI::Editor::BuildUIEditorPropertyGridNumberFieldPalette(
XCEngine::UI::Editor::ResolveUIEditorPropertyGridPalette(),
XCEngine::UI::Editor::ResolveUIEditorNumberFieldPalette());
}
void DrawCard(
@@ -430,14 +424,6 @@ private:
m_captureRoot =
ResolveRepoRootPath() / "tests/UI/Editor/integration/shell/number_field_basic/captures";
m_autoScreenshot.Initialize(m_captureRoot);
const auto themeLoad =
XCEngine::Tests::EditorUI::LoadEditorValidationTheme(ResolveValidationThemePath());
if (themeLoad.succeeded) {
m_theme = themeLoad.theme;
m_themeStatus = "loaded";
} else {
m_themeStatus = themeLoad.error.empty() ? "fallback" : themeLoad.error;
}
ResetScenario();
return true;
@@ -466,7 +452,7 @@ private:
return BuildScenarioLayout(
width,
height,
XCEngine::Tests::EditorUI::ResolveEditorValidationShellMetrics(m_theme));
XCEngine::Tests::EditorUI::GetEditorValidationShellMetrics());
}
void ResetScenario() {
@@ -494,7 +480,7 @@ private:
}
const ScenarioLayout layout = GetLayout();
const auto metrics = ResolveHostedNumberFieldMetrics(m_theme);
const auto metrics = ResolvePropertyGridNumberFieldMetrics();
m_frame = UpdateUIEditorNumberFieldInteraction(
m_interactionState,
m_spec,
@@ -604,7 +590,7 @@ private:
UIEditorNumberFieldInteractionResult PumpEvents(std::vector<UIInputEvent> events) {
const ScenarioLayout layout = GetLayout();
const auto metrics = ResolveHostedNumberFieldMetrics(m_theme);
const auto metrics = ResolvePropertyGridNumberFieldMetrics();
m_frame = UpdateUIEditorNumberFieldInteraction(
m_interactionState,
m_spec,
@@ -616,7 +602,7 @@ private:
void UpdateResultText(const UIEditorNumberFieldInteractionResult& result) {
if (result.editCommitRejected) {
m_lastResult = "提交失败,仍保持在编辑";
m_lastResult = "提交失败,仍保持在编辑状态。";
return;
}
if (result.editCommitted) {
@@ -624,11 +610,11 @@ private:
return;
}
if (result.editCanceled) {
m_lastResult = "已取消编辑";
m_lastResult = "已取消编辑";
return;
}
if (result.editStarted) {
m_lastResult = "已进入编辑";
m_lastResult = "已进入编辑状态。";
return;
}
if (result.valueChanged || result.stepApplied) {
@@ -636,7 +622,7 @@ private:
return;
}
if (result.consumed) {
m_lastResult = "控件已消费输入";
m_lastResult = "控件已消费输入";
return;
}
m_lastResult = "等待交互";
@@ -664,16 +650,16 @@ private:
GetClientRect(m_hwnd, &clientRect);
const float width = static_cast<float>((std::max)(1L, clientRect.right - clientRect.left));
const float height = static_cast<float>((std::max)(1L, clientRect.bottom - clientRect.top));
const auto shellMetrics = XCEngine::Tests::EditorUI::ResolveEditorValidationShellMetrics(m_theme);
const auto shellPalette = XCEngine::Tests::EditorUI::ResolveEditorValidationShellPalette(m_theme);
const auto shellMetrics = XCEngine::Tests::EditorUI::GetEditorValidationShellMetrics();
const auto shellPalette = XCEngine::Tests::EditorUI::GetEditorValidationShellPalette();
const ScenarioLayout layout = BuildScenarioLayout(width, height, shellMetrics);
RefreshFrame();
const UIEditorNumberFieldHitTarget currentHit =
HitTestUIEditorNumberField(m_frame.layout, m_mousePosition);
const auto numberMetrics = ResolveHostedNumberFieldMetrics(m_theme);
const auto numberPalette = ResolveHostedNumberFieldPalette(m_theme);
const auto propertyPalette = XCEngine::UI::Editor::ResolveUIEditorPropertyGridPalette(m_theme);
const auto numberMetrics = ResolvePropertyGridNumberFieldMetrics();
const auto numberPalette = ResolvePropertyGridNumberFieldPalette();
const auto propertyPalette = XCEngine::UI::Editor::ResolveUIEditorPropertyGridPalette();
UIDrawData drawData = {};
UIDrawList& drawList = drawData.EmplaceDrawList("EditorNumberFieldBasic");
@@ -684,7 +670,7 @@ private:
layout.introRect,
shellPalette,
shellMetrics,
"这个测试在验证什么功能",
"这个测试在验证什么功能",
"验证 Inspector 宿主中的 NumberField 交互契约和默认宿主风格。");
drawList.AddText(
UIPoint(layout.introRect.x + 16.0f, layout.introRect.y + 72.0f),
@@ -698,7 +684,7 @@ private:
shellMetrics.bodyFontSize);
drawList.AddText(
UIPoint(layout.introRect.x + 16.0f, layout.introRect.y + 116.0f),
"3. 按 Enter 进入编辑态,直接输入字符Enter commitEsc cancel。",
"3. 按 Enter 进入编辑态,直接输入字符Enter commitEsc cancel。",
shellPalette.textPrimary,
shellMetrics.bodyFontSize);
drawList.AddText(
@@ -773,7 +759,7 @@ private:
shellMetrics.bodyFontSize);
drawList.AddText(
UIPoint(layout.stateRect.x + 16.0f, layout.stateRect.y + 238.0f),
"Theme: " + m_themeStatus,
"Style: fixed",
shellPalette.textWeak,
shellMetrics.bodyFontSize);
@@ -783,7 +769,7 @@ private:
shellPalette,
shellMetrics,
"NumberField 预览",
"这里预览 Inspector 宿主中的 Unity 风格 Number 字段。");
"这里预览 Inspector 宿主中的 Unity 风格 Number 字段。");
drawList.AddFilledRect(layout.inspectorRect, propertyPalette.surfaceColor);
drawList.AddRectOutline(layout.inspectorRect, propertyPalette.borderColor, 1.0f);
drawList.AddFilledRect(layout.inspectorHeaderRect, shellPalette.cardBackground);
@@ -825,12 +811,10 @@ private:
UIEditorNumberFieldSpec m_spec = {};
UIEditorNumberFieldInteractionState m_interactionState = {};
UIEditorNumberFieldInteractionFrame m_frame = {};
Style::UITheme m_theme = {};
UIPoint m_mousePosition = UIPoint(-1000.0f, -1000.0f);
ActionId m_hoveredAction = ActionId::Reset;
bool m_hasHoveredAction = false;
std::string m_lastResult = {};
std::string m_themeStatus = "fallback";
};
} // namespace