#include "Windowing/EditorWindowManager.h" #include "Windowing/Coordinator/EditorWindowLifecycleCoordinator.h" #include "Windowing/Coordinator/EditorUtilityWindowCoordinator.h" #include "Windowing/Coordinator/EditorWindowWorkspaceCoordinator.h" #include #include namespace XCEngine::UI::Editor::App { EditorWindowManager::EditorWindowManager( EditorContext& editorContext, EditorWindowSystem& windowSystem, EditorWindowHostRuntimeServices& hostRuntime) : m_editorContext(editorContext) , m_hostRuntime(hostRuntime) { m_workspaceCoordinator = std::make_unique(m_hostRuntime, windowSystem); m_utilityCoordinator = std::make_unique(m_hostRuntime); m_lifecycleCoordinator = std::make_unique( m_hostRuntime, *m_workspaceCoordinator); m_hostRuntime.BindHostCoordinator(*this); m_workspaceCoordinator->BindLifecycleCoordinator(*m_lifecycleCoordinator); m_utilityCoordinator->BindLifecycleCoordinator(*m_lifecycleCoordinator); } EditorWindowManager::~EditorWindowManager() = default; EditorHostWindow* EditorWindowManager::CreateWorkspaceWindow( const UIEditorWindowWorkspaceState& windowState, const EditorWindowCreateParams& params) { EditorHostWindow* const window = m_hostRuntime.CreateWorkspaceWindow(windowState, params); if (window != nullptr) { m_workspaceCoordinator->RegisterExistingWindow(*window); } return window; } EditorHostWindow* EditorWindowManager::CreateUtilityWindow( const EditorUtilityWindowDescriptor& descriptor, const EditorWindowCreateParams& params) { EditorHostWindow* const window = m_hostRuntime.CreateUtilityWindow(descriptor, params); if (window != nullptr) { m_workspaceCoordinator->RegisterExistingWindow(*window); } return window; } void EditorWindowManager::Shutdown() { m_workspaceCoordinator->EndGlobalTabDragSession(); m_lifecycleCoordinator->ShutdownAllWindows(); } bool EditorWindowManager::RequestPrimaryWindowClose() { if (m_lifecycleCoordinator == nullptr) { return false; } for (EditorHostWindow* window : m_hostRuntime.GetWindows()) { if (window == nullptr || !window->IsPrimary()) { continue; } m_lifecycleCoordinator->PostCloseRequest(*window); return true; } return false; } bool EditorWindowManager::HasWindows() const { return !m_hostRuntime.GetWindows().empty(); } void EditorWindowManager::DestroyClosedWindows() { m_lifecycleCoordinator->ReapDestroyedWindows(); } void EditorWindowManager::RenderAllWindows() { m_hostRuntime.RenderAllWindows(); } EditorContext& EditorWindowManager::GetEditorContext() { return m_editorContext; } const EditorContext& EditorWindowManager::GetEditorContext() const { return m_editorContext; } bool EditorWindowManager::IsGlobalTabDragActive() const { return m_workspaceCoordinator != nullptr && m_workspaceCoordinator->IsGlobalTabDragActive(); } bool EditorWindowManager::OwnsActiveGlobalTabDrag(std::string_view windowId) const { return m_workspaceCoordinator != nullptr && m_workspaceCoordinator->OwnsActiveGlobalTabDrag(windowId); } bool EditorWindowManager::HandleGlobalTabDragPointerMove(EditorHostWindow& window) { return m_workspaceCoordinator != nullptr && m_workspaceCoordinator->HandleGlobalTabDragPointerMove(window); } bool EditorWindowManager::HandleGlobalTabDragPointerButtonUp(EditorHostWindow& window) { return m_workspaceCoordinator != nullptr && m_workspaceCoordinator->HandleGlobalTabDragPointerButtonUp(window); } void EditorWindowManager::EndGlobalTabDragSession() { if (m_workspaceCoordinator != nullptr) { m_workspaceCoordinator->EndGlobalTabDragSession(); } } void EditorWindowManager::RefreshWindowPresentation(EditorHostWindow& window) { if (m_workspaceCoordinator != nullptr) { m_workspaceCoordinator->RefreshWindowPresentation(window); } } void EditorWindowManager::DispatchWindowFrameTransferRequests( EditorHostWindow& sourceWindow, const EditorWindowFrameTransferRequests& transferRequests) { if (m_workspaceCoordinator != nullptr) { m_workspaceCoordinator->HandleWindowFrameTransferRequests( sourceWindow, transferRequests); } if (m_utilityCoordinator != nullptr) { m_utilityCoordinator->HandleWindowFrameTransferRequests( sourceWindow, transferRequests); } } void EditorWindowManager::ExecuteCloseRequest(EditorHostWindow& window) { if (m_lifecycleCoordinator != nullptr) { m_lifecycleCoordinator->ExecuteCloseRequest(window); } } void EditorWindowManager::HandleNativeWindowDestroyed(EditorHostWindow& window) { if (m_lifecycleCoordinator != nullptr) { m_lifecycleCoordinator->HandleNativeWindowDestroyed(window); } } void EditorWindowManager::AbortUnregisteredWindow(EditorHostWindow& window) { if (m_lifecycleCoordinator != nullptr) { m_lifecycleCoordinator->AbortUnregisteredWindow(window); } } void EditorWindowManager::ReapDestroyedWindows() { if (m_lifecycleCoordinator != nullptr) { m_lifecycleCoordinator->ReapDestroyedWindows(); } } } // namespace XCEngine::UI::Editor::App