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

@@ -0,0 +1,218 @@
#include <XCEditor/Shell/UIEditorShellCompose.h>
#include <algorithm>
namespace XCEngine::UI::Editor {
namespace {
using ::XCEngine::UI::UIRect;
using Widgets::AppendUIEditorMenuBarBackground;
using Widgets::AppendUIEditorMenuBarForeground;
using Widgets::AppendUIEditorStatusBarBackground;
using Widgets::AppendUIEditorStatusBarForeground;
using Widgets::BuildUIEditorMenuBarLayout;
using Widgets::BuildUIEditorStatusBarLayout;
float ClampNonNegative(float value) {
return (std::max)(value, 0.0f);
}
UIRect InsetRect(const UIRect& rect, float inset) {
const float clampedInset = ClampNonNegative(inset);
const float insetX = (std::min)(clampedInset, rect.width * 0.5f);
const float insetY = (std::min)(clampedInset, rect.height * 0.5f);
return UIRect(
rect.x + insetX,
rect.y + insetY,
(std::max)(0.0f, rect.width - insetX * 2.0f),
(std::max)(0.0f, rect.height - insetY * 2.0f));
}
} // namespace
UIEditorShellComposeLayout BuildUIEditorShellComposeLayout(
const UIRect& bounds,
const std::vector<Widgets::UIEditorMenuBarItem>& menuBarItems,
const std::vector<Widgets::UIEditorStatusBarSegment>& statusSegments,
const UIEditorShellComposeMetrics& metrics) {
UIEditorShellComposeLayout layout = {};
layout.bounds = UIRect(
bounds.x,
bounds.y,
ClampNonNegative(bounds.width),
ClampNonNegative(bounds.height));
layout.contentRect = InsetRect(layout.bounds, metrics.outerPadding);
const float menuBarHeight = ClampNonNegative(metrics.menuBarMetrics.barHeight);
const float statusBarHeight = ClampNonNegative(metrics.statusBarMetrics.barHeight);
const float sectionGap = ClampNonNegative(metrics.sectionGap);
const float availableHeight = layout.contentRect.height;
const float combinedBars = menuBarHeight + statusBarHeight;
const float gapBudget = combinedBars > 0.0f ? sectionGap * 2.0f : 0.0f;
const float clampedGapBudget = (std::min)(gapBudget, availableHeight);
const float workspaceHeight =
(std::max)(0.0f, availableHeight - combinedBars - clampedGapBudget);
float cursorY = layout.contentRect.y;
if (menuBarHeight > 0.0f) {
layout.menuBarRect = UIRect(
layout.contentRect.x,
cursorY,
layout.contentRect.width,
menuBarHeight);
cursorY += menuBarHeight + sectionGap;
}
layout.workspaceRect = UIRect(
layout.contentRect.x,
cursorY,
layout.contentRect.width,
workspaceHeight);
if (statusBarHeight > 0.0f) {
layout.statusBarRect = UIRect(
layout.contentRect.x,
layout.contentRect.y + layout.contentRect.height - statusBarHeight,
layout.contentRect.width,
statusBarHeight);
}
layout.menuBarLayout =
BuildUIEditorMenuBarLayout(layout.menuBarRect, menuBarItems, metrics.menuBarMetrics);
layout.statusBarLayout =
BuildUIEditorStatusBarLayout(layout.statusBarRect, statusSegments, metrics.statusBarMetrics);
return layout;
}
UIEditorShellComposeRequest ResolveUIEditorShellComposeRequest(
const UIRect& bounds,
const UIEditorPanelRegistry& panelRegistry,
const UIEditorWorkspaceModel& workspace,
const UIEditorWorkspaceSession& session,
const UIEditorShellComposeModel& model,
const Widgets::UIEditorDockHostState& dockHostState,
const UIEditorShellComposeState& state,
const UIEditorShellComposeMetrics& metrics) {
UIEditorShellComposeRequest request = {};
request.layout = BuildUIEditorShellComposeLayout(
bounds,
model.menuBarItems,
model.statusSegments,
metrics);
request.workspaceRequest = ResolveUIEditorWorkspaceComposeRequest(
request.layout.workspaceRect,
panelRegistry,
workspace,
session,
model.workspacePresentations,
dockHostState,
metrics.dockHostMetrics,
metrics.viewportMetrics);
request.layout.menuBarLayout = BuildUIEditorMenuBarLayout(
request.layout.menuBarRect,
model.menuBarItems,
metrics.menuBarMetrics);
request.layout.statusBarLayout = BuildUIEditorStatusBarLayout(
request.layout.statusBarRect,
model.statusSegments,
metrics.statusBarMetrics);
(void)state;
return request;
}
UIEditorShellComposeFrame UpdateUIEditorShellCompose(
UIEditorShellComposeState& state,
const UIRect& bounds,
const UIEditorPanelRegistry& panelRegistry,
const UIEditorWorkspaceModel& workspace,
const UIEditorWorkspaceSession& session,
const UIEditorShellComposeModel& model,
const std::vector<::XCEngine::UI::UIInputEvent>& inputEvents,
const Widgets::UIEditorDockHostState& dockHostState,
const UIEditorShellComposeMetrics& metrics) {
UIEditorShellComposeFrame frame = {};
frame.layout = BuildUIEditorShellComposeLayout(
bounds,
model.menuBarItems,
model.statusSegments,
metrics);
frame.workspaceFrame = UpdateUIEditorWorkspaceCompose(
state.workspaceState,
frame.layout.workspaceRect,
panelRegistry,
workspace,
session,
model.workspacePresentations,
inputEvents,
dockHostState,
metrics.dockHostMetrics,
metrics.viewportMetrics);
frame.layout.menuBarLayout = BuildUIEditorMenuBarLayout(
frame.layout.menuBarRect,
model.menuBarItems,
metrics.menuBarMetrics);
frame.layout.statusBarLayout = BuildUIEditorStatusBarLayout(
frame.layout.statusBarRect,
model.statusSegments,
metrics.statusBarMetrics);
return frame;
}
void AppendUIEditorShellCompose(
::XCEngine::UI::UIDrawList& drawList,
const UIEditorShellComposeFrame& frame,
const UIEditorShellComposeModel& model,
const UIEditorShellComposeState& state,
const UIEditorShellComposePalette& palette,
const UIEditorShellComposeMetrics& metrics) {
drawList.AddFilledRect(
frame.layout.bounds,
palette.surfaceColor,
metrics.surfaceCornerRounding);
drawList.AddRectOutline(
frame.layout.bounds,
palette.surfaceBorderColor,
1.0f,
metrics.surfaceCornerRounding);
AppendUIEditorMenuBarBackground(
drawList,
frame.layout.menuBarLayout,
model.menuBarItems,
state.menuBarState,
palette.menuBarPalette,
metrics.menuBarMetrics);
AppendUIEditorMenuBarForeground(
drawList,
frame.layout.menuBarLayout,
model.menuBarItems,
state.menuBarState,
palette.menuBarPalette,
metrics.menuBarMetrics);
AppendUIEditorWorkspaceCompose(
drawList,
frame.workspaceFrame,
palette.dockHostPalette,
metrics.dockHostMetrics,
palette.viewportPalette,
metrics.viewportMetrics);
AppendUIEditorStatusBarBackground(
drawList,
frame.layout.statusBarLayout,
model.statusSegments,
state.statusBarState,
palette.statusBarPalette,
metrics.statusBarMetrics);
AppendUIEditorStatusBarForeground(
drawList,
frame.layout.statusBarLayout,
model.statusSegments,
state.statusBarState,
palette.statusBarPalette,
metrics.statusBarMetrics);
}
} // namespace XCEngine::UI::Editor