refactor(new_editor/app): reorganize host structure and add smoke test
This commit is contained in:
82
new_editor/app/Composition/EditorShellRuntimeViewport.cpp
Normal file
82
new_editor/app/Composition/EditorShellRuntimeViewport.cpp
Normal file
@@ -0,0 +1,82 @@
|
||||
#include "Composition/EditorShellRuntimeSupport.h"
|
||||
|
||||
namespace XCEngine::UI::Editor::App::RuntimeSupport {
|
||||
|
||||
namespace {
|
||||
|
||||
bool IsViewportPanel(std::string_view panelId) {
|
||||
return panelId == "scene" || panelId == "game";
|
||||
}
|
||||
|
||||
ViewportKind ResolveViewportKind(std::string_view panelId) {
|
||||
return panelId == "game"
|
||||
? ViewportKind::Game
|
||||
: ViewportKind::Scene;
|
||||
}
|
||||
|
||||
void ApplyViewportFrameToPresentation(
|
||||
const ViewportFrame& viewportFrame,
|
||||
UIEditorWorkspacePanelPresentationModel& presentation) {
|
||||
presentation.viewportShellModel.frame.texture = viewportFrame.texture;
|
||||
presentation.viewportShellModel.frame.requestedSize = viewportFrame.requestedSize;
|
||||
presentation.viewportShellModel.frame.presentedSize = viewportFrame.renderSize;
|
||||
presentation.viewportShellModel.frame.hasTexture = viewportFrame.hasTexture;
|
||||
presentation.viewportShellModel.frame.statusText = viewportFrame.statusText;
|
||||
}
|
||||
|
||||
void ApplyViewportFrameToShellModel(
|
||||
const ViewportFrame& viewportFrame,
|
||||
UIEditorViewportShellModel& shellModel) {
|
||||
shellModel.frame.texture = viewportFrame.texture;
|
||||
shellModel.frame.requestedSize = viewportFrame.requestedSize;
|
||||
shellModel.frame.presentedSize = viewportFrame.renderSize;
|
||||
shellModel.frame.hasTexture = viewportFrame.hasTexture;
|
||||
shellModel.frame.statusText = viewportFrame.statusText;
|
||||
}
|
||||
|
||||
UIEditorWorkspacePanelPresentationModel* FindMutableWorkspacePresentation(
|
||||
std::vector<UIEditorWorkspacePanelPresentationModel>& presentations,
|
||||
std::string_view panelId) {
|
||||
for (UIEditorWorkspacePanelPresentationModel& presentation : presentations) {
|
||||
if (presentation.panelId == panelId) {
|
||||
return &presentation;
|
||||
}
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
void ApplyViewportFramesToShellFrame(
|
||||
UIEditorShellInteractionFrame& shellFrame,
|
||||
ViewportHostService& viewportHostService) {
|
||||
auto applyToViewportFrames =
|
||||
[&](std::vector<UIEditorWorkspaceViewportComposeFrame>& viewportFrames) {
|
||||
for (UIEditorWorkspaceViewportComposeFrame& viewportComposeFrame : viewportFrames) {
|
||||
if (!IsViewportPanel(viewportComposeFrame.panelId)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
const ViewportFrame viewportFrame =
|
||||
viewportHostService.RequestViewport(
|
||||
ResolveViewportKind(viewportComposeFrame.panelId),
|
||||
viewportComposeFrame.viewportShellFrame.requestedViewportSize);
|
||||
ApplyViewportFrameToShellModel(
|
||||
viewportFrame,
|
||||
viewportComposeFrame.viewportShellModel);
|
||||
if (UIEditorWorkspacePanelPresentationModel* presentation =
|
||||
FindMutableWorkspacePresentation(
|
||||
shellFrame.model.workspacePresentations,
|
||||
viewportComposeFrame.panelId);
|
||||
presentation != nullptr) {
|
||||
ApplyViewportFrameToPresentation(viewportFrame, *presentation);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
applyToViewportFrames(shellFrame.workspaceInteractionFrame.composeFrame.viewportFrames);
|
||||
applyToViewportFrames(shellFrame.shellFrame.workspaceFrame.viewportFrames);
|
||||
}
|
||||
|
||||
} // namespace XCEngine::UI::Editor::App::RuntimeSupport
|
||||
Reference in New Issue
Block a user