TGUI  1.1
Loading...
Searching...
No Matches
TreeView.hpp
1
2//
3// TGUI - Texus' Graphical User Interface
4// Copyright (C) 2012-2023 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;
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
166 void expand(const std::vector<String>& hierarchy);
167
168
172 void expandAll();
173
174
180 void collapse(const std::vector<String>& hierarchy);
181
182
187
188
196 bool selectItem(const std::vector<String>& hierarchy);
197
198
203
204
213 bool removeItem(const std::vector<String>& hierarchy, bool removeParentsWhenEmpty = true);
214
215
220
221
226 TGUI_NODISCARD std::vector<String> getSelectedItem() const;
227
228
233 TGUI_NODISCARD std::vector<ConstNode> getNodes() const;
234
235
240 void setItemHeight(unsigned int itemHeight);
241
242
247 TGUI_NODISCARD unsigned int getItemHeight() const;
248
249
255 void setVerticalScrollbarValue(unsigned int value);
256
257
263 TGUI_NODISCARD unsigned int getVerticalScrollbarValue() const;
264
265
271 void setHorizontalScrollbarValue(unsigned int value);
272
273
279 TGUI_NODISCARD unsigned int getHorizontalScrollbarValue() const;
280
281
287 TGUI_NODISCARD bool isMouseOnWidget(Vector2f pos) const override;
288
292 bool leftMousePressed(Vector2f pos) override;
293
297 void leftMouseReleased(Vector2f pos) override;
298
302 void rightMousePressed(Vector2f pos) override;
303
307 void mouseMoved(Vector2f pos) override;
308
312 bool scrolled(float delta, Vector2f pos, bool touch) override;
313
317 void mouseNoLongerOnWidget() override;
318
322 void leftMouseButtonNoLongerDown() override;
323
327 void keyPressed(const Event::KeyEvent& event) override;
328
338 bool canHandleKeyPress(const Event::KeyEvent& event) override;
339
343 void markNodesDirty();
344
345
353 void draw(BackendRenderTarget& target, RenderStates states) const override;
354
355
356
358 protected:
359
369 TGUI_NODISCARD Signal& getSignal(String signalName) override;
370
371
378 void rendererChanged(const String& property) override;
379
380
384 TGUI_NODISCARD std::unique_ptr<DataIO::Node> save(SavingRenderersMap& renderers) const override;
385
386
390 void load(const std::unique_ptr<DataIO::Node>& node, const LoadingRenderersMap& renderers) override;
391
392
396 void updateTextSize() override;
397
398
400 // Returns the size without the borders
402 TGUI_NODISCARD Vector2f getInnerSize() const;
403
404
406 // Updates the bounds of the icons
408 void updateIconBounds();
409
410
412 // This function is called every frame with the time passed since the last frame.
414 bool updateTime(Duration elapsedTime) override;
415
416
418 // Makes a copy of the widget
420 TGUI_NODISCARD Widget::Ptr clone() const override;
421
422
426 void updateTextColors(std::vector<std::shared_ptr<Node>>& nodes);
427
428
432 void createNode(std::vector<std::shared_ptr<Node>>& menus, Node* parent, const String& text);
433
434
438 TGUI_NODISCARD Node* findParentNode(const std::vector<String>& hierarchy, unsigned int parentIndex, std::vector<std::shared_ptr<Node>>& nodes, Node* parent, bool createParents);
439
440
442 // Expands or collapses one of the visible items
444 void toggleNodeInternal(std::size_t index);
445
446
448 // Expands or collapses a node
450 bool expandOrCollapse(const std::vector<String>& hierarchy, bool expand);
451
452
454 // Helper function to load the items from a text file
456 void loadItems(const std::unique_ptr<DataIO::Node>& node, std::vector<std::shared_ptr<Node>>& items, Node* parent);
457
458
460 // Rebuilds the list of visible items and positions the texts
462 unsigned int updateVisibleNodes(std::vector<std::shared_ptr<Node>>& nodes, Node* selectedNode, float textPadding, unsigned int pos);
463
464
466 // Updates the text colors of the selected and hovered items
468 void updateSelectedAndHoveringItemColors();
469
470
472 // Updates the text color of the hovered item
474 void updateHoveredItem(int item);
475
476
478 // Updates the text color of the selected item
480 void updateSelectedItem(int item);
481
482
484 public:
485
486 SignalItemHierarchy onItemSelect = {"ItemSelected"};
487 SignalItemHierarchy onDoubleClick = {"DoubleClicked"};
488 SignalItemHierarchy onExpand = {"Expanded"};
489 SignalItemHierarchy onCollapse = {"Collapsed"};
490 SignalItemHierarchy onRightClick = {"RightClicked"};
491
493 protected:
494
495 // This contains the nodes of the tree
496 std::vector<std::shared_ptr<Node>> m_nodes;
497 std::vector<std::shared_ptr<Node>> m_visibleNodes;
498
499 int m_selectedItem = -1;
500 int m_hoveredItem = -1;
501
502 unsigned int m_itemHeight = 0;
503 float m_maxRight = 0;
504
505 Vector2f m_iconBounds;
506
507 CopiedSharedPtr<ScrollbarChildWidget> m_verticalScrollbar;
508 CopiedSharedPtr<ScrollbarChildWidget> m_horizontalScrollbar;
509
510
511 bool m_possibleDoubleClick = false;
512 int m_doubleClickNodeIndex = -1;
513
514 Sprite m_spriteBackground;
515 Sprite m_spriteBranchExpanded;
516 Sprite m_spriteBranchCollapsed;
517 Sprite m_spriteLeaf;
518
519 // Cached renderer properties
520 Borders m_bordersCached;
521 Borders m_paddingCached;
522 Color m_borderColorCached;
523 Color m_backgroundColorCached;
524 Color m_textColorCached;
525 Color m_textColorHoverCached;
526 Color m_selectedTextColorCached;
527 Color m_selectedTextColorHoverCached;
528 Color m_selectedBackgroundColorCached;
529 Color m_selectedBackgroundColorHoverCached;
530 Color m_backgroundColorHoverCached;
531 TextStyles m_textStyleCached;
532
534 };
535
537}
538
540
541#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.
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 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 getNodes.
Definition TreeView.hpp:53
Internal representation of a node.
Definition TreeView.hpp:61