Checkpoint current new editor host iteration

This commit is contained in:
2026-04-13 18:52:30 +08:00
parent a0d5e84516
commit d2140bf5cc
11 changed files with 243 additions and 184 deletions

View File

@@ -36,33 +36,62 @@ void ApplyViewportFrameToPresentation(
presentation.viewportShellModel.frame.statusText = viewportFrame.statusText;
}
std::vector<UIEditorWorkspacePanelPresentationModel> BuildWorkspacePresentations(
const UIEditorShellInteractionDefinition& definition,
const UIEditorShellInteractionRequest& shellRequest,
ProductViewportHostService& viewportHostService) {
std::vector<UIEditorWorkspacePanelPresentationModel> presentations =
definition.workspacePresentations;
for (UIEditorWorkspacePanelPresentationModel& presentation : presentations) {
if (presentation.kind != UIEditorPanelPresentationKind::ViewportShell ||
!IsProductViewportPanel(presentation.panelId)) {
continue;
}
void ApplyViewportFrameToShellModel(
const ProductViewportFrame& 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;
}
const UIEditorWorkspaceViewportComposeRequest* viewportRequest =
FindUIEditorWorkspaceViewportPresentationRequest(
shellRequest.shellRequest.workspaceRequest,
presentation.panelId);
const ::XCEngine::UI::UISize requestedSize =
viewportRequest != nullptr
? viewportRequest->viewportShellRequest.requestedViewportSize
: ::XCEngine::UI::UISize();
ApplyViewportFrameToPresentation(
viewportHostService.RequestViewport(
ResolveProductViewportKind(presentation.panelId),
requestedSize),
presentation);
UIEditorWorkspacePanelPresentationModel* FindMutableWorkspacePresentation(
std::vector<UIEditorWorkspacePanelPresentationModel>& presentations,
std::string_view panelId) {
for (UIEditorWorkspacePanelPresentationModel& presentation : presentations) {
if (presentation.panelId == panelId) {
return &presentation;
}
}
return presentations;
return nullptr;
}
void ApplyViewportFramesToShellFrame(
UIEditorShellInteractionFrame& shellFrame,
ProductViewportHostService& viewportHostService) {
auto applyToViewportFrames =
[&](std::vector<UIEditorWorkspaceViewportComposeFrame>& viewportFrames) {
for (UIEditorWorkspaceViewportComposeFrame& viewportComposeFrame : viewportFrames) {
if (!IsProductViewportPanel(viewportComposeFrame.panelId)) {
continue;
}
const ProductViewportFrame viewportFrame =
viewportHostService.RequestViewport(
ResolveProductViewportKind(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);
}
std::vector<UIEditorWorkspacePanelPresentationModel> BuildWorkspacePresentations(
const UIEditorShellInteractionDefinition& definition) {
return definition.workspacePresentations;
}
UIEditorShellComposeModel BuildShellComposeModelFromFrame(
@@ -168,18 +197,7 @@ void ProductEditorWorkspace::Update(
UIEditorShellInteractionDefinition definition =
context.BuildShellDefinition(captureText);
m_viewportHostService.BeginFrame();
const UIEditorShellInteractionRequest shellRequest =
ResolveUIEditorShellInteractionRequest(
bounds,
context.GetWorkspaceController(),
definition,
m_shellInteractionState,
metrics,
context.GetShellServices());
definition.workspacePresentations = BuildWorkspacePresentations(
definition,
shellRequest,
m_viewportHostService);
definition.workspacePresentations = BuildWorkspacePresentations(definition);
const std::vector<UIInputEvent> hostedContentEvents = inputEvents;
const std::vector<UIInputEvent> shellEvents =
HasHostedContentCapture()
@@ -194,6 +212,7 @@ void ProductEditorWorkspace::Update(
shellEvents,
context.GetShellServices(),
metrics);
ApplyViewportFramesToShellFrame(m_shellFrame, m_viewportHostService);
context.SyncSessionFromWorkspace();
context.UpdateStatusFromShellResult(m_shellFrame.result);