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

@@ -5,10 +5,12 @@
#include "Windowing/Coordinator/EditorWindowLifecycleCoordinator.h"
#include "Windowing/Coordinator/EditorUtilityWindowCoordinator.h"
#include "Windowing/Coordinator/EditorWindowWorkspaceCoordinator.h"
#include "Windowing/Runtime/EditorWindowRuntimeController.h"
#include <XCEditor/Workspace/UIEditorWindowWorkspaceModel.h>
#include <utility>
#include <vector>
namespace XCEngine::UI::Editor::App {
@@ -21,11 +23,13 @@ EditorWindowManager::EditorWindowManager(
m_contentFactory = CreateDefaultEditorWindowContentFactory(windowSystem);
m_workspaceCoordinator =
std::make_unique<EditorWindowWorkspaceCoordinator>(
m_editorContext,
m_hostRuntime,
windowSystem,
*m_contentFactory);
m_utilityCoordinator =
std::make_unique<EditorUtilityWindowCoordinator>(
m_editorContext,
m_hostRuntime,
*m_contentFactory);
m_lifecycleCoordinator = std::make_unique<EditorWindowLifecycleCoordinator>(
@@ -52,7 +56,9 @@ EditorHostWindow* EditorWindowManager::CreateWorkspaceWindow(
}
EditorHostWindow* const window = m_hostRuntime.CreateHostWindow(
m_contentFactory->CreateWorkspaceContentController(windowState),
std::make_unique<EditorWindowRuntimeController>(
m_editorContext,
m_contentFactory->CreateWorkspaceContentController(windowState)),
params);
if (window != nullptr) {
m_workspaceCoordinator->RegisterExistingWindow(*window);
@@ -68,7 +74,9 @@ EditorHostWindow* EditorWindowManager::CreateUtilityWindow(
}
EditorHostWindow* const window = m_hostRuntime.CreateHostWindow(
m_contentFactory->CreateUtilityContentController(descriptor),
std::make_unique<EditorWindowRuntimeController>(
m_editorContext,
m_contentFactory->CreateUtilityContentController(descriptor)),
params);
if (window != nullptr) {
m_workspaceCoordinator->RegisterExistingWindow(*window);
@@ -107,15 +115,85 @@ void EditorWindowManager::DestroyClosedWindows() {
}
void EditorWindowManager::RenderAllWindows() {
m_hostRuntime.RenderAllWindows();
struct WindowFrameTransferBatch {
EditorHostWindow* sourceWindow = nullptr;
EditorWindowFrameTransferRequests requests = {};
};
std::vector<WindowFrameTransferBatch> transferBatches = {};
const std::vector<EditorHostWindow*> windows = m_hostRuntime.GetWindows();
transferBatches.reserve(windows.size());
for (EditorHostWindow* window : windows) {
if (window == nullptr ||
!window->HasLiveHostWindow() ||
window->GetLifecycleState() != EditorWindowLifecycleState::Running) {
continue;
}
if (window->ConsumeSkipNextSteadyStateFrame()) {
RefreshWindowPresentation(*window);
continue;
}
EditorWindowFrameTransferRequests transferRequests = DriveWindowFrame(*window);
RefreshWindowPresentation(*window);
if (!transferRequests.HasPendingRequests()) {
continue;
}
transferBatches.push_back(WindowFrameTransferBatch{
window,
std::move(transferRequests),
});
}
for (WindowFrameTransferBatch& batch : transferBatches) {
if (batch.sourceWindow == nullptr ||
!batch.sourceWindow->HasLiveHostWindow() ||
batch.sourceWindow->GetLifecycleState() != EditorWindowLifecycleState::Running) {
continue;
}
DispatchWindowFrameTransferRequests(
*batch.sourceWindow,
batch.requests);
}
}
EditorContext& EditorWindowManager::GetEditorContext() {
return m_editorContext;
bool EditorWindowManager::InitializeHostWindow(
EditorHostWindow& window,
const EditorHostWindowRuntimeInitializationParams& params) {
return window.InitializeRuntime(params);
}
const EditorContext& EditorWindowManager::GetEditorContext() const {
return m_editorContext;
EditorWindowFrameTransferRequests EditorWindowManager::DriveWindowFrame(
EditorHostWindow& window) {
return DriveWindowFrameInternal(window, false);
}
EditorWindowFrameTransferRequests EditorWindowManager::DriveImmediateWindowFrame(
EditorHostWindow& window) {
return DriveWindowFrameInternal(window, true);
}
EditorWindowFrameTransferRequests EditorWindowManager::DriveWindowFrameInternal(
EditorHostWindow& window,
bool requestSkipNextSteadyStateFrame) {
if (!window.IsRenderReady() ||
!window.HasLiveHostWindow() ||
window.GetLifecycleState() != EditorWindowLifecycleState::Running) {
return {};
}
EditorWindowFrameTransferRequests transferRequests =
window.RenderHostFrame(IsGlobalTabDragActive());
window.ValidateHostFrame();
if (requestSkipNextSteadyStateFrame) {
window.RequestSkipNextSteadyStateFrame();
}
return transferRequests;
}
bool EditorWindowManager::IsGlobalTabDragActive() const {