Refactor editor windowing boundaries

This commit is contained in:
2026-04-26 13:44:19 +08:00
parent c3188da779
commit bd060ba031
20 changed files with 340 additions and 409 deletions

View File

@@ -10,6 +10,15 @@ 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) {
@@ -43,27 +52,18 @@ EditorWindowContentCursorKind ToContentCursorKind(
}
}
EditorWorkspaceWindowProjection BuildWorkspaceProjectionFromController(
const UIEditorWorkspaceController& workspaceController) {
EditorWorkspaceWindowProjection projection = {};
projection.minimumOuterSize = ResolveUIEditorDetachedWorkspaceMinimumOuterSize(
workspaceController);
projection.useDetachedTitleBarTabStrip = HasUIEditorSingleVisibleRootTab(workspaceController);
projection.tabStripTitleText = ResolveUIEditorDetachedWorkspaceTitle(workspaceController);
projection.detachedWindowTitleText = ResolveUIEditorDetachedWorkspaceTitle(workspaceController);
return projection;
}
} // namespace
EditorWorkspaceWindowContentController::EditorWorkspaceWindowContentController(
std::string windowId,
UIEditorWorkspaceController workspaceController,
const UIEditorWindowWorkspaceState& windowState,
EditorWindowSystem& windowSystem)
: m_windowId(std::move(windowId)),
m_windowSystem(windowSystem) {
RefreshProjectionFromWorkspaceController(workspaceController);
}
: m_windowId(windowState.windowId)
, m_windowSystem(windowSystem)
, m_projection(BuildEditorWorkspaceWindowProjection(
std::wstring_view{},
windowSystem.GetPanelRegistry(),
windowState,
false)) {}
EditorWorkspaceWindowContentController::~EditorWorkspaceWindowContentController() = default;
@@ -131,22 +131,6 @@ bool EditorWorkspaceWindowContentController::TryBuildAuthoritativeWorkspaceContr
return true;
}
void EditorWorkspaceWindowContentController::RefreshProjectionFromWorkspaceController(
const UIEditorWorkspaceController& workspaceController,
bool primary) {
const std::wstring preservedWindowTitle = m_projection.windowTitle;
m_projection = BuildWorkspaceProjectionFromController(workspaceController);
if (!primary) {
m_projection.windowTitle = ResolveEditorWindowPresentationTitle(
std::wstring_view{},
workspaceController.GetPanelRegistry(),
BuildWindowStateFromController(m_windowId, workspaceController),
false);
} else if (!preservedWindowTitle.empty()) {
m_projection.windowTitle = preservedWindowTitle;
}
}
void EditorWorkspaceWindowContentController::Initialize(
const EditorWindowContentInitializationContext& context) {
m_shellRuntime.Initialize(context.repoRoot, context.textureHost, context.textMeasurer);
@@ -196,18 +180,9 @@ EditorWindowFrameTransferRequests EditorWorkspaceWindowContentController::Update
workspaceController.GetWorkspace(),
workspaceController.GetSession());
if (!AreUIEditorWorkspaceLayoutSnapshotsEquivalent(beforeSnapshot, afterSnapshot)) {
std::string error = {};
if (!m_windowSystem.CommitLiveWindowMutation(
m_windowId,
workspaceController,
error)) {
AppendUIEditorRuntimeTrace(
"window",
"workspace direct commit rejected for window '" +
m_windowId + "': " + error);
} else {
RefreshProjectionFromWorkspaceController(workspaceController, context.primary);
}
transferRequests.workspace.workspaceMutation = EditorWindowWorkspaceMutationRequest{
.windowState = BuildWindowStateFromController(m_windowId, workspaceController),
};
}
return transferRequests;
}
@@ -297,12 +272,10 @@ std::string EditorWorkspaceWindowContentController::ResolveDetachedWindowTitleTe
}
std::unique_ptr<EditorWindowContentController> CreateEditorWorkspaceWindowContentController(
std::string_view windowId,
UIEditorWorkspaceController workspaceController,
const UIEditorWindowWorkspaceState& windowState,
EditorWindowSystem& windowSystem) {
return std::make_unique<EditorWorkspaceWindowContentController>(
std::string(windowId),
std::move(workspaceController),
windowState,
windowSystem);
}