Refactor editor windowing boundaries
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user