TGUI  1.0-beta
Loading...
Searching...
No Matches
ListView.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_LIST_VIEW_HPP
27#define TGUI_LIST_VIEW_HPP
28
29
30#include <TGUI/CopiedSharedPtr.hpp>
31#include <TGUI/Widgets/Scrollbar.hpp>
32#include <TGUI/Renderers/ListViewRenderer.hpp>
33#include <TGUI/Text.hpp>
34#include <set>
35
37
38namespace tgui
39{
45 class TGUI_API ListView : public Widget
46 {
47 public:
48
49 using Ptr = std::shared_ptr<ListView>;
50 using ConstPtr = std::shared_ptr<const ListView>;
51
52 static constexpr const char StaticWidgetType[] = "ListView";
53
54
58 enum class ColumnAlignment
59 {
60 Left,
61 Center,
62 Right
63 };
64
65 struct Item
66 {
67 std::vector<Text> texts;
68 Any data;
69 Sprite icon;
70 };
71
72 struct Column
73 {
74 float width = 0;
75 float designWidth = 0;
76 float maxItemWidth = 0;
77 Text text;
78 ColumnAlignment alignment = ColumnAlignment::Left;
79 };
80
81
89 ListView(const char* typeName = StaticWidgetType, bool initRenderer = true);
90
91
97
98
106 static ListView::Ptr copy(const ListView::ConstPtr& listView);
107
108
114 const ListViewRenderer* getSharedRenderer() const;
115
122
123
129 void setSize(const Layout2d& size) override;
130 using Widget::setSize;
131
132
142 std::size_t addColumn(const String& text, float width = 0, ColumnAlignment alignment = ColumnAlignment::Left);
143
144
151 void setColumnText(std::size_t index, const String& text);
152
153
161 String getColumnText(std::size_t index) const;
162
163
170 void setColumnWidth(std::size_t index, float width);
171
172
180 float getColumnWidth(std::size_t index) const;
181
182
189 void setColumnAlignment(std::size_t columnIndex, ColumnAlignment alignment);
190
191
199 ColumnAlignment getColumnAlignment(std::size_t columnIndex) const;
200
201
206
207
213 std::size_t getColumnCount() const;
214
215
221 void setHeaderHeight(float height);
222
223
229 float getHeaderHeight() const;
230
231
238
239
245 void setHeaderVisible(bool showHeader);
246
247
253 bool getHeaderVisible() const;
254
255
263 std::size_t addItem(const String& text);
264
265
273 std::size_t addItem(const std::vector<String>& item);
274
275
281 void addMultipleItems(const std::vector<std::vector<String>>& items);
282
289 void insertItem(std::size_t index, const String& text);
290
297 void insertItem(std::size_t index, const std::vector<String>& item);
298
305 void insertMultipleItems(std::size_t index, const std::vector<std::vector<String>>& items);
306
315 bool changeItem(std::size_t index, const std::vector<String>& item);
316
317
327 bool changeSubItem(std::size_t index, std::size_t column, const String& item);
328
329
337 bool removeItem(std::size_t index);
338
339
344
345
351 void setSelectedItem(std::size_t index);
352
353
359 void setSelectedItems(const std::set<std::size_t>& indices);
360
361
366
367
374
375
381 std::set<std::size_t> getSelectedItemIndices() const;
382
383
389 void setMultiSelect(bool multiSelect);
390
391
397 bool getMultiSelect() const;
398
399
412 void setItemData(std::size_t index, Any data);
413
414
421 template <typename T>
422 T getItemData(std::size_t index) const
423 {
424 if (index < m_items.size())
425 return AnyCast<T>(m_items[index].data);
426 else
427 throw std::bad_cast();
428 }
429
430
437 void setItemIcon(std::size_t index, const Texture& texture);
438
439
447 Texture getItemIcon(std::size_t index) const;
448
449
455 std::size_t getItemCount() const;
456
457
465 String getItem(std::size_t index) const;
466
467
477 std::vector<String> getItemRow(std::size_t index) const;
478
479
488 String getItemCell(std::size_t rowIndex, std::size_t columnIndex) const;
489
490
496 std::vector<String> getItems() const;
497
498
504 std::vector<std::vector<String>> getItemRows() const;
505
506
513 void sort(std::size_t index, const std::function<bool(const String&, const String&)>& cmp);
514
515
521 void setItemHeight(unsigned int itemHeight);
522
523
529 unsigned int getItemHeight() const;
530
531
539 void setHeaderTextSize(unsigned int textSize);
540
541
547 unsigned int getHeaderTextSize() const;
548
549
555 void setSeparatorWidth(unsigned int width);
556
557
563 unsigned int getSeparatorWidth() const;
564
565
571 void setHeaderSeparatorHeight(unsigned int height);
572
573
579 unsigned int getHeaderSeparatorHeight() const;
580
581
587 void setGridLinesWidth(unsigned int width);
588
589
595 unsigned int getGridLinesWidth() const;
596
597
605 void setAutoScroll(bool autoScroll);
606
607
613 bool getAutoScroll() const;
614
615
623 void setShowVerticalGridLines(bool showGridLines);
624
625
632
633
641 void setShowHorizontalGridLines(bool showGridLines);
642
643
650
651
657 void setExpandLastColumn(bool expand);
658
659
666
667
673
674
680
681
687
688
694
695
701 void setVerticalScrollbarValue(unsigned int value);
702
703
709 unsigned int getVerticalScrollbarValue() const;
710
711
717 void setHorizontalScrollbarValue(unsigned int value);
718
719
725 unsigned int getHorizontalScrollbarValue() const;
726
727
737
738
747
748
756 void setResizableColumns(bool resizable);
757
758
767
768
773 bool isMouseOnWidget(Vector2f pos) const override;
774
778 void leftMousePressed(Vector2f pos) override;
779
783 void leftMouseReleased(Vector2f pos) override;
784
788 void rightMousePressed(Vector2f pos) override;
789
793 void mouseMoved(Vector2f pos) override;
794
798 bool mouseWheelScrolled(float delta, Vector2f pos) override;
799
803 void mouseNoLongerOnWidget() override;
804
808 void leftMouseButtonNoLongerDown() override;
809
813 void keyPressed(const Event::KeyEvent& event) override;
814
815
822 void draw(BackendRenderTarget& target, RenderStates states) const override;
823
824
826 protected:
827
837 Signal& getSignal(String signalName) override;
838
839
845 void rendererChanged(const String& property) override;
846
847
851 std::unique_ptr<DataIO::Node> save(SavingRenderersMap& renderers) const override;
852
853
857 void load(const std::unique_ptr<DataIO::Node>& node, const LoadingRenderersMap& renderers) override;
858
859
863 void mouseEnteredWidget() override;
864
865
869 void mouseLeftWidget() override;
870
871
875 void updateTextSize() override;
876
877
879 // Returns the size without the borders
881 Vector2f getInnerSize() const;
882
883
885 // Create a Text object for an item from the given caption, using the preset color, font, text size and opacity
887 Text createText(const String& caption);
888
889
891 // Create a Text object for a header text from the given caption, using the preset color, font, text size and opacity
893 Text createHeaderText(const String& caption);
894
895
897 // Changes the color of all Text objects in an item
899 virtual void setItemColor(std::size_t index, const Color& color);
900
901
903 // Calculate the width of the column based on its caption when no column width was provided
905 float calculateAutoColumnWidth(const Text& text);
906
907
909 // Update the colors of the selected and hovered items
911 void updateSelectedAndhoveredItemColors();
912
913
915 // Update the color of all the items
917 void updateItemColors();
918
919
921 // Changes the color of all header texts
923 void updateHeaderTextsColor();
924
925
927 // Update on which item the mouse is standing
929 void updateHoveredItem(int item);
930
931
933 // Update which item is selected
935 void updateSelectedItem(int item);
936
937
939 // Selects multiple items when multi-select is on and the user selects an item while the shift key is held down
941 void selectRangeFromEvent(std::size_t item);
942
943
945 // Update the maximum item width of the last column by recalculating all items' widths.
946 // Returns whether the max item width was changed.
948 bool updateLastColumnMaxItemWidth();
949
950
952 // Update the maximum item width of the last column based on the addition of an Item.
953 // Returns true if the maximum item width was changed.
955 bool updateLastColumnMaxItemWidthWithNewItem(const Item& item);
956
957
959 // Update the maximum item width of the last column based on the modification of an Item.
960 // Returns true if the maximum item width was changed.
962 bool updateLastColumnMaxItemWidthWithModifiedItem(const Item& modifiedItem, float oldDesiredWidthInLastColumn);
963
964
966 // Add item to selected set
968 void addSelectedItem(int item);
969
970
972 // Remove item from selected set
974 void removeSelectedItem(std::size_t item);
975
976
978 // Update on which item the mouse is standing, given the current mouse position
980 void updateHoveredItemByMousePos(Vector2f mousePos);
981
982
984 // Returns either the configured separator width or the width of vertical grid lines, whichever is larger.
986 unsigned int getTotalSeparatorWidth() const;
987
988
990 // Returns the total width an Item takes up at some column, assuming it will not be cut off by the column.
992 float getItemTotalWidth(const Item& item, std::size_t columnIndex) const;
993
994
996 // Found out which column is located below the mouse. The mouseLeft is relative to the widget position.
997 // This function should only be called after checking that the mouse is positioned on top of the header.
999 int getColumnIndexBelowMouse(float mouseLeft);
1000
1001
1003 // Returns whether the mouse is standing between two columns.
1004 // If true then columnIndex is set to the index of border below the mouse (1 is the border between first two columns).
1005 // If true then pixelOffset is set to the distance between the center of the border and the mouse position.
1006 // If false then columnIndex and pixelOffset remain unchanged.
1008 bool findBorderBelowMouse(Vector2f pos, std::size_t& columnIndex, float& pixelOffset) const;
1009
1010
1012 // Recalculate the size and viewport size of the scrollbars
1014 void updateScrollbars();
1015
1017 // Recalculate the maximum value for the vertical scrollbar
1019 void updateVerticalScrollbarMaximum();
1020
1022 // Recalculate the maximum value for the horizontal scrollbar
1024 void updateHorizontalScrollbarMaximum();
1025
1026
1028 // Draw the header text for a single column
1030 void drawHeaderText(BackendRenderTarget& target, RenderStates states, float columnWidth, float headerHeight, std::size_t column) const;
1031
1032
1034 // Draw the texts in a single column
1036 void drawColumn(BackendRenderTarget& target, RenderStates states, std::size_t firstItem, std::size_t lastItem, std::size_t column, float columnWidth) const;
1037
1038
1040 // This function is called every frame with the time passed since the last frame.
1042 bool updateTime(Duration elapsedTime) override;
1043
1044
1046 // Makes a copy of the widget
1048 Widget::Ptr clone() const override;
1049
1050
1052 public:
1053
1059 SignalInt onItemSelect = {"ItemSelected"};
1060
1061 SignalInt onDoubleClick = {"DoubleClicked"};
1062 SignalInt onRightClick = {"RightClicked"};
1063 SignalInt onHeaderClick = {"HeaderClicked"};
1064
1065
1067 protected:
1068
1069 std::vector<Column> m_columns;
1070 std::vector<Item> m_items;
1071 std::set<std::size_t> m_selectedItems;
1072
1073 int m_hoveredItem = -1;
1074 int m_firstSelectedItemIndex = -1;
1075 int m_focusedItemIndex = -1;
1076
1077 float m_requestedHeaderHeight = 0;
1078 unsigned int m_itemHeight = 0;
1079 unsigned int m_headerTextSize = 0;
1080 unsigned int m_headerSeparatorHeight = 0;
1081 unsigned int m_separatorWidth = 1;
1082 unsigned int m_gridLinesWidth = 1;
1083 unsigned int m_iconCount = 0;
1084 float m_maxIconWidth = 0;
1085 float m_maxItemWidth = 0; // If there are no columns, this is the maximum width from all items
1086 bool m_headerVisible = true;
1087 bool m_showHorizontalGridLines = false;
1088 bool m_showVerticalGridLines = true;
1089 bool m_expandLastColumn = false;
1090 bool m_multiSelect = false;
1091 bool m_resizableColumns = false;
1092 Vector2f m_fixedIconSize;
1093 Cursor::Type m_currentListViewMouseCursor = Cursor::Type::Arrow;
1094 std::size_t m_resizingColumn = 0;
1095 float m_resizingColumnPixelOffset = 0;
1096
1097 CopiedSharedPtr<ScrollbarChildWidget> m_horizontalScrollbar;
1098 CopiedSharedPtr<ScrollbarChildWidget> m_verticalScrollbar;
1099 Scrollbar::Policy m_verticalScrollbarPolicy = Scrollbar::Policy::Automatic;
1100 Scrollbar::Policy m_horizontalScrollbarPolicy = Scrollbar::Policy::Automatic;
1101
1102 int m_mouseOnHeaderIndex = -1; // If the left mouse is down, this contains the index of the column if the mouse went down on the header
1103 int m_possibleDoubleClick = false; // Will be set to true after the first click, but gets reset to false when the second click does not occur soon after
1104 bool m_autoScroll = true; // Should the list view scroll to the bottom when a new item is added?
1105
1106 Sprite m_spriteHeaderBackground;
1107 Sprite m_spriteBackground;
1108
1109 // Cached renderer properties
1110 Borders m_bordersCached;
1111 Borders m_paddingCached;
1112 Color m_borderColorCached;
1113 Color m_separatorColorCached;
1114 Color m_gridLinesColorCached;
1115 Color m_headerTextColorCached;
1116 Color m_headerBackgroundColorCached;
1117 Color m_backgroundColorCached;
1118 Color m_backgroundColorHoverCached;
1119 Color m_selectedBackgroundColorCached;
1120 Color m_selectedBackgroundColorHoverCached;
1121 Color m_textColorCached;
1122 Color m_textColorHoverCached;
1123 Color m_selectedTextColorCached;
1124 Color m_selectedTextColorHoverCached;
1125
1127 };
1128
1130}
1131
1133
1134#endif // TGUI_LIST_VIEW_HPP
Base class for render targets.
Definition: BackendRenderTarget.hpp:48
Wrapper for colors.
Definition: Color.hpp:63
Definition: CopiedSharedPtr.hpp:40
Type
List of available cursors.
Definition: Cursor.hpp:48
Wrapper for durations.
Definition: Duration.hpp:52
Class to store the position or size of a widget.
Definition: Layout.hpp:284
Definition: ListViewRenderer.hpp:37
List view widget.
Definition: ListView.hpp:46
Signal & getSignal(String signalName) override
Retrieves a signal based on its name.
void updateTextSize() override
Called when the text size is changed (either by setTextSize or via the renderer)
void setShowVerticalGridLines(bool showGridLines)
Changes whether lines are drawn between columns.
bool isMouseOnWidget(Vector2f pos) const override
Returns whether the mouse position (which is relative to the parent widget) lies on top of the widget...
Scrollbar::Policy getVerticalScrollbarPolicy() const
Returns when the vertical scrollbar should be displayed.
void setSelectedItems(const std::set< std::size_t > &indices)
Selects items in the list view.
bool getShowHorizontalGridLines() const
Returns whether lines are drawn between items.
String getColumnText(std::size_t index) const
Returns the text of a column.
void setHeaderTextSize(unsigned int textSize)
Changes the text size of the header caption.
bool changeItem(std::size_t index, const std::vector< String > &item)
Changes an item with values for multiple columns to the list.
T getItemData(std::size_t index) const
Returns user data stored in the item.
Definition: ListView.hpp:422
std::size_t addColumn(const String &text, float width=0, ColumnAlignment alignment=ColumnAlignment::Left)
Adds a column.
unsigned int getVerticalScrollbarValue() const
Returns the thumb position of the vertical scrollbar.
void setHorizontalScrollbarPolicy(Scrollbar::Policy policy)
Changes when the horizontal scrollbar should be displayed.
void removeAllItems()
Removes all items from the list.
void setColumnAlignment(std::size_t columnIndex, ColumnAlignment alignment)
Changes the text alignment within a column.
ColumnAlignment getColumnAlignment(std::size_t columnIndex) const
Returns the current text alignment within a column.
void setColumnWidth(std::size_t index, float width)
Changes the width of a column.
String getItem(std::size_t index) const
Retrieves an item in the list.
unsigned int getSeparatorWidth() const
Returns the width of the column separator.
void setSize(const Layout2d &size) override
Changes the size of the list view.
void setHeaderVisible(bool showHeader)
Changes whether the header is shown.
void insertItem(std::size_t index, const String &text)
Inserts an item into the list.
std::vector< String > getItemRow(std::size_t index) const
Retrieves the values of all columns for an item in the list.
void setResizableColumns(bool resizable)
Changes whether the user can resize the columns by dragging the border between columns.
void setColumnText(std::size_t index, const String &text)
Changes the text of a column.
std::shared_ptr< ListView > Ptr
Shared widget pointer.
Definition: ListView.hpp:49
unsigned int getHorizontalScrollbarValue() const
Returns the thumb position of the horizontal scrollbar.
static ListView::Ptr copy(const ListView::ConstPtr &listView)
Makes a copy of another list view.
String getItemCell(std::size_t rowIndex, std::size_t columnIndex) const
Retrieves the value for a cell in the list.
void setVerticalScrollbarValue(unsigned int value)
Changes the thumb position of the vertical scrollbar.
bool getExpandLastColumn() const
Returns whether the last column is expanded to fill the list view (if all columns fit inside the list...
float getHeaderHeight() const
Returns the height of the header row.
std::size_t getColumnCount() const
Returns the amount of columns in the list view.
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.
unsigned int getGridLinesWidth() const
Returns the width of the grid lines.
void sort(std::size_t index, const std::function< bool(const String &, const String &)> &cmp)
Sort items.
Vector2f getFixedIconSize() const
Returns to which size all icons should be scaled.
void setHorizontalScrollbarValue(unsigned int value)
Changes the thumb position of the horizontal scrollbar.
void insertMultipleItems(std::size_t index, const std::vector< std::vector< String > > &items)
Inserts multiple items into the list.
bool getHeaderVisible() const
Returns whether the header is shown.
bool changeSubItem(std::size_t index, std::size_t column, const String &item)
Changes the caption of a single value in the item.
int getSelectedItemIndex() const
Gets the index of the selected item.
std::size_t addItem(const String &text)
Adds an item to the list.
unsigned int getItemHeight() const
Returns the height of the items in the list view.
void insertItem(std::size_t index, const std::vector< String > &item)
Inserts an item into the list.
void setItemIcon(std::size_t index, const Texture &texture)
Sets a small icon in front of the item.
float getColumnWidth(std::size_t index) const
Returns the width of a column.
bool getResizableColumns() const
Returns whether the user can resize the columns by dragging the border between columns.
void setVerticalScrollbarPolicy(Scrollbar::Policy policy)
Changes when the vertical scrollbar should be displayed.
void setFixedIconSize(Vector2f iconSize)
Sets a size to which all icons should be scaled.
ColumnAlignment
The text alignment for all texts within a column.
Definition: ListView.hpp:59
void mouseEnteredWidget() override
This function is called when the mouse enters the widget.
static ListView::Ptr create()
Creates a new list view widget.
std::size_t getItemCount() const
Returns the amount of items in the list view.
void load(const std::unique_ptr< DataIO::Node > &node, const LoadingRenderersMap &renderers) override
Loads the widget from a tree of nodes.
ListViewRenderer * getSharedRenderer()
Returns the renderer, which gives access to functions that determine how the widget is displayed.
bool getAutoScroll() const
Returns whether the list view scrolls to the bottom when a new item is added.
void setHeaderHeight(float height)
Changes the height of the header row.
void setShowHorizontalGridLines(bool showGridLines)
Changes whether lines are drawn between items.
void draw(BackendRenderTarget &target, RenderStates states) const override
Draw the widget to a render target.
std::shared_ptr< const ListView > ConstPtr
Shared constant widget pointer.
Definition: ListView.hpp:50
void deselectItems()
Deselects the selected items.
void addMultipleItems(const std::vector< std::vector< String > > &items)
Adds multiple items to the list.
void setExpandLastColumn(bool expand)
Changes whether the last column is expanded to fill the list view (if all columns fit inside the list...
void setAutoScroll(bool autoScroll)
Changes whether the list view scrolls to the bottom when a new item is added.
std::size_t addItem(const std::vector< String > &item)
Adds an item with values for multiple columns to the list.
Widget::Ptr clone() const override
Makes a copy of the widget if you don't know its exact type.
std::vector< std::vector< String > > getItemRows() const
Returns a list of all column values for all items in the list view.
std::set< std::size_t > getSelectedItemIndices() const
Gets the indices of the selected items.
void setItemHeight(unsigned int itemHeight)
Changes the height of the items in the list view.
void setSelectedItem(std::size_t index)
Selects an item in the list view.
void setSeparatorWidth(unsigned int width)
Changes the width of the column separator.
bool getMultiSelect() const
Returns multi selection of the items is allowed.
void setHeaderSeparatorHeight(unsigned int height)
Changes the height of the separator between the header and the items.
void setItemData(std::size_t index, Any data)
Store some user data with the item.
std::vector< String > getItems() const
Returns a list of the texts in the first column for all items in the list view.
unsigned int getHeaderTextSize() const
Returns the text size of the header caption.
Texture getItemIcon(std::size_t index) const
Gets the icon displayed in front of the item.
Scrollbar::Policy getHorizontalScrollbarPolicy() const
Returns when the horizontal scrollbar should be displayed.
void setMultiSelect(bool multiSelect)
Allow multi selection of the items.
void removeAllColumns()
Removes all columns.
bool removeItem(std::size_t index)
Removes the item from the list view.
void mouseLeftWidget() override
This function is called when the mouse leaves the widget.
float getCurrentHeaderHeight() const
Returns the height of the header or 0 if no header row is shown.
void rendererChanged(const String &property) override
Function called when one of the properties of the renderer is changed.
bool getShowVerticalGridLines() const
Returns whether lines are drawn between items.
unsigned int getHeaderSeparatorHeight() const
Returns the height of the separator between the header and the items.
void setGridLinesWidth(unsigned int width)
Changes the width of the grid lines.
ListViewRenderer * getRenderer()
Returns the renderer, which gives access to functions that determine how the widget is displayed.
Definition: Outline.hpp:39
Policy
Defines when the scrollbar shows up.
Definition: Scrollbar.hpp:52
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
Definition: Text.hpp:48
Definition: Texture.hpp:52
The parent class for every widget.
Definition: Widget.hpp:70
std::shared_ptr< Widget > Ptr
Shared widget pointer.
Definition: Widget.hpp:73
Namespace that contains all TGUI functions and classes.
Definition: AbsoluteOrRelativeValue.hpp:36
KeyPressed event parameters.
Definition: Event.hpp:167
Definition: ListView.hpp:73
Definition: ListView.hpp:66
States used for drawing.
Definition: RenderStates.hpp:39