103 lines
4.0 KiB
C++
103 lines
4.0 KiB
C++
#pragma once
|
|
|
|
#include <XCEditor/Windowing/System/EditorWindowSynchronizationPlan.h>
|
|
#include <XCEditor/Workspace/UIEditorWorkspaceController.h>
|
|
#include <XCEditor/Workspace/UIEditorWindowWorkspaceController.h>
|
|
|
|
#include <functional>
|
|
#include <string>
|
|
#include <string_view>
|
|
#include <vector>
|
|
|
|
namespace XCEngine::UI::Editor {
|
|
|
|
struct EditorWindowWorkspaceMutation {
|
|
UIEditorWindowWorkspaceOperationResult operation = {};
|
|
UIEditorWindowWorkspaceSet targetWindowSet = {};
|
|
std::string preferredNewWindowId = {};
|
|
|
|
[[nodiscard]] bool HasStateChange() const {
|
|
return operation.status == UIEditorWindowWorkspaceOperationStatus::Changed;
|
|
}
|
|
};
|
|
|
|
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 ValidateWindowSet(
|
|
const UIEditorWindowWorkspaceSet& windowSet,
|
|
std::string& outError) const;
|
|
bool IsPrimaryWindowId(
|
|
const UIEditorWindowWorkspaceSet& windowSet,
|
|
std::string_view windowId) const;
|
|
const UIEditorWindowWorkspaceState* FindWindowState(
|
|
const UIEditorWindowWorkspaceSet& windowSet,
|
|
std::string_view windowId) const;
|
|
bool TryBuildWindowWorkspaceController(
|
|
const UIEditorWindowWorkspaceSet& windowSet,
|
|
std::string_view windowId,
|
|
UIEditorWorkspaceController& outController) const;
|
|
EditorWindowSynchronizationPlan BuildPlanForWindowSet(
|
|
const UIEditorWindowWorkspaceSet& targetWindowSet,
|
|
const std::vector<EditorWindowHostSnapshot>& hostWindows,
|
|
std::wstring_view primaryWindowTitle,
|
|
std::string_view preferredNewWindowId,
|
|
const EditorWindowSynchronizationPlacement& preferredPlacement,
|
|
std::string& outError) const;
|
|
EditorWindowSynchronizationPlan BuildPlanForDestroyedWindow(
|
|
const UIEditorWindowWorkspaceSet& authoritativeWindowSet,
|
|
std::string_view windowId,
|
|
const std::vector<EditorWindowHostSnapshot>& hostWindows,
|
|
std::wstring_view primaryWindowTitle,
|
|
std::string& outError) const;
|
|
EditorWindowSynchronizationPlan BuildSynchronizationPlan(
|
|
const EditorWindowSynchronizationPlannerInput& input,
|
|
std::string& outError) const;
|
|
|
|
EditorWindowWorkspaceMutation EvaluateDetachPanelToNewWindow(
|
|
const UIEditorWindowWorkspaceSet& authoritativeWindowSet,
|
|
std::string_view sourceWindowId,
|
|
std::string_view sourceNodeId,
|
|
std::string_view panelId) const;
|
|
EditorWindowWorkspaceMutation EvaluateMovePanelToStack(
|
|
const UIEditorWindowWorkspaceSet& authoritativeWindowSet,
|
|
std::string_view sourceWindowId,
|
|
std::string_view sourceNodeId,
|
|
std::string_view panelId,
|
|
std::string_view targetWindowId,
|
|
std::string_view targetNodeId,
|
|
std::size_t targetVisibleInsertionIndex) const;
|
|
EditorWindowWorkspaceMutation EvaluateDockPanelRelative(
|
|
const UIEditorWindowWorkspaceSet& authoritativeWindowSet,
|
|
std::string_view sourceWindowId,
|
|
std::string_view sourceNodeId,
|
|
std::string_view panelId,
|
|
std::string_view targetWindowId,
|
|
std::string_view targetNodeId,
|
|
UIEditorWorkspaceDockPlacement placement,
|
|
float splitRatio = 0.5f) const;
|
|
|
|
private:
|
|
EditorWindowWorkspaceMutation BuildWorkspaceMutation(
|
|
const UIEditorWindowWorkspaceSet& authoritativeWindowSet,
|
|
const std::function<UIEditorWindowWorkspaceOperationResult(
|
|
UIEditorWindowWorkspaceController&)>& evaluator,
|
|
std::string preferredNewWindowId = {}) const;
|
|
static bool RemoveWindowStateFromSet(
|
|
UIEditorWindowWorkspaceSet& windowSet,
|
|
std::string_view windowId);
|
|
|
|
UIEditorPanelRegistry m_panelRegistry = {};
|
|
};
|
|
|
|
} // namespace XCEngine::UI::Editor
|