TGUI  0.9-dev
TreeView.hpp
1 //
3 // TGUI - Texus' Graphical User Interface
4 // Copyright (C) 2012-2020 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 
36 namespace 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;
63  std::vector<std::shared_ptr<Node>> nodes;
64  };
65 
66 
68  // Default constructor
70  TreeView();
71 
73  // Copy constructor
75  TreeView(const TreeView&);
76 
78  // Move constructor
80  TreeView(TreeView&&) = default;
81 
83  // Overload of copy assignment operator
85  TreeView& operator=(const TreeView&);
86 
88  // Overload of move assignment operator
90  TreeView& operator=(TreeView&&) = default;
91 
92 
97  static TreeView::Ptr create();
98 
99 
105  static TreeView::Ptr copy(TreeView::ConstPtr treeView);
106 
107 
112  TreeViewRenderer* getSharedRenderer();
113  const TreeViewRenderer* getSharedRenderer() const;
114 
115 
121  TreeViewRenderer* getRenderer();
122  const TreeViewRenderer* getRenderer() const;
123 
124 
129  void setSize(const Layout2d& size) override;
130  using Widget::setSize;
131 
132 
141  bool addItem(const std::vector<String>& hierarchy, bool createParents = true);
142 
143 
149  void expand(const std::vector<String>& hierarchy);
150 
151 
155  void expandAll();
156 
157 
163  void collapse(const std::vector<String>& hierarchy);
164 
165 
169  void collapseAll();
170 
171 
179  bool selectItem(const std::vector<String>& hierarchy);
180 
181 
185  void deselectItem();
186 
187 
196  bool removeItem(const std::vector<String>& hierarchy, bool removeParentsWhenEmpty = true);
197 
198 
202  void removeAllItems();
203 
204 
209  std::vector<String> getSelectedItem() const;
210 
211 
216  std::vector<ConstNode> getNodes() const;
217 
218 
223  void setItemHeight(unsigned int itemHeight);
224 
225 
230  unsigned int getItemHeight() const;
231 
232 
243  void setTextSize(unsigned int textSize) override;
244 
245 
251  void setVerticalScrollbarValue(unsigned int value);
252 
253 
259  unsigned int getVerticalScrollbarValue() const;
260 
261 
267  void setHorizontalScrollbarValue(unsigned int value);
268 
269 
275  unsigned int getHorizontalScrollbarValue() const;
276 
277 
283  bool mouseOnWidget(Vector2f pos) const override;
284 
288  void leftMousePressed(Vector2f pos) override;
289 
293  void leftMouseReleased(Vector2f pos) override;
294 
298  void rightMousePressed(Vector2f pos) override;
299 
303  void mouseMoved(Vector2f pos) override;
304 
308  bool mouseWheelScrolled(float delta, Vector2f pos) override;
309 
313  void mouseNoLongerOnWidget() override;
314 
318  void leftMouseButtonNoLongerDown() override;
319 
323  void markNodesDirty();
324 
325 
333  void draw(sf::RenderTarget& target, sf::RenderStates states) const override;
334 
335 
336 
338  protected:
339 
349  Signal& getSignal(String signalName) override;
350 
351 
358  void rendererChanged(const String& property) override;
359 
360 
364  std::unique_ptr<DataIO::Node> save(SavingRenderersMap& renderers) const override;
365 
366 
370  void load(const std::unique_ptr<DataIO::Node>& node, const LoadingRenderersMap& renderers) override;
371 
372 
374  // Returns the size without the borders
376  Vector2f getInnerSize() const;
377 
378 
380  // Updates the bounds of the icons
382  void updateIconBounds();
383 
384 
386  // This function is called every frame with the time passed since the last frame.
388  void update(Duration elapsedTime) override;
389 
390 
392  // Makes a copy of the widget
394  Widget::Ptr clone() const override
395  {
396  return std::make_shared<TreeView>(*this);
397  }
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  // The size must be stored
480  unsigned int m_itemHeight = 0;
481  unsigned int m_requestedTextSize = 0;
482  float m_maxRight = 0;
483 
484  Vector2f m_iconBounds;
485 
486  CopiedSharedPtr<ScrollbarChildWidget> m_verticalScrollbar;
487  CopiedSharedPtr<ScrollbarChildWidget> m_horizontalScrollbar;
488 
489 
490  bool m_possibleDoubleClick = false;
491  int m_doubleClickNodeIndex = -1;
492 
493  Sprite m_spriteBranchExpanded;
494  Sprite m_spriteBranchCollapsed;
495  Sprite m_spriteLeaf;
496 
497  // Cached renderer properties
498  Borders m_bordersCached;
499  Borders m_paddingCached;
500  Color m_borderColorCached;
501  Color m_backgroundColorCached;
502  Color m_textColorCached;
503  Color m_textColorHoverCached;
504  Color m_selectedTextColorCached;
505  Color m_selectedTextColorHoverCached;
506  Color m_selectedBackgroundColorCached;
507  Color m_selectedBackgroundColorHoverCached;
508  Color m_backgroundColorHoverCached;
509  TextStyle m_textStyleCached;
510 
512  };
513 
515 }
516 
518 
519 #endif // TGUI_TREE_VIEW_HPP
Definition: CopiedSharedPtr.hpp:39
Signal to which the user can subscribe to get callbacks from.
Definition: Signal.hpp:216
Tree view widget.
Definition: TreeView.hpp:41
std::shared_ptr< Widget > Ptr
Shared widget pointer.
Definition: Widget.hpp:72
Namespace that contains all TGUI functions and classes.
Definition: AbsoluteOrRelativeValue.hpp:35
Definition: Text.hpp:42
Signal to which the user can subscribe to get callbacks from.
Definition: Signal.hpp:934
Class to store the position or size of a widget.
Definition: Layout.hpp:258
Wrapper for colors.
Definition: Color.hpp:47
std::shared_ptr< const Widget > ConstPtr
Shared constant widget pointer.
Definition: Widget.hpp:73
Wrapper for durations.
Definition: Duration.hpp:48
Definition: Sprite.hpp:45
Wrapper class to store strings.
Definition: String.hpp:70
Read-only node representation used by getNodes.
Definition: TreeView.hpp:49
Definition: TreeViewRenderer.hpp:36
Definition: Outline.hpp:38
The parent class for every widget.
Definition: Widget.hpp:68
virtual void setSize(const Layout2d &size)
Changes the size of the widget.
Widget::Ptr clone() const override
Makes a copy of the widget if you don't know its exact type.
Definition: TreeView.hpp:394
Internal representation of a node.
Definition: TreeView.hpp:57
Wrapper for text styles.
Definition: TextStyle.hpp:44