TGUI  1.2.0
Loading...
Searching...
No Matches
TreeView.hpp
1
2//
3// TGUI - Texus' Graphical User Interface
4// Copyright (C) 2012-2024 Bruno Van de Velde (vdv_b@tgui.eu)
5//
6// This software is provided 'as-is', without any express or implied warranty.
7// In no event will the authors be held liable for any damages arising from the use of this software.
8//
9// Permission is granted to anyone to use this software for any purpose,
10// including commercial applications, and to alter it and redistribute it freely,
11// subject to the following restrictions:
12//
13// 1. The origin of this software must not be misrepresented;
14// you must not claim that you wrote the original software.
15// If you use this software in a product, an acknowledgment
16// in the product documentation would be appreciated but is not required.
17//
18// 2. Altered source versions must be plainly marked as such,
19// and must not be misrepresented as being the original software.
20//
21// 3. This notice may not be removed or altered from any source distribution.
22//
24
25
26#ifndef TGUI_TREE_VIEW_HPP
27#define TGUI_TREE_VIEW_HPP
28
29#include <TGUI/CopiedSharedPtr.hpp>
30#include <TGUI/Widgets/Scrollbar.hpp>
31#include <TGUI/Renderers/TreeViewRenderer.hpp>
32#include <TGUI/Text.hpp>
33
35
36TGUI_MODULE_EXPORT namespace tgui
37{
41 class TGUI_API TreeView : public Widget
42 {
43 public:
44
45 using Ptr = std::shared_ptr<TreeView>;
46 using ConstPtr = std::shared_ptr<const TreeView>;
47
48 static constexpr const char StaticWidgetType[] = "TreeView";
49
50
52 struct ConstNode
53 {
54 bool expanded = true;
55 String text;
56 std::vector<ConstNode> nodes;
57 };
58
60 struct Node
61 {
62 Text text;
63 unsigned int depth = 0;
64 bool expanded = true;
65 Node* parent = nullptr;
66 std::vector<std::shared_ptr<Node>> nodes;
67 };
68
69
77 TreeView(const char* typeName = StaticWidgetType, bool initRenderer = true);
78
79
81 // Copy constructor
83 TreeView(const TreeView&);
84
86 // Move constructor
88 TreeView(TreeView&&) = default;
89
91 // Overload of copy assignment operator
93 TreeView& operator=(const TreeView&);
94
96 // Overload of move assignment operator
98 TreeView& operator=(TreeView&&) = default;
99
100
105 TGUI_NODISCARD static TreeView::Ptr create();
106
107
113 TGUI_NODISCARD static TreeView::Ptr copy(const TreeView::ConstPtr& treeView);
114
115
120 TGUI_NODISCARD TreeViewRenderer* getSharedRenderer() override;
121 TGUI_NODISCARD const TreeViewRenderer* getSharedRenderer() const override;
122
123
129 TGUI_NODISCARD TreeViewRenderer* getRenderer() override;
130
131
136 void setSize(const Layout2d& size) override;
137 using Widget::setSize;
138
139
158 bool addItem(const std::vector<String>& hierarchy, bool createParents = true);
159
160
176 bool changeItem(const std::vector<String>& hierarchy, const String& leafText);
177
178
184 void expand(const std::vector<String>& hierarchy);
185
186
190 void expandAll();
191
192
198 void collapse(const std::vector<String>& hierarchy);
199
200
205
206
214 bool selectItem(const std::vector<String>& hierarchy);
215
216
221
222
231 bool removeItem(const std::vector<String>& hierarchy, bool removeParentsWhenEmpty = true);
232
233
238
239
244 TGUI_NODISCARD std::vector<String> getSelectedItem() const;
245
246
259 TGUI_NODISCARD ConstNode getNode(const std::vector<String>& hierarchy) const;
260
261
266 TGUI_NODISCARD std::vector<ConstNode> getNodes() const;
267
268
273 void setItemHeight(unsigned int itemHeight);
274
275
280 TGUI_NODISCARD unsigned int getItemHeight() const;
281
282
288 void setVerticalScrollbarValue(unsigned int value);
289
290
296 TGUI_NODISCARD unsigned int getVerticalScrollbarValue() const;
297
298
304 void setHorizontalScrollbarValue(unsigned int value);
305
306
312 TGUI_NODISCARD unsigned int getHorizontalScrollbarValue() const;
313
314
320 TGUI_NODISCARD bool isMouseOnWidget(Vector2f pos) const override;
321
325 bool leftMousePressed(Vector2f pos) override;
326
330 void leftMouseReleased(Vector2f pos) override;
331
335 void rightMousePressed(Vector2f pos) override;
336
340 void mouseMoved(Vector2f pos) override;
341
345 bool scrolled(float delta, Vector2f pos, bool touch) override;
346
350 void mouseNoLongerOnWidget() override;
351
355 void leftMouseButtonNoLongerDown() override;
356
360 void keyPressed(const Event::KeyEvent& event) override;
361
371 bool canHandleKeyPress(const Event::KeyEvent& event) override;
372
376 void markNodesDirty();
377
378
386 void draw(BackendRenderTarget& target, RenderStates states) const override;
387
388
390 protected:
391
401 TGUI_NODISCARD Signal& getSignal(String signalName) override;
402
403
410 void rendererChanged(const String& property) override;
411
412
416 TGUI_NODISCARD std::unique_ptr<DataIO::Node> save(SavingRenderersMap& renderers) const override;
417
418
422 void load(const std::unique_ptr<DataIO::Node>& node, const LoadingRenderersMap& renderers) override;
423
424
428 void updateTextSize() override;
429
430
432 // Returns the size without the borders
434 TGUI_NODISCARD Vector2f getInnerSize() const;
435
436
438 // Updates the bounds of the icons
440 void updateIconBounds();
441
442
444 // This function is called every frame with the time passed since the last frame.
446 bool updateTime(Duration elapsedTime) override;
447
448
450 // Makes a copy of the widget
452 TGUI_NODISCARD Widget::Ptr clone() const override;
453
454
458 void updateTextColors(std::vector<std::shared_ptr<Node>>& nodes);
459
460
464 void createNode(std::vector<std::shared_ptr<Node>>& menus, Node* parent, const String& text);
465
466
470 TGUI_NODISCARD Node* findParentNode(const std::vector<String>& hierarchy, unsigned int parentIndex, std::vector<std::shared_ptr<Node>>& nodes, Node* parent, bool createParents);
471
472
474 // Expands or collapses one of the visible items
476 void toggleNodeInternal(std::size_t index);
477
478
480 // Expands or collapses a node
482 bool expandOrCollapse(const std::vector<String>& hierarchy, bool expand);
483
484
486 // Helper function to load the items from a text file
488 void loadItems(const std::unique_ptr<DataIO::Node>& node, std::vector<std::shared_ptr<Node>>& items, Node* parent);
489
490
492 // Rebuilds the list of visible items and positions the texts
494 unsigned int updateVisibleNodes(std::vector<std::shared_ptr<Node>>& nodes, Node* selectedNode, float textPadding, unsigned int pos);
495
496
498 // Updates the text colors of the selected and hovered items
500 void updateSelectedAndHoveringItemColors();
501
502
504 // Updates the text color of the hovered item
506 void updateHoveredItem(int item);
507
508
510 // Updates the text color of the selected item
512 void updateSelectedItem(int item);
513
514
516 public:
517
518 SignalItemHierarchy onItemSelect = {"ItemSelected"};
519 SignalItemHierarchy onDoubleClick = {"DoubleClicked"};
520 SignalItemHierarchy onExpand = {"Expanded"};
521 SignalItemHierarchy onCollapse = {"Collapsed"};
522 SignalItemHierarchy onRightClick = {"RightClicked"};
523
525 protected:
526
527 // This contains the nodes of the tree
528 std::vector<std::shared_ptr<Node>> m_nodes;
529 std::vector<std::shared_ptr<Node>> m_visibleNodes;
530
531 int m_selectedItem = -1;
532 int m_hoveredItem = -1;
533
534 unsigned int m_itemHeight = 0;
535 float m_maxRight = 0;
536
537 Vector2f m_iconBounds;
538
539 CopiedSharedPtr<ScrollbarChildWidget> m_verticalScrollbar;
540 CopiedSharedPtr<ScrollbarChildWidget> m_horizontalScrollbar;
541
542
543 bool m_possibleDoubleClick = false;
544 int m_doubleClickNodeIndex = -1;
545
546 Sprite m_spriteBackground;
547 Sprite m_spriteBranchExpanded;
548 Sprite m_spriteBranchCollapsed;
549 Sprite m_spriteLeaf;
550
551 // Cached renderer properties
552 Borders m_bordersCached;
553 Borders m_paddingCached;
554 Color m_borderColorCached;
555 Color m_backgroundColorCached;
556 Color m_textColorCached;
557 Color m_textColorHoverCached;
558 Color m_selectedTextColorCached;
559 Color m_selectedTextColorHoverCached;
560 Color m_selectedBackgroundColorCached;
561 Color m_selectedBackgroundColorHoverCached;
562 Color m_backgroundColorHoverCached;
563 TextStyles m_textStyleCached;
564
566 };
567
569}
570
572
573#endif // TGUI_TREE_VIEW_HPP
Base class for render targets.
Definition BackendRenderTarget.hpp:48
Wrapper for colors.
Definition Color.hpp:72
Definition CopiedSharedPtr.hpp:45
Wrapper for durations.
Definition Duration.hpp:56
Class to store the position or size of a widget.
Definition Layout.hpp:305
Definition Outline.hpp:39
Signal to which the user can subscribe to get callbacks from.
Definition Signal.hpp:1131
Signal to which the user can subscribe to get callbacks from.
Definition Signal.hpp:62
Definition Sprite.hpp:48
Wrapper class to store strings.
Definition String.hpp:101
Wrapper for text styles.
Definition TextStyle.hpp:57
Backend-independent wrapper around the backend-specific text class.
Definition Text.hpp:50
Definition TreeViewRenderer.hpp:37
Tree view widget.
Definition TreeView.hpp:42
void draw(BackendRenderTarget &target, RenderStates states) const override
Draw the widget to a render target.
TGUI_NODISCARD TreeViewRenderer * getSharedRenderer() override
Returns the renderer, which gives access to functions that determine how the widget is displayed.
TGUI_NODISCARD ConstNode getNode(const std::vector< String > &hierarchy) const
Returns the node in the tree view at a given hierarchy.
void deselectItem()
Deselect the item if one was selected.
TGUI_NODISCARD Signal & getSignal(String signalName) override
Retrieves a signal based on its name.
bool leftMousePressed(Vector2f pos) override
Called by the parent when the left mouse button goes down on top of the widget.
bool addItem(const std::vector< String > &hierarchy, bool createParents=true)
Adds a new item to the tree view.
void updateTextSize() override
Called when the text size is changed (either by setTextSize or via the renderer)
static TGUI_NODISCARD TreeView::Ptr create()
Creates a new tree view widget.
void load(const std::unique_ptr< DataIO::Node > &node, const LoadingRenderersMap &renderers) override
Loads the widget from a tree of nodes.
void collapseAll()
Collapses all items.
void collapse(const std::vector< String > &hierarchy)
Collapses the given item.
bool changeItem(const std::vector< String > &hierarchy, const String &leafText)
Changes the text of a leaf item.
bool selectItem(const std::vector< String > &hierarchy)
Selects an item in the tree view.
TGUI_NODISCARD std::vector< String > getSelectedItem() const
Returns the selected item.
bool scrolled(float delta, Vector2f pos, bool touch) override
Called by the parent on scroll event (either from mouse wheel of from two finger scrolling on a touch...
TGUI_NODISCARD std::unique_ptr< DataIO::Node > save(SavingRenderersMap &renderers) const override
Saves the widget as a tree node in order to save it to a file.
TGUI_NODISCARD unsigned int getVerticalScrollbarValue() const
Returns the thumb position of the vertical scrollbar.
TGUI_NODISCARD unsigned int getHorizontalScrollbarValue() const
Returns the thumb position of the horizontal scrollbar.
TGUI_NODISCARD bool isMouseOnWidget(Vector2f pos) const override
Returns whether the mouse position (which is relative to the parent widget) lies on top of the widget...
bool removeItem(const std::vector< String > &hierarchy, bool removeParentsWhenEmpty=true)
Removes an item.
void setItemHeight(unsigned int itemHeight)
Changes the height of the items in the tree view.
void expandAll()
Expands all items.
bool canHandleKeyPress(const Event::KeyEvent &event) override
Called by the parent of the widget to check if keyPressed would process the event.
void setVerticalScrollbarValue(unsigned int value)
Changes the thumb position of the vertical scrollbar.
void expand(const std::vector< String > &hierarchy)
Expands the given item.
void removeAllItems()
Removes all items.
static TGUI_NODISCARD TreeView::Ptr copy(const TreeView::ConstPtr &treeView)
Makes a copy of another tree view.
TGUI_NODISCARD TreeViewRenderer * getRenderer() override
Returns the renderer, which gives access to functions that determine how the widget is displayed.
TGUI_NODISCARD unsigned int getItemHeight() const
Returns the height of the items in the tree view.
void setHorizontalScrollbarValue(unsigned int value)
Changes the thumb position of the horizontal scrollbar.
void rendererChanged(const String &property) override
Function called when one of the properties of the renderer is changed.
TGUI_NODISCARD std::vector< ConstNode > getNodes() const
Returns the nodes in the tree view.
TGUI_NODISCARD Widget::Ptr clone() const override
Makes a copy of the widget if you don't know its exact type.
void setSize(const Layout2d &size) override
Changes the size of the tree view.
The parent class for every widget.
Definition Widget.hpp:84
std::shared_ptr< Widget > Ptr
Shared widget pointer.
Definition Widget.hpp:87
Namespace that contains all TGUI functions and classes.
Definition AbsoluteOrRelativeValue.hpp:39
KeyPressed event parameters.
Definition Event.hpp:169
States used for drawing.
Definition RenderStates.hpp:39
Read-only node representation used by getNode and getNodes.
Definition TreeView.hpp:53
Internal representation of a node.
Definition TreeView.hpp:61