refactor(new_editor/docking): split dock host rendering and hit testing
This commit is contained in:
161
new_editor/src/Docking/UIEditorDockHostRendering.cpp
Normal file
161
new_editor/src/Docking/UIEditorDockHostRendering.cpp
Normal file
@@ -0,0 +1,161 @@
|
||||
#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
|
||||
Reference in New Issue
Block a user