#pragma once #include #include #include #include #include #include namespace XCEngine::UI::Editor::App { struct WindowWorkspaceTransferRequest { enum class Type : std::uint8_t { None = 0, StartGlobalTabDrag, DetachPanel, }; Type type = Type::None; std::string sourceWindowId = {}; std::string sourceNodeId = {}; std::string panelId = {}; std::int32_t screenX = 0; std::int32_t screenY = 0; bool hasScreenPoint = false; bool IsValid() const { return type != Type::None && !sourceWindowId.empty() && !sourceNodeId.empty() && !panelId.empty() && hasScreenPoint; } }; class WindowWorkspaceTransferQueue final { public: void QueueWorkspaceTransferRequest(const WindowWorkspaceTransferRequest& request) { if (!request.IsValid()) { return; } const auto it = std::find_if( m_pendingWorkspaceTransferRequests.begin(), m_pendingWorkspaceTransferRequests.end(), [&request](const WindowWorkspaceTransferRequest& current) { return current.type == request.type && current.sourceWindowId == request.sourceWindowId && current.sourceNodeId == request.sourceNodeId && current.panelId == request.panelId; }); if (it == m_pendingWorkspaceTransferRequests.end()) { m_pendingWorkspaceTransferRequests.push_back(request); } else { *it = request; } } std::vector ConsumePendingWorkspaceTransferRequests() { std::vector requests = std::move(m_pendingWorkspaceTransferRequests); m_pendingWorkspaceTransferRequests.clear(); return requests; } void RemoveWindow(std::string_view windowId) { if (windowId.empty()) { return; } std::erase_if( m_pendingWorkspaceTransferRequests, [windowId](const WindowWorkspaceTransferRequest& current) { return current.sourceWindowId == windowId; }); } private: std::vector m_pendingWorkspaceTransferRequests = {}; }; } // namespace XCEngine::UI::Editor::App