TGUI  1.0-alpha
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
128
133 void setSize(const Layout2d& size) override;
134 using Widget::setSize;
135
136
145 bool addItem(const std::vector<String>& hierarchy, bool createParents = true);
146
147
153 void expand(const std::vector<String>& hierarchy);
154
155
159 void expandAll();
160
161
167 void collapse(const std::vector<String>& hierarchy);
168
169
174
175
183 bool selectItem(const std::vector<String>& hierarchy);
184
185
190
191
200 bool removeItem(const std::vector<String>& hierarchy, bool removeParentsWhenEmpty = true);
201
202
207
208
213 std::vector<String> getSelectedItem() const;
214
215
220 std::vector<ConstNode> getNodes() const;
221
222
227 void setItemHeight(unsigned int itemHeight);
228
229
234 unsigned int getItemHeight() const;
235
236
242 void setVerticalScrollbarValue(unsigned int value);
243
244
250 unsigned int getVerticalScrollbarValue() const;
251
252
258 void setHorizontalScrollbarValue(unsigned int value);
259
260
266 unsigned int getHorizontalScrollbarValue() const;
267
268
274 bool isMouseOnWidget(Vector2f pos) const override;
275
279 void leftMousePressed(Vector2f pos) override;
280
284 void leftMouseReleased(Vector2f pos) override;
285
289 void rightMousePressed(Vector2f pos) override;
290
294 void mouseMoved(Vector2f pos) override;
295
299 bool mouseWheelScrolled(float delta, Vector2f pos) override;
300
304 void mouseNoLongerOnWidget() override;
305
309 void leftMouseButtonNoLongerDown() override;
310
314 void keyPressed(const Event::KeyEvent& event) override;
315
319 void markNodesDirty();
320
321
329 void draw(BackendRenderTarget& target, RenderStates states) const override;
330
331
332
334 protected:
335
345 Signal& getSignal(String signalName) override;
346
347
354 void rendererChanged(const String& property) override;
355
356
360 std::unique_ptr<DataIO::Node> save(SavingRenderersMap& renderers) const override;
361
362
366 void load(const std::unique_ptr<DataIO::Node>& node, const LoadingRenderersMap& renderers) override;
367
368
372 void updateTextSize() override;
373
374
376 // Returns the size without the borders
378 Vector2f getInnerSize() const;
379
380
382 // Updates the bounds of the icons
384 void updateIconBounds();
385
386
388 // This function is called every frame with the time passed since the last frame.
390 bool updateTime(Duration elapsedTime) override;
391
392
394 // Makes a copy of the widget
396 Widget::Ptr clone() const override;
397
398
402 void updateTextColors(std::vector<std::shared_ptr<Node>>& nodes);
403
404
408 void createNode(std::vector<std::shared_ptr<Node>>& menus, Node* parent, const String& text);
409
410
414 Node* findParentNode(const std::vector<String>& hierarchy, unsigned int parentIndex, std::vector<std::shared_ptr<Node>>& nodes, Node* parent, bool createParents);
415
416
418 // Expands or collapses one of the visible items
420 void toggleNodeInternal(std::size_t index);
421
422
424 // Expands or collapses a node
426 bool expandOrCollapse(const std::vector<String>& hierarchy, bool expand);
427
428
430 // Helper function to load the items from a text file
432 void loadItems(const std::unique_ptr<DataIO::Node>& node, std::vector<std::shared_ptr<Node>>& items, Node* parent);
433
434
436 // Rebuilds the list of visible items and positions the texts
438 unsigned int updateVisibleNodes(std::vector<std::shared_ptr<Node>>& nodes, Node* selectedNode, float textPadding, unsigned int pos);
439
440
442 // Updates the text colors of the selected and hovered items
444 void updateSelectedAndHoveringItemColors();
445
446
448 // Updates the text color of the hovered item
450 void updateHoveredItem(int item);
451
452
454 // Updates the text color of the selected item
456 void updateSelectedItem(int item);
457
458
460 public:
461
462 SignalItemHierarchy onItemSelect = {"ItemSelected"};
463 SignalItemHierarchy onDoubleClick = {"DoubleClicked"};
464 SignalItemHierarchy onExpand = {"Expanded"};
465 SignalItemHierarchy onCollapse = {"Collapsed"};
466 SignalItemHierarchy onRightClick = {"RightClicked"};
467
469 protected:
470
471 // This contains the nodes of the tree
472 std::vector<std::shared_ptr<Node>> m_nodes;
473 std::vector<std::shared_ptr<Node>> m_visibleNodes;
474
475 int m_selectedItem = -1;
476 int m_hoveredItem = -1;
477
478 unsigned int m_itemHeight = 0;
479 float m_maxRight = 0;
480
481 Vector2f m_iconBounds;
482
483 CopiedSharedPtr<ScrollbarChildWidget> m_verticalScrollbar;
484 CopiedSharedPtr<ScrollbarChildWidget> m_horizontalScrollbar;
485
486
487 bool m_possibleDoubleClick = false;
488 int m_doubleClickNodeIndex = -1;
489
490 Sprite m_spriteBackground;
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