2025-12-20 16:38:51 +03:00
|
|
|
#pragma once
|
|
|
|
|
#include "Element.hpp"
|
2025-12-21 00:33:04 +03:00
|
|
|
#include <Helpers/NetworkingObjects/NetObjID.hpp>
|
2025-12-20 16:38:51 +03:00
|
|
|
|
|
|
|
|
namespace GUIStuff {
|
|
|
|
|
|
|
|
|
|
class GUIManager;
|
|
|
|
|
|
|
|
|
|
class TreeListing : public Element {
|
|
|
|
|
public:
|
2025-12-21 00:33:04 +03:00
|
|
|
static constexpr float ENTRY_HEIGHT = 25.0f;
|
2025-12-21 17:40:58 +03:00
|
|
|
|
|
|
|
|
struct ParentObjectIDPair {
|
|
|
|
|
NetworkingObjects::NetObjID parent;
|
|
|
|
|
NetworkingObjects::NetObjID object;
|
|
|
|
|
bool operator==(const ParentObjectIDPair&) const = default;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct ParentObjectIDStack {
|
|
|
|
|
std::vector<NetworkingObjects::NetObjID> parents;
|
|
|
|
|
NetworkingObjects::NetObjID object;
|
|
|
|
|
};
|
|
|
|
|
|
2025-12-21 00:33:04 +03:00
|
|
|
struct DisplayData {
|
|
|
|
|
struct ObjInList {
|
|
|
|
|
NetworkingObjects::NetObjID id;
|
|
|
|
|
bool isDirectory = false;
|
|
|
|
|
bool isDirectoryOpen = false;
|
|
|
|
|
};
|
|
|
|
|
std::function<std::optional<ObjInList>(NetworkingObjects::NetObjID, size_t)> getObjInListAtIndex;
|
2025-12-21 17:40:58 +03:00
|
|
|
std::function<size_t(const ParentObjectIDPair&)> getIndexOfObjInList;
|
2025-12-21 00:33:04 +03:00
|
|
|
std::function<void(NetworkingObjects::NetObjID, bool)> setDirectoryOpen;
|
|
|
|
|
std::function<bool(NetworkingObjects::NetObjID)> drawNonDirectoryObjIconGUI;
|
2025-12-21 17:40:58 +03:00
|
|
|
std::function<bool(const ParentObjectIDPair&)> drawObjGUI;
|
|
|
|
|
std::function<void(NetworkingObjects::NetObjID, size_t, const std::vector<ParentObjectIDPair>&)> moveObjectsToListAtIndex;
|
2025-12-21 00:33:04 +03:00
|
|
|
};
|
2025-12-23 17:17:33 +03:00
|
|
|
|
|
|
|
|
struct SelectionData {
|
|
|
|
|
std::vector<ParentObjectIDPair> orderedObjsSelected;
|
|
|
|
|
std::unordered_set<NetworkingObjects::NetObjID> objsSelected;
|
|
|
|
|
};
|
|
|
|
|
|
2026-03-27 09:51:53 +03:00
|
|
|
TreeListing(GUIManager& gui);
|
2026-03-31 17:33:09 +03:00
|
|
|
void layout(const Clay_ElementId& id, NetworkingObjects::NetObjID rootObjID, const DisplayData& displayData, SelectionData& selectionData);
|
2025-12-20 16:38:51 +03:00
|
|
|
private:
|
2025-12-21 17:40:58 +03:00
|
|
|
bool dragHoldSelected = false;
|
|
|
|
|
|
2025-12-23 17:17:33 +03:00
|
|
|
void set_single_selected_object(SelectionData& selectionData);
|
2025-12-21 17:40:58 +03:00
|
|
|
|
2025-12-23 17:17:33 +03:00
|
|
|
void recursive_gui(UpdateInputData& io, GUIManager& gui, const DisplayData& displayData, SelectionData& selectionData, NetworkingObjects::NetObjID objID, size_t& itemCount, size_t itemCountToStartAt, size_t itemCountToEndAt, size_t listDepth, std::optional<ParentObjectIDStack>& hoveredObject, std::vector<NetworkingObjects::NetObjID>& parentIDStack, bool parentJustSelected);
|
2025-12-21 17:40:58 +03:00
|
|
|
|
2025-12-23 17:17:33 +03:00
|
|
|
void select_and_unselect_parents(const std::vector<NetworkingObjects::NetObjID>& parentIDStack, NetworkingObjects::NetObjID newSelectedObj, SelectionData& selectionData);
|
2025-12-21 17:40:58 +03:00
|
|
|
|
2025-12-23 17:17:33 +03:00
|
|
|
void unselect_object(NetworkingObjects::NetObjID id, SelectionData& selectionData);
|
2025-12-21 17:40:58 +03:00
|
|
|
|
|
|
|
|
bool topHalfOfHovered = false;
|
|
|
|
|
std::optional<ParentObjectIDPair> objDragged;
|
|
|
|
|
std::optional<ParentObjectIDStack> oldHoveredObject;
|
2025-12-22 19:35:29 +03:00
|
|
|
std::chrono::steady_clock::time_point timeStartedHoveringOverObject;
|
2025-12-20 16:38:51 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
}
|