Files
XCEngine/new_editor/src/Docking/UIEditorDockHostRendering.cpp

162 lines
5.0 KiB
C++

#include <XCEditor/Docking/UIEditorDockHost.h>
#include <algorithm>
#include <utility>
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<UIEditorTabStripItem> 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<UIEditorTabStripItem> 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