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

@@ -2,13 +2,19 @@
#include "Bootstrap/EditorResources.h"
#include "System/SystemInteractionService.h"
#include "Composition/EditorContext.h"
#include "Windowing/Content/EditorWindowContentFactory.h"
#include "Windowing/EditorWindowManager.h"
#include "Platform/Win32/System/Win32SystemInteractionHost.h"
#include "Platform/Win32/Windowing/EditorWindow.h"
#include "Platform/Win32/Windowing/EditorWindowHostConfig.h"
#include "Platform/Win32/Windowing/EditorWindowHostRuntime.h"
#include "Platform/Win32/Windowing/EditorWindowMessageDispatcher.h"
#include "Support/EnvironmentFlags.h"
#include "Support/ExecutablePath.h"
#include <XCEditor/Foundation/UIEditorRuntimeTrace.h>
#include <XCEditor/Windowing/EditorWindowSystem.h>
#include <XCEditor/Workspace/UIEditorWindowWorkspaceModel.h>
#include <XCEngine/Core/Asset/ResourceManager.h>
#include <shellscalingapi.h>
@@ -72,6 +78,16 @@ void EnableDpiAwareness() {
}
}
UIEditorWindowWorkspaceState BuildPrimaryWindowState(
std::string_view windowId,
const UIEditorWorkspaceController& workspaceController) {
UIEditorWindowWorkspaceState windowState = {};
windowState.windowId = std::string(windowId);
windowState.workspace = workspaceController.GetWorkspace();
windowState.session = workspaceController.GetSession();
return windowState;
}
} // namespace
Application::Application()
@@ -125,11 +141,17 @@ bool Application::Initialize(HINSTANCE hInstance, int nCmdShow) {
hostConfig.windowStyle = kBorderlessWindowStyle;
hostConfig.primaryWindowTitle = kWindowTitle;
hostConfig.windowUserData = this;
m_windowManager = std::make_unique<App::EditorWindowManager>(
m_windowContentFactory =
App::CreateDefaultEditorWindowContentFactory(*m_windowSystem);
m_windowHostRuntime = std::make_unique<App::EditorWindowHostRuntime>(
hostConfig,
m_repoRoot,
*m_editorContext,
*m_windowSystem);
*m_windowContentFactory);
m_windowManager = std::make_unique<App::EditorWindowManager>(
*m_editorContext,
*m_windowSystem,
*m_windowHostRuntime);
m_editorContext->SetExitRequestHandler([this]() {
if (m_windowManager == nullptr) {
@@ -168,10 +190,12 @@ bool Application::Initialize(HINSTANCE hInstance, int nCmdShow) {
m_smokeTestStartTime = {};
UIEditorWorkspaceController primaryWorkspaceController =
m_editorContext->BuildWorkspaceController();
const UIEditorWindowWorkspaceState primaryWindowState =
BuildPrimaryWindowState(createParams.windowId, primaryWorkspaceController);
std::string windowSystemError = {};
if (!m_windowSystem->BootstrapPrimaryWindow(
createParams.windowId,
primaryWorkspaceController,
primaryWindowState,
windowSystemError)) {
AppendUIEditorRuntimeTrace(
"app",
@@ -179,7 +203,7 @@ bool Application::Initialize(HINSTANCE hInstance, int nCmdShow) {
return false;
}
if (m_windowManager->CreateWorkspaceWindow(
std::move(primaryWorkspaceController),
primaryWindowState,
createParams) == nullptr) {
AppendUIEditorRuntimeTrace("app", "primary window creation failed");
return false;
@@ -203,6 +227,8 @@ void Application::Shutdown() {
m_windowManager->Shutdown();
m_windowManager.reset();
}
m_windowHostRuntime.reset();
m_windowContentFactory.reset();
m_windowSystem.reset();
if (m_editorContext != nullptr) {
@@ -390,8 +416,8 @@ LRESULT CALLBACK Application::WndProc(HWND hwnd, UINT message, WPARAM wParam, LP
? reinterpret_cast<Application*>(createStruct->lpCreateParams)
: nullptr;
SetWindowLongPtrW(hwnd, GWLP_USERDATA, reinterpret_cast<LONG_PTR>(application));
if (application != nullptr && application->m_windowManager != nullptr) {
application->m_windowManager->HandlePendingNativeWindowCreated(hwnd);
if (application != nullptr && application->m_windowHostRuntime != nullptr) {
application->m_windowHostRuntime->HandlePendingNativeWindowCreated(hwnd);
}
return TRUE;
}
@@ -399,14 +425,20 @@ LRESULT CALLBACK Application::WndProc(HWND hwnd, UINT message, WPARAM wParam, LP
Application* application = GetApplicationFromWindowUserData(hwnd);
LRESULT dispatcherResult = 0;
if (application != nullptr &&
application->m_windowManager != nullptr &&
application->m_windowManager->TryDispatchWindowMessage(
application->m_windowHostRuntime != nullptr &&
application->m_windowManager != nullptr) {
if (App::EditorWindow* const window = application->m_windowHostRuntime->FindWindow(hwnd);
window != nullptr &&
App::EditorWindowMessageDispatcher::TryDispatch(
hwnd,
*application->m_windowManager,
*window,
message,
wParam,
lParam,
dispatcherResult)) {
return dispatcherResult;
return dispatcherResult;
}
}
return DefWindowProcW(hwnd, message, wParam, lParam);