/* * InfiniPaint * Copyright (C) 2025-2026 Yousef Khadadeh * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #pragma once #include "Element.hpp" #include #include namespace GUIStuff { typedef std::vector TreeListingObjIndexList; bool is_tree_listing_obj_index_parent(const TreeListingObjIndexList& parentToCheck, const TreeListingObjIndexList& obj); } bool operator<(const GUIStuff::TreeListingObjIndexList& a, const GUIStuff::TreeListingObjIndexList& b); namespace GUIStuff { class GUIManager; class TreeListing : public Element { public: static constexpr float ENTRY_HEIGHT = 25.0f; static constexpr float ICON_SIZE = 25.0f; struct ObjInfo { TreeListingObjIndexList objIndex; bool isDirectory = false; bool isOpen = false; }; struct DirectoryInfo { size_t dirSize; bool isOpen; }; struct Data { std::set* selectedIndices = nullptr; std::function(const TreeListingObjIndexList& objIndex)> dirInfo; std::function setDirectoryOpen; std::function drawNonDirectoryObjIconGUI; std::function drawObjGUI; std::function onDoubleClick; std::function onSelectChange; std::function& objIndices, const TreeListingObjIndexList& newObjIndex)> moveObj; }; TreeListing(GUIManager& gui); void layout(const Clay_ElementId& id, const Data& newDisplayData); private: void recursive_visible_flattened_obj_list(std::vector& objs, const TreeListingObjIndexList& objIndex); void move_selected_objects(); bool isDragging = false; size_t dragIndexStart; size_t dragIndexEnd; bool dragFromTop; std::vector flattenedIndexList; Data d; }; }