Refactor editor windowing and update renderer regression
This commit is contained in:
@@ -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() {
|
||||
|
||||
Reference in New Issue
Block a user