TGUI  0.10-beta
TreeView.hpp
1
2//
3// TGUI - Texus' Graphical User Interface
4// Copyright (C) 2012-2022 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
36namespace tgui
37{
41 class TGUI_API TreeView : public Widget
42 {
43 public:
44
45 typedef std::shared_ptr<TreeView> Ptr;
46 typedef std::shared_ptr<const TreeView> ConstPtr;
47
49 struct ConstNode
50 {
51 bool expanded;
52 String text;
53 std::vector<ConstNode> nodes;
54 };
55
57 struct Node
58 {
59 Text text;
60 unsigned depth = 0;
61 bool expanded = true;
62 Node* parent = nullptr;
63 std::vector<std::shared_ptr<Node>> nodes;
64 };
65
66
74 TreeView(const char* typeName = "TreeView", bool initRenderer = true);
75
76
78 // Copy constructor
80 TreeView(const TreeView&);
81
83 // Move constructor
85 TreeView(TreeView&&) = default;
86
88 // Overload of copy assignment operator
90 TreeView& operator=(const TreeView&);
91
93 // Overload of move assignment operator
95 TreeView& operator=(TreeView&&) = default;
96
97
102 static TreeView::Ptr create();
103
104
110 static TreeView::Ptr copy(TreeView::ConstPtr treeView);
111
112
118 const TreeViewRenderer* getSharedRenderer() const;
119
120
127 const TreeViewRenderer* getRenderer() const;
128
129
134 void setSize(const Layout2d& size) override;
135 using Widget::setSize;
136
137
146 bool addItem(const std::vector<String>& hierarchy, bool createParents = true);
147
148
154 void expand(const std::vector<String>& hierarchy);
155
156
160 void expandAll();
161
162
168 void collapse(const std::vector<String>& hierarchy);
169
170
175
176
184 bool selectItem(const std::vector<String>& hierarchy);
185
186
191
192
201 bool removeItem(const std::vector<String>& hierarchy, bool removeParentsWhenEmpty = true);
202
203
208
209
214 std::vector<String> getSelectedItem() const;
215
216
221 std::vector<ConstNode> getNodes() const;
222
223
228 void setItemHeight(unsigned int itemHeight);
229
230
235 unsigned int getItemHeight() const;
236
237
243 void setVerticalScrollbarValue(unsigned int value);
244
245
251 unsigned int getVerticalScrollbarValue() const;
252
253
259 void setHorizontalScrollbarValue(unsigned int value);
260
261
267 unsigned int getHorizontalScrollbarValue() const;
268
269
275 bool isMouseOnWidget(Vector2f pos) const override;
276
280 void leftMousePressed(Vector2f pos) override;
281
285 void leftMouseReleased(Vector2f pos) override;
286
290 void rightMousePressed(Vector2f pos) override;
291
295 void mouseMoved(Vector2f pos) override;
296
300 bool mouseWheelScrolled(float delta, Vector2f pos) override;
301
305 void mouseNoLongerOnWidget() override;
306
310 void leftMouseButtonNoLongerDown() override;
311
315 void keyPressed(const Event::KeyEvent& event) override;
316
320 void markNodesDirty();
321
322
330 void draw(BackendRenderTarget& target, RenderStates states) const override;
331
332
333
335 protected:
336
346 Signal& getSignal(String signalName) override;
347
348
355 void rendererChanged(const String& property) override;
356
357
361 std::unique_ptr<DataIO::Node> save(SavingRenderersMap& renderers) const override;
362
363
367 void load(const std::unique_ptr<DataIO::Node>& node, const LoadingRenderersMap& renderers) override;
368
369
373 void updateTextSize() override;
374
375
377 // Returns the size without the borders
379 Vector2f getInnerSize() const;
380
381
383 // Updates the bounds of the icons
385 void updateIconBounds();
386
387
389 // This function is called every frame with the time passed since the last frame.
391 bool updateTime(Duration elapsedTime) override;
392
393
395 // Makes a copy of the widget
397 Widget::Ptr clone() const override;
398
399
403 void updateTextColors(std::vector<std::shared_ptr<Node>>& nodes);
404
405
409 void createNode(std::vector<std::shared_ptr<Node>>& menus, Node* parent, const String& text);
410
411
415 Node* findParentNode(const std::vector<String>& hierarchy, unsigned int parentIndex, std::vector<std::shared_ptr<Node>>& nodes, Node* parent, bool createParents);
416
417
419 // Expands or collapses one of the visible items
421 void toggleNodeInternal(std::size_t index);
422
423
425 // Expands or collapses a node
427 bool expandOrCollapse(const std::vector<String>& hierarchy, bool expand);
428
429
431 // Helper function to load the items from a text file
433 void loadItems(const std::unique_ptr<DataIO::Node>& node, std::vector<std::shared_ptr<Node>>& items, Node* parent);
434
435
437 // Rebuilds the list of visible items and positions the texts
439 unsigned int updateVisibleNodes(std::vector<std::shared_ptr<Node>>& nodes, Node* selectedNode, float textPadding, unsigned int pos);
440
441
443 // Updates the text colors of the selected and hovered items
445 void updateSelectedAndHoveringItemColors();
446
447
449 // Updates the text color of the hovered item
451 void updateHoveredItem(int item);
452
453
455 // Updates the text color of the selected item
457 void updateSelectedItem(int item);
458
459
461 public:
462
463 SignalItemHierarchy onItemSelect = {"ItemSelected"};
464 SignalItemHierarchy onDoubleClick = {"DoubleClicked"};
465 SignalItemHierarchy onExpand = {"Expanded"};
466 SignalItemHierarchy onCollapse = {"Collapsed"};
467 SignalItemHierarchy onRightClick = {"RightClicked"};
468
470 protected:
471
472 // This contains the nodes of the tree
473 std::vector<std::shared_ptr<Node>> m_nodes;
474 std::vector<std::shared_ptr<Node>> m_visibleNodes;
475
476 int m_selectedItem = -1;
477 int m_hoveredItem = -1;
478
479 unsigned int m_itemHeight = 0;
480 float m_maxRight = 0;
481
482 Vector2f m_iconBounds;
483
484 CopiedSharedPtr<ScrollbarChildWidget> m_verticalScrollbar;
485 CopiedSharedPtr<ScrollbarChildWidget> m_horizontalScrollbar;
486
487
488 bool m_possibleDoubleClick = false;
489 int m_doubleClickNodeIndex = -1;
490
491 Sprite m_spriteBranchExpanded;
492 Sprite m_spriteBranchCollapsed;
493 Sprite m_spriteLeaf;
494
495 // Cached renderer properties
496 Borders m_bordersCached;
497 Borders m_paddingCached;
498 Color m_borderColorCached;
499 Color m_backgroundColorCached;
500 Color m_textColorCached;
501 Color m_textColorHoverCached;
502 Color m_selectedTextColorCached;
503 Color m_selectedTextColorHoverCached;
504 Color m_selectedBackgroundColorCached;
505 Color m_selectedBackgroundColorHoverCached;
506 Color m_backgroundColorHoverCached;
507 TextStyles m_textStyleCached;
508
510 };
511
513}
514
516
517#endif // TGUI_TREE_VIEW_HPP
Base class for render targets.
Definition: BackendRenderTarget.hpp:48
Wrapper for colors.
Definition: Color.hpp:63
Definition: CopiedSharedPtr.hpp:40
Wrapper for durations.
Definition: Duration.hpp:52
Class to store the position or size of a widget.
Definition: Layout.hpp:284
Definition: Outline.hpp:39
Signal to which the user can subscribe to get callbacks from.
Definition: Signal.hpp:859
Signal to which the user can subscribe to get callbacks from.
Definition: Signal.hpp:58
Definition: Sprite.hpp:45
Wrapper class to store strings.
Definition: String.hpp:79
Wrapper for text styles.
Definition: TextStyle.hpp:58
Definition: Text.hpp:48
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.
Signal & getSignal(String signalName) override
Retrieves a signal based on its name.
void deselectItem()
Deselect the item if one was selected.
Widget::Ptr clone() const override
Makes a copy of the widget if you don't know its exact type.
unsigned int getHorizontalScrollbarValue() const
Returns the thumb position of the horizontal scrollbar.
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.
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)
unsigned int getItemHeight() const
Returns the height of the items in the tree view.
void load(const std::unique_ptr< DataIO::Node > &node, const LoadingRenderersMap &renderers) override
Loads the widget from a tree of nodes.
std::vector< ConstNode > getNodes() const
Returns the nodes in the tree view.
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.
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.
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.
TreeViewRenderer * getRenderer()
Returns the renderer, which gives access to functions that determine how the widget is displayed.
bool isMouseOnWidget(Vector2f pos) const override
Returns whether the mouse position (which is relative to the parent widget) lies on top of the widget...
std::vector< String > getSelectedItem() const
Returns the selected item.
unsigned int getVerticalScrollbarValue() const
Returns the thumb position of the vertical scrollbar.
static TreeView::Ptr create()
Creates a new tree view widget.
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.
static TreeView::Ptr copy(TreeView::ConstPtr treeView)
Makes a copy of another tree view.
TreeViewRenderer * getSharedRenderer()
Returns the renderer, which gives access to functions that determine how the widget is displayed.
void setSize(const Layout2d &size) override
Changes the size of the tree view.
The parent class for every widget.
Definition: Widget.hpp:70
std::shared_ptr< Widget > Ptr
Shared widget pointer.
Definition: Widget.hpp:73
virtual void setSize(const Layout2d &size)
Changes the size of the widget.
std::shared_ptr< const Widget > ConstPtr
Shared constant widget pointer.
Definition: Widget.hpp:74
Namespace that contains all TGUI functions and classes.
Definition: AbsoluteOrRelativeValue.hpp:36
KeyPressed event parameters.
Definition: Event.hpp:167
States used for drawing.
Definition: RenderStates.hpp:39
Read-only node representation used by getNodes.
Definition: TreeView.hpp:50
Internal representation of a node.
Definition: TreeView.hpp:58