refactor(new_editor): extract shell draw composer

This commit is contained in:
2026-04-22 14:53:24 +08:00
parent 4372c1ce7b
commit 2a8448cfbc
5 changed files with 235 additions and 155 deletions

View File

@@ -210,166 +210,25 @@ bool EditorShellRuntime::HasInteractiveCapture() const {
namespace XCEngine::UI::Editor::App {
using ::XCEngine::UI::UIDrawList;
UIEditorShellComposeModel BuildShellComposeModelFromFrame(
const UIEditorShellInteractionFrame& frame) {
UIEditorShellComposeModel model = {};
model.menuBarItems = frame.request.menuBarItems;
model.toolbarButtons = frame.model.toolbarButtons;
model.statusSegments = frame.model.statusSegments;
model.workspacePresentations = frame.model.workspacePresentations;
return model;
}
void AppendShellPopups(
UIDrawList& drawList,
const UIEditorShellInteractionFrame& frame,
const UIEditorShellInteractionPalette& palette,
const UIEditorShellInteractionMetrics& metrics) {
const std::size_t popupCount =
(std::min)(frame.request.popupRequests.size(), frame.popupFrames.size());
for (std::size_t index = 0; index < popupCount; ++index) {
const UIEditorShellInteractionPopupRequest& popupRequest =
frame.request.popupRequests[index];
const UIEditorShellInteractionPopupFrame& popupFrame =
frame.popupFrames[index];
Widgets::AppendUIEditorMenuPopupBackground(
drawList,
popupRequest.layout,
popupRequest.widgetItems,
popupFrame.popupState,
palette.popupPalette,
metrics.popupMetrics);
Widgets::AppendUIEditorMenuPopupForeground(
drawList,
popupRequest.layout,
popupRequest.widgetItems,
popupFrame.popupState,
palette.popupPalette,
metrics.popupMetrics);
}
}
} // namespace XCEngine::UI::Editor::App
namespace XCEngine::UI::Editor::App {
using ::XCEngine::UI::UIDrawList;
using ::XCEngine::UI::UIDrawData;
template<typename AppendFn>
void AppendDrawPacket(
UIDrawData& drawData,
std::string debugName,
AppendFn&& appendFn) {
UIDrawList drawList(std::move(debugName));
appendFn(drawList);
if (!drawList.Empty()) {
drawData.AddDrawList(std::move(drawList));
}
}
void EditorShellRuntime::RenderRequestedViewports(
const ::XCEngine::Rendering::RenderContext& renderContext) {
m_viewportHostService.RenderRequestedViewports(renderContext);
}
void EditorShellRuntime::Append(UIDrawData& drawData) const {
const auto& metrics = ResolveUIEditorShellInteractionMetrics();
const auto& palette = ResolveUIEditorShellInteractionPalette();
const UIEditorShellComposeModel shellComposeModel =
BuildShellComposeModelFromFrame(m_shellFrame);
AppendDrawPacket(
drawData,
"XCEditorShell.Compose.Base",
[&](UIDrawList& drawList) {
AppendUIEditorShellComposeBase(
drawList,
m_shellFrame.shellFrame,
shellComposeModel,
m_shellInteractionState.composeState,
palette.shellPalette,
metrics.shellMetrics,
&m_builtInIcons);
});
AppendDrawPacket(
drawData,
"XCEditorShell.Compose.Workspace",
[&](UIDrawList& drawList) {
AppendUIEditorWorkspaceCompose(
drawList,
m_shellFrame.workspaceInteractionFrame.composeFrame,
palette.shellPalette.dockHostPalette,
metrics.shellMetrics.dockHostMetrics,
palette.shellPalette.viewportPalette,
metrics.shellMetrics.viewportMetrics,
UIEditorWorkspaceComposeAppendOptions{
true,
false
});
});
AppendDrawPacket(
drawData,
"XCEditorShell.Compose.ViewportTextures",
[&](UIDrawList& drawList) {
AppendUIEditorWorkspaceComposeViewportTextures(
drawList,
m_shellFrame.workspaceInteractionFrame.composeFrame,
palette.shellPalette.viewportPalette);
});
AppendDrawPacket(
drawData,
"XCEditorShell.Compose.StatusBar",
[&](UIDrawList& drawList) {
AppendUIEditorShellComposeStatusBar(
drawList,
m_shellFrame.shellFrame,
shellComposeModel,
m_shellInteractionState.composeState,
palette.shellPalette,
metrics.shellMetrics);
});
AppendDrawPacket(
drawData,
"XCEditorPanel.Console",
[&](UIDrawList& drawList) { m_consolePanel.Append(drawList); });
AppendDrawPacket(
drawData,
"XCEditorPanel.ColorPicker",
[&](UIDrawList& drawList) { m_colorPickerPanel.Append(drawList); });
AppendDrawPacket(
drawData,
"XCEditorPanel.Hierarchy",
[&](UIDrawList& drawList) { m_hierarchyPanel.Append(drawList); });
AppendDrawPacket(
drawData,
"XCEditorPanel.Inspector",
[&](UIDrawList& drawList) { m_inspectorPanel.Append(drawList); });
AppendDrawPacket(
drawData,
"XCEditorPanel.Project",
[&](UIDrawList& drawList) { m_projectPanel.Append(drawList); });
AppendDrawPacket(
drawData,
"XCEditorPanel.SceneOverlay",
[&](UIDrawList& drawList) { m_sceneViewportFeature.Append(drawList); });
AppendDrawPacket(
drawData,
"XCEditorShell.Compose.Overlay",
[&](UIDrawList& drawList) {
AppendUIEditorShellComposeOverlay(
drawList,
m_shellFrame.workspaceInteractionFrame.composeFrame,
palette.shellPalette,
metrics.shellMetrics);
});
AppendDrawPacket(
drawData,
"XCEditorShell.Popups",
[&](UIDrawList& drawList) {
AppendShellPopups(drawList, m_shellFrame, palette, metrics);
});
void EditorShellRuntime::Append(::XCEngine::UI::UIDrawData& drawData) const {
m_drawComposer.Append(
EditorShellDrawComposerContext{
.shellFrame = m_shellFrame,
.shellInteractionState = m_shellInteractionState,
.builtInIcons = m_builtInIcons,
.consolePanel = m_consolePanel,
.colorPickerPanel = m_colorPickerPanel,
.hierarchyPanel = m_hierarchyPanel,
.inspectorPanel = m_inspectorPanel,
.projectPanel = m_projectPanel,
.sceneViewportFeature = m_sceneViewportFeature,
},
drawData);
}
} // namespace XCEngine::UI::Editor::App