#include #include 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& menuBarItems, const std::vector& 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