Files
XCEngine/new_editor/app/Windowing/Workspace/WindowWorkspaceTransferQueue.h

86 lines
2.4 KiB
C++

#pragma once
#include <algorithm>
#include <cstdint>
#include <string>
#include <string_view>
#include <utility>
#include <vector>
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<WindowWorkspaceTransferRequest> ConsumePendingWorkspaceTransferRequests() {
std::vector<WindowWorkspaceTransferRequest> 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<WindowWorkspaceTransferRequest> m_pendingWorkspaceTransferRequests = {};
};
} // namespace XCEngine::UI::Editor::App