#pragma once #include "Windowing/System/EditorWindowSynchronizationPlan.h" #include #include #include #include namespace XCEngine::UI::Editor { class EditorWindowWorkspaceStore; class EditorWindowSystem final { public: explicit EditorWindowSystem(UIEditorPanelRegistry panelRegistry); ~EditorWindowSystem(); EditorWindowSystem(const EditorWindowSystem&) = delete; EditorWindowSystem& operator=(const EditorWindowSystem&) = delete; EditorWindowSystem(EditorWindowSystem&&) = delete; EditorWindowSystem& operator=(EditorWindowSystem&&) = delete; const UIEditorPanelRegistry& GetPanelRegistry() const; bool BootstrapPrimaryWindow( std::string_view primaryWindowId, const UIEditorWindowWorkspaceState& primaryWindowState, std::string& outError); bool ValidateWindowSet( const UIEditorWindowWorkspaceSet& windowSet, std::string& outError) const; bool IsPrimaryWindowId(std::string_view windowId) const; const UIEditorWindowWorkspaceSet& GetWindowSet() const; const UIEditorWindowWorkspaceState* FindWindowState(std::string_view windowId) const; UIEditorWindowWorkspaceController BuildWorkspaceMutationController() const; EditorWindowSynchronizationPlan BuildPlanForWindowSet( const UIEditorWindowWorkspaceSet& targetWindowSet, const std::vector& hostWindows, std::wstring_view primaryWindowTitle, std::string_view preferredNewWindowId, const EditorWindowSynchronizationPlacement& preferredPlacement, std::string& outError) const; EditorWindowSynchronizationPlan BuildPlanForWorkspaceMutationRequest( const EditorWindowWorkspaceMutationRequest& request, const std::vector& hostWindows, std::wstring_view primaryWindowTitle, std::string& outError) const; EditorWindowSynchronizationPlan BuildPlanForDestroyedWindow( std::string_view windowId, const std::vector& hostWindows, std::wstring_view primaryWindowTitle, std::string& outError) const; EditorWindowSynchronizationPlan BuildSynchronizationPlan( const EditorWindowSynchronizationPlannerInput& input, std::string& outError) const; bool CommitSynchronizationPlan( const EditorWindowSynchronizationPlan& plan, std::string& outError); UIEditorWindowWorkspaceOperationResult EvaluateDetachPanelToNewWindow( std::string_view sourceWindowId, std::string_view sourceNodeId, std::string_view panelId, UIEditorWindowWorkspaceController& outController) const; private: static bool RemoveWindowStateFromSet( UIEditorWindowWorkspaceSet& windowSet, std::string_view windowId); std::unique_ptr m_workspaceStore = {}; }; } // namespace XCEngine::UI::Editor