Align SRP boundaries and editor windowing
This commit is contained in:
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user