#pragma once #include "Element.hpp" #include namespace GUIStuff { class GUIManager; class TreeListing : public Element { public: static constexpr float ENTRY_HEIGHT = 25.0f; struct ParentObjectIDPair { NetworkingObjects::NetObjID parent; NetworkingObjects::NetObjID object; bool operator==(const ParentObjectIDPair&) const = default; }; struct ParentObjectIDStack { std::vector parents; NetworkingObjects::NetObjID object; }; struct DisplayData { struct ObjInList { NetworkingObjects::NetObjID id; bool isDirectory = false; bool isDirectoryOpen = false; }; std::function(NetworkingObjects::NetObjID, size_t)> getObjInListAtIndex; std::function getIndexOfObjInList; std::function setDirectoryOpen; std::function drawNonDirectoryObjIconGUI; std::function drawObjGUI; std::function&)> moveObjectsToListAtIndex; }; struct SelectionData { std::vector orderedObjsSelected; std::unordered_set objsSelected; }; void update(UpdateInputData& io, GUIManager& gui, NetworkingObjects::NetObjID rootObjID, const DisplayData& displayData, SelectionData& selectionData); virtual void clay_draw(SkCanvas* canvas, UpdateInputData& io, Clay_RenderCommand* command, bool skiaAA) override; private: bool dragHoldSelected = false; void set_single_selected_object(SelectionData& selectionData); 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& hoveredObject, std::vector& parentIDStack, bool parentJustSelected); void select_and_unselect_parents(const std::vector& parentIDStack, NetworkingObjects::NetObjID newSelectedObj, SelectionData& selectionData); void unselect_object(NetworkingObjects::NetObjID id, SelectionData& selectionData); bool topHalfOfHovered = false; std::optional objDragged; std::optional oldHoveredObject; std::chrono::steady_clock::time_point timeStartedHoveringOverObject; }; }