Align SRP boundaries and editor windowing

This commit is contained in:
2026-04-26 17:14:32 +08:00
parent a8256b05cd
commit b8599a8aff
38 changed files with 696 additions and 650 deletions

View File

@@ -4,9 +4,8 @@
#include "Platform/Win32/Chrome/EditorWindowChromeController.h"
#include "Platform/Win32/Windowing/EditorFloatingWindowPlacement.h"
#include "Platform/Win32/Windowing/EditorWindow.h"
#include "Windowing/Content/EditorWindowContentController.h"
#include "Windowing/Host/EditorWindowHostCoordinator.h"
#include "Platform/Win32/Runtime/EditorWindowFrameDriver.h"
#include "Windowing/Runtime/EditorWindowRuntimeController.h"
#include <XCEditor/Foundation/UIEditorRuntimeTrace.h>
@@ -63,15 +62,15 @@ EditorWindowHostRuntime::EditorWindowHostRuntime(
EditorWindowHostRuntime::~EditorWindowHostRuntime() = default;
EditorWindow* EditorWindowHostRuntime::CreateHostWindow(
std::unique_ptr<EditorWindowContentController> contentController,
std::unique_ptr<EditorWindowRuntimeController> runtimeController,
const EditorWindowCreateParams& params) {
if (contentController == nullptr) {
LogRuntimeTrace("window", "window creation failed: content controller is null");
if (runtimeController == nullptr) {
LogRuntimeTrace("window", "window creation failed: runtime controller is null");
return nullptr;
}
const EditorWindowContentCapabilities capabilities =
contentController->GetCapabilities();
runtimeController->GetCapabilities();
if (params.category == EditorWindowCategory::Workspace && !capabilities.workspace) {
LogRuntimeTrace("window", "workspace window creation rejected: content is not workspace");
return nullptr;
@@ -87,7 +86,7 @@ EditorWindow* EditorWindowHostRuntime::CreateHostWindow(
params.category,
params.chromePolicy,
params.primary,
std::move(contentController));
std::move(runtimeController));
EditorWindow* const rawWindow = windowPtr.get();
m_windows.push_back(std::move(windowPtr));
@@ -177,11 +176,13 @@ EditorWindow* EditorWindowHostRuntime::CreateHostWindow(
return failWindowInitialization("managed window initialization failed: coordinator missing");
}
if (!rawWindow->Initialize(
m_repoRoot,
m_hostCoordinator->GetEditorContext(),
m_captureRoot,
params.autoCaptureOnStartup)) {
if (!m_hostCoordinator->InitializeHostWindow(
*rawWindow,
EditorHostWindowRuntimeInitializationParams{
.repoRoot = m_repoRoot,
.captureRoot = m_captureRoot,
.autoCaptureOnStartup = params.autoCaptureOnStartup,
})) {
return failWindowInitialization("managed window initialization failed");
}
@@ -313,60 +314,6 @@ std::string EditorWindowHostRuntime::DescribeWindows() const {
return DescribeHostWindows(m_windows);
}
void EditorWindowHostRuntime::RenderAllWindows() {
if (m_hostCoordinator == nullptr) {
return;
}
struct WindowFrameTransferBatch {
EditorWindow* sourceWindow = nullptr;
EditorWindowFrameTransferRequests requests = {};
};
std::vector<WindowFrameTransferBatch> transferBatches = {};
transferBatches.reserve(m_windows.size());
for (const std::unique_ptr<EditorWindow>& window : m_windows) {
if (window == nullptr ||
!window->HasLiveHostWindow() ||
window->GetLifecycleState() != EditorWindowLifecycleState::Running) {
continue;
}
if (window->ConsumeSkipNextSteadyStateFrame()) {
m_hostCoordinator->RefreshWindowPresentation(*window);
continue;
}
EditorWindowFrameTransferRequests transferRequests =
EditorWindowFrameDriver::DriveFrame(
*window,
m_hostCoordinator->GetEditorContext(),
m_hostCoordinator->IsGlobalTabDragActive());
m_hostCoordinator->RefreshWindowPresentation(*window);
if (!transferRequests.HasPendingRequests()) {
continue;
}
transferBatches.push_back(WindowFrameTransferBatch{
window.get(),
std::move(transferRequests),
});
}
for (WindowFrameTransferBatch& batch : transferBatches) {
if (batch.sourceWindow == nullptr ||
!batch.sourceWindow->HasLiveHostWindow() ||
batch.sourceWindow->GetLifecycleState() != EditorWindowLifecycleState::Running) {
continue;
}
m_hostCoordinator->DispatchWindowFrameTransferRequests(
*batch.sourceWindow,
batch.requests);
}
}
EditorWindow* EditorWindowHostRuntime::FindWindow(HWND hwnd) {
if (hwnd == nullptr) {
return nullptr;