Harden editor app windowing boundary

This commit is contained in:
2026-04-26 16:01:07 +08:00
parent f4afaf184e
commit ac626d48c4
31 changed files with 473 additions and 553 deletions

View File

@@ -4,31 +4,11 @@
#include "Windowing/Presentation/EditorWindowPresentationPolicy.h"
#include "Windowing/System/EditorWindowSystem.h"
#include <XCEditor/Workspace/UIEditorDetachedWindowPolicy.h>
#include <XCEditor/Workspace/UIEditorWorkspaceLayoutPersistence.h>
namespace XCEngine::UI::Editor::App {
namespace {
UIEditorWorkspaceController BuildWorkspaceControllerForWindowState(
const UIEditorPanelRegistry& panelRegistry,
const UIEditorWindowWorkspaceState& windowState) {
return UIEditorWorkspaceController(
panelRegistry,
windowState.workspace,
windowState.session);
}
UIEditorWindowWorkspaceState BuildWindowStateFromController(
std::string_view windowId,
const UIEditorWorkspaceController& workspaceController) {
UIEditorWindowWorkspaceState windowState = {};
windowState.windowId = std::string(windowId);
windowState.workspace = workspaceController.GetWorkspace();
windowState.session = workspaceController.GetSession();
return windowState;
}
EditorWindowContentCursorKind ToContentCursorKind(ProjectPanel::CursorKind cursorKind) {
switch (cursorKind) {
case ProjectPanel::CursorKind::ResizeEW:
@@ -118,17 +98,10 @@ void EditorWorkspaceWindowContentController::RefreshWorkspaceProjection(
}
bool EditorWorkspaceWindowContentController::TryBuildAuthoritativeWorkspaceController(
UIEditorWorkspaceController& outController) const {
const UIEditorWindowWorkspaceState* windowState =
m_windowSystem.FindWindowState(m_windowId);
if (windowState == nullptr) {
return false;
}
outController = BuildWorkspaceControllerForWindowState(
m_windowSystem.GetPanelRegistry(),
*windowState);
return true;
UIEditorWorkspaceController& outController) {
return m_windowSystem.TryBuildLiveWindowWorkspaceController(
m_windowId,
outController);
}
void EditorWorkspaceWindowContentController::Initialize(
@@ -161,10 +134,7 @@ EditorWindowFrameTransferRequests EditorWorkspaceWindowContentController::Update
return {};
}
const auto beforeSnapshot = BuildUIEditorWorkspaceLayoutSnapshot(
workspaceController.GetWorkspace(),
workspaceController.GetSession());
EditorWindowFrameTransferRequests transferRequests = m_frameOrchestrator.UpdateAndAppend(
return m_frameOrchestrator.UpdateAndAppend(
context.editorContext,
workspaceController,
m_shellRuntime,
@@ -176,15 +146,6 @@ EditorWindowFrameTransferRequests EditorWorkspaceWindowContentController::Update
context.globalTabDragActive,
context.useDetachedTitleBarTabStrip,
drawData);
const auto afterSnapshot = BuildUIEditorWorkspaceLayoutSnapshot(
workspaceController.GetWorkspace(),
workspaceController.GetSession());
if (!AreUIEditorWorkspaceLayoutSnapshotsEquivalent(beforeSnapshot, afterSnapshot)) {
transferRequests.workspace.workspaceMutation = EditorWindowWorkspaceMutationRequest{
.windowState = BuildWindowStateFromController(m_windowId, workspaceController),
};
}
return transferRequests;
}
void EditorWorkspaceWindowContentController::RenderRequestedViewports(