Refactor editor windowing and update renderer regression

This commit is contained in:
2026-04-26 03:41:58 +08:00
parent 68993c46bb
commit 4fcaac81d6
39 changed files with 1181 additions and 872 deletions

View File

@@ -3,13 +3,15 @@
#include "Bootstrap/EditorResources.h"
#include "Composition/EditorContext.h"
#include "Platform/Win32/Chrome/EditorWindowChromeController.h"
#include "Platform/Win32/Windowing/EditorFloatingWindowPlacement.h"
#include "Platform/Win32/Windowing/EditorWindow.h"
#include "Windowing/Content/EditorWindowContentFactory.h"
#include "Windowing/Content/EditorWindowContentController.h"
#include "Platform/Win32/Runtime/EditorWindowFrameDriver.h"
#include "Platform/Win32/Windowing/EditorUtilityWindowCoordinator.h"
#include "Platform/Win32/Windowing/EditorWindowLifecycleCoordinator.h"
#include "Platform/Win32/Windowing/EditorWindowWorkspaceCoordinator.h"
#include "Windowing/Coordinator/EditorUtilityWindowCoordinator.h"
#include "Windowing/Coordinator/EditorWindowLifecycleCoordinator.h"
#include "Windowing/Coordinator/EditorWindowWorkspaceCoordinator.h"
#include "Windowing/System/EditorWindowSystem.h"
#include <XCEditor/Workspace/UIEditorWorkspaceController.h>
@@ -61,17 +63,19 @@ EditorWindowHostRuntime::EditorWindowHostRuntime(
EditorWindowHostConfig hostConfig,
std::filesystem::path repoRoot,
EditorContext& editorContext,
EditorWindowSystem& windowSystem,
EditorWindowContentFactory& contentFactory)
: m_hostConfig(hostConfig),
m_repoRoot(std::move(repoRoot)),
m_editorContext(editorContext),
m_windowSystem(windowSystem),
m_contentFactory(contentFactory) {}
EditorWindowHostRuntime::~EditorWindowHostRuntime() = default;
EditorWindow* EditorWindowHostRuntime::CreateEditorWindow(
std::unique_ptr<EditorWindowContentController> contentController,
const CreateParams& params) {
const EditorWindowCreateParams& params) {
if (contentController == nullptr) {
LogRuntimeTrace("window", "window creation failed: content controller is null");
return nullptr;
@@ -113,14 +117,24 @@ EditorWindow* EditorWindowHostRuntime::CreateEditorWindow(
m_pendingCreateWindow = rawWindow;
const DWORD windowStyle = params.nativeStylePolicy.useHostWindowStyle
? m_hostConfig.windowStyle
: params.nativeStylePolicy.windowStyle;
: static_cast<DWORD>(params.nativeStylePolicy.windowStyle);
const DWORD extendedWindowStyle =
params.nativeStylePolicy.extendedWindowStyle != 0u
? static_cast<DWORD>(params.nativeStylePolicy.extendedWindowStyle)
: WS_EX_APPWINDOW;
const int initialX = params.initialX == kEditorWindowDefaultPosition
? CW_USEDEFAULT
: params.initialX;
const int initialY = params.initialY == kEditorWindowDefaultPosition
? CW_USEDEFAULT
: params.initialY;
const HWND hwnd = CreateWindowExW(
params.nativeStylePolicy.extendedWindowStyle,
extendedWindowStyle,
m_hostConfig.windowClassName,
rawWindow->GetTitle().c_str(),
windowStyle,
params.initialX,
params.initialY,
initialX,
initialY,
params.initialWidth,
params.initialHeight,
nullptr,
@@ -181,17 +195,18 @@ EditorWindow* EditorWindowHostRuntime::CreateEditorWindow(
EditorWindow* EditorWindowHostRuntime::CreateWorkspaceWindow(
UIEditorWorkspaceController workspaceController,
const CreateParams& params) {
const EditorWindowCreateParams& params) {
return CreateEditorWindow(
m_contentFactory.CreateWorkspaceContentController(
params.windowId,
std::move(workspaceController)),
std::move(workspaceController),
m_windowSystem),
params);
}
EditorWindow* EditorWindowHostRuntime::CreateUtilityWindow(
const EditorUtilityWindowDescriptor& descriptor,
const CreateParams& params) {
const EditorWindowCreateParams& params) {
return CreateEditorWindow(
m_contentFactory.CreateUtilityContentController(descriptor),
params);
@@ -215,6 +230,111 @@ bool EditorWindowHostRuntime::HasWindows() const {
return !m_windows.empty();
}
std::vector<EditorHostWindow*> EditorWindowHostRuntime::GetWindows() {
std::vector<EditorHostWindow*> windows = {};
windows.reserve(m_windows.size());
for (const std::unique_ptr<EditorWindow>& window : m_windows) {
if (window != nullptr) {
windows.push_back(window.get());
}
}
return windows;
}
std::vector<const EditorHostWindow*> EditorWindowHostRuntime::GetWindows() const {
std::vector<const EditorHostWindow*> windows = {};
windows.reserve(m_windows.size());
for (const std::unique_ptr<EditorWindow>& window : m_windows) {
if (window != nullptr) {
windows.push_back(window.get());
}
}
return windows;
}
std::wstring_view EditorWindowHostRuntime::GetPrimaryWindowTitle() const {
return m_hostConfig.primaryWindowTitle != nullptr
? std::wstring_view(m_hostConfig.primaryWindowTitle)
: std::wstring_view{};
}
bool EditorWindowHostRuntime::TryGetCursorScreenPoint(
EditorWindowScreenPoint& outPoint) const {
POINT nativePoint = {};
if (!GetCursorPos(&nativePoint)) {
outPoint = {};
return false;
}
outPoint.x = nativePoint.x;
outPoint.y = nativePoint.y;
return true;
}
EditorWindowScreenRect EditorWindowHostRuntime::ResolveFloatingPlacement(
const EditorWindowScreenPoint& screenPoint,
int preferredWidth,
int preferredHeight) const {
POINT nativePoint = {};
nativePoint.x = screenPoint.x;
nativePoint.y = screenPoint.y;
const RECT nativeRect = BuildEditorFloatingWindowRect(
nativePoint,
preferredWidth,
preferredHeight);
EditorWindowScreenRect rect = {};
rect.left = nativeRect.left;
rect.top = nativeRect.top;
rect.right = nativeRect.right;
rect.bottom = nativeRect.bottom;
return rect;
}
EditorHostWindow* EditorWindowHostRuntime::FindWindowFromScreenPoint(
const EditorWindowScreenPoint& screenPoint) {
POINT nativePoint = {};
nativePoint.x = screenPoint.x;
nativePoint.y = screenPoint.y;
const HWND hitWindow = WindowFromPoint(nativePoint);
if (hitWindow == nullptr) {
return nullptr;
}
return FindWindow(GetAncestor(hitWindow, GA_ROOT));
}
const EditorHostWindow* EditorWindowHostRuntime::FindWindowFromScreenPoint(
const EditorWindowScreenPoint& screenPoint) const {
return const_cast<EditorWindowHostRuntime*>(this)->FindWindowFromScreenPoint(screenPoint);
}
void EditorWindowHostRuntime::ReapDestroyedWindows() {
for (auto it = m_windows.begin(); it != m_windows.end();) {
EditorWindow* const window = it->get();
if (window == nullptr || !window->IsDestroyed()) {
++it;
continue;
}
if (m_pendingCreateWindow == window) {
m_pendingCreateWindow = nullptr;
}
LogRuntimeTrace(
"window-close",
"ReapDestroyedWindows erase windowId='" + std::string(window->GetWindowId()) +
"' hostBefore=" + DescribeHostWindows(m_windows));
it = m_windows.erase(it);
LogRuntimeTrace(
"window-close",
"ReapDestroyedWindows erase end hostAfter=" + DescribeHostWindows(m_windows));
}
}
std::string EditorWindowHostRuntime::DescribeWindows() const {
return DescribeHostWindows(m_windows);
}
void EditorWindowHostRuntime::RenderAllWindows(
bool globalTabDragActive,
EditorWindowWorkspaceCoordinator& workspaceCoordinator,
@@ -229,7 +349,7 @@ void EditorWindowHostRuntime::RenderAllWindows(
for (const std::unique_ptr<EditorWindow>& window : m_windows) {
if (window == nullptr ||
window->GetHwnd() == nullptr ||
!window->HasLiveHostWindow() ||
window->GetLifecycleState() != EditorWindowLifecycleState::Running) {
continue;
}
@@ -257,7 +377,7 @@ void EditorWindowHostRuntime::RenderAllWindows(
for (WindowFrameTransferBatch& batch : transferBatches) {
if (batch.sourceWindow == nullptr ||
batch.sourceWindow->GetHwnd() == nullptr ||
!batch.sourceWindow->HasLiveHostWindow() ||
batch.sourceWindow->GetLifecycleState() != EditorWindowLifecycleState::Running) {
continue;
}
@@ -289,7 +409,7 @@ const EditorWindow* EditorWindowHostRuntime::FindWindow(HWND hwnd) const {
return const_cast<EditorWindowHostRuntime*>(this)->FindWindow(hwnd);
}
EditorWindow* EditorWindowHostRuntime::FindWindow(std::string_view windowId) {
EditorWindow* EditorWindowHostRuntime::FindWindowByIdImpl(std::string_view windowId) {
if (windowId.empty()) {
return nullptr;
}
@@ -303,8 +423,16 @@ EditorWindow* EditorWindowHostRuntime::FindWindow(std::string_view windowId) {
return nullptr;
}
const EditorWindow* EditorWindowHostRuntime::FindWindow(std::string_view windowId) const {
return const_cast<EditorWindowHostRuntime*>(this)->FindWindow(windowId);
const EditorWindow* EditorWindowHostRuntime::FindWindowByIdImpl(std::string_view windowId) const {
return const_cast<EditorWindowHostRuntime*>(this)->FindWindowByIdImpl(windowId);
}
EditorHostWindow* EditorWindowHostRuntime::FindWindowById(std::string_view windowId) {
return FindWindowByIdImpl(windowId);
}
const EditorHostWindow* EditorWindowHostRuntime::FindWindowById(std::string_view windowId) const {
return FindWindowByIdImpl(windowId);
}
EditorWindow* EditorWindowHostRuntime::FindPrimaryWindow() {