162 lines
5.0 KiB
C++
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
|