#include #include #include namespace XCEngine::UI::Editor::Widgets { namespace { using ::XCEngine::UI::UIColor; using ::XCEngine::UI::UIDrawList; bool UsesExternalBodyPresentation( const UIEditorDockHostForegroundOptions& options, std::string_view panelId) { return std::find( options.externalBodyPanelIds.begin(), options.externalBodyPanelIds.end(), panelId) != options.externalBodyPanelIds.end(); } UIColor ResolveSplitterColor( const UIEditorDockHostSplitterLayout& splitter, const UIEditorDockHostPalette& palette) { if (splitter.active) { return palette.splitterActiveColor; } if (splitter.hovered) { return palette.splitterHoveredColor; } return palette.splitterColor; } } // namespace void AppendUIEditorDockHostBackground( UIDrawList& drawList, const UIEditorDockHostLayout& layout, const UIEditorDockHostPalette& palette, const UIEditorDockHostMetrics& metrics) { for (const UIEditorDockHostTabStackLayout& tabStack : layout.tabStacks) { std::vector tabItems = {}; tabItems.reserve(tabStack.items.size()); for (const UIEditorDockHostTabItemLayout& item : tabStack.items) { UIEditorTabStripItem tabItem = {}; tabItem.tabId = item.panelId; tabItem.title = item.title; tabItem.closable = item.closable; tabItems.push_back(std::move(tabItem)); } AppendUIEditorTabStripBackground( drawList, tabStack.tabStripLayout, tabStack.tabStripState, palette.tabStripPalette, metrics.tabStripMetrics); } for (const UIEditorDockHostSplitterLayout& splitter : layout.splitters) { drawList.AddFilledRect( splitter.splitterLayout.handleRect, ResolveSplitterColor(splitter, palette), metrics.splitterHandleRounding); } } void AppendUIEditorDockHostForeground( UIDrawList& drawList, const UIEditorDockHostLayout& layout, const UIEditorDockHostForegroundOptions& options, const UIEditorDockHostPalette& palette, const UIEditorDockHostMetrics& metrics) { for (const UIEditorDockHostTabStackLayout& tabStack : layout.tabStacks) { std::vector tabItems = {}; tabItems.reserve(tabStack.items.size()); for (const UIEditorDockHostTabItemLayout& item : tabStack.items) { UIEditorTabStripItem tabItem = {}; tabItem.tabId = item.panelId; tabItem.title = item.title; tabItem.closable = item.closable; tabItems.push_back(std::move(tabItem)); } AppendUIEditorTabStripForeground( drawList, tabStack.tabStripLayout, tabItems, tabStack.tabStripState, palette.tabStripPalette, metrics.tabStripMetrics); if (UsesExternalBodyPresentation(options, tabStack.selectedPanelId)) { continue; } } if (layout.dropPreview.visible) { drawList.AddFilledRect( layout.dropPreview.previewRect, palette.dropPreviewFillColor); drawList.AddRectOutline( layout.dropPreview.previewRect, palette.dropPreviewBorderColor, 1.0f); } } void AppendUIEditorDockHostForeground( UIDrawList& drawList, const UIEditorDockHostLayout& layout, const UIEditorDockHostPalette& palette, const UIEditorDockHostMetrics& metrics) { AppendUIEditorDockHostForeground( drawList, layout, UIEditorDockHostForegroundOptions{}, palette, metrics); } void AppendUIEditorDockHost( UIDrawList& drawList, const ::XCEngine::UI::UIRect& bounds, const UIEditorPanelRegistry& panelRegistry, const UIEditorWorkspaceModel& workspace, const UIEditorWorkspaceSession& session, const UIEditorDockHostState& state, const UIEditorDockHostForegroundOptions& foregroundOptions, const UIEditorDockHostPalette& palette, const UIEditorDockHostMetrics& metrics) { const UIEditorDockHostLayout layout = BuildUIEditorDockHostLayout(bounds, panelRegistry, workspace, session, state, metrics); AppendUIEditorDockHostBackground(drawList, layout, palette, metrics); AppendUIEditorDockHostForeground(drawList, layout, foregroundOptions, palette, metrics); } void AppendUIEditorDockHost( UIDrawList& drawList, const ::XCEngine::UI::UIRect& bounds, const UIEditorPanelRegistry& panelRegistry, const UIEditorWorkspaceModel& workspace, const UIEditorWorkspaceSession& session, const UIEditorDockHostState& state, const UIEditorDockHostPalette& palette, const UIEditorDockHostMetrics& metrics) { AppendUIEditorDockHost( drawList, bounds, panelRegistry, workspace, session, state, UIEditorDockHostForegroundOptions{}, palette, metrics); } } // namespace XCEngine::UI::Editor::Widgets