TGUI 1.12
Loading...
Searching...
No Matches
ListBox.hpp
1
2//
3// TGUI - Texus' Graphical User Interface
4// Copyright (C) 2012-2026 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#ifndef TGUI_LIST_BOX_HPP
26#define TGUI_LIST_BOX_HPP
27
28#include <TGUI/Widgets/Scrollbar.hpp>
29#include <TGUI/Renderers/ListBoxRenderer.hpp>
30#include <TGUI/Text.hpp>
31
33
34namespace tgui
35{
39 class TGUI_API ListBox : public Widget, public ScrollbarChildInterface
40 {
41 public:
42
43 using Ptr = std::shared_ptr<ListBox>;
44 using ConstPtr = std::shared_ptr<const ListBox>;
45
46 static constexpr const char StaticWidgetType[] = "ListBox";
47
51 using TextAlignment TGUI_DEPRECATED("Use tgui::HorizontalAlignment instead") = HorizontalAlignment;
52
60 explicit ListBox(const char* typeName = StaticWidgetType, bool initRenderer = true);
61
67 TGUI_NODISCARD static ListBox::Ptr create();
68
76 TGUI_NODISCARD static ListBox::Ptr copy(const ListBox::ConstPtr& listBox);
77
82 TGUI_NODISCARD ListBoxRenderer* getSharedRenderer() override;
83 TGUI_NODISCARD const ListBoxRenderer* getSharedRenderer() const override;
84
90 TGUI_NODISCARD ListBoxRenderer* getRenderer() override;
91
97 void setSize(const Layout2d& size) override;
98 using Widget::setSize;
99
110 std::size_t addItem(const String& itemName, const String& id = "");
111
121 void addMultipleItems(const std::vector<String>& itemNames);
122
136 bool setSelectedItem(const String& itemName);
137
152
165 bool setSelectedItemByIndex(std::size_t index);
166
171
183 bool removeItem(const String& itemName);
184
196 bool removeItemById(const String& id);
197
210 bool removeItemByIndex(std::size_t index);
211
216
226 TGUI_NODISCARD String getItemById(const String& id) const;
227
235 TGUI_NODISCARD String getItemByIndex(std::size_t index) const;
236
246 TGUI_NODISCARD int getIndexById(const String& id) const;
247
255 TGUI_NODISCARD String getIdByIndex(std::size_t index) const;
256
263 TGUI_NODISCARD String getSelectedItem() const;
264
271 TGUI_NODISCARD String getSelectedItemId() const;
272
278 TGUI_NODISCARD int getSelectedItemIndex() const;
279
285 TGUI_NODISCARD int getHoveredItemIndex() const;
286
299 bool changeItem(const String& originalValue, const String& newValue);
300
313 bool changeItemById(const String& id, const String& newValue);
314
325 bool changeItemByIndex(std::size_t index, const String& newValue);
326
332 TGUI_NODISCARD std::size_t getItemCount() const;
333
339 TGUI_NODISCARD std::vector<String> getItems() const;
340
348 TGUI_NODISCARD std::vector<String> getItemIds() const;
349
362 void setItemData(std::size_t index, Any data);
363
370 template <typename DataType>
371 TGUI_NODISCARD DataType getItemData(std::size_t index) const
372 {
373 if (index < m_items.size())
374 return AnyCast<DataType>(m_items[index].data);
375 throw std::bad_cast();
376 }
377
385 void setItemHeight(unsigned int itemHeight);
386
392 TGUI_NODISCARD unsigned int getItemHeight() const;
393
402 void setMaximumItems(std::size_t maximumItems = 0);
403
410 TGUI_NODISCARD std::size_t getMaximumItems() const;
411
419 void setAutoScroll(bool autoScroll);
420
425 TGUI_NODISCARD bool getAutoScroll() const;
426
435
441 TGUI_NODISCARD HorizontalAlignment getTextAlignment() const;
442
450 TGUI_NODISCARD bool contains(const String& item) const;
451
459 TGUI_NODISCARD bool containsId(const String& id) const;
460
466 TGUI_DEPRECATED("Use getScrollbar()->setValue(value) instead") void setScrollbarValue(unsigned int value);
467
473 TGUI_DEPRECATED("Use getScrollbar()->getValue() instead") TGUI_NODISCARD unsigned int getScrollbarValue() const;
474
482 TGUI_DEPRECATED("Use getScrollbar()->getMaxValue() instead") TGUI_NODISCARD unsigned int getScrollbarMaxValue() const;
483
489 TGUI_NODISCARD bool isMouseOnWidget(Vector2f pos) const override;
490
494 bool leftMousePressed(Vector2f pos) override;
495
499 void leftMouseReleased(Vector2f pos) override;
500
504 void rightMousePressed(Vector2f pos) override;
505
509 void mouseMoved(Vector2f pos) override;
510
514 bool scrolled(float delta, Vector2f pos, bool touch) override;
515
519 void mouseNoLongerOnWidget() override;
520
524 void leftMouseButtonNoLongerDown() override;
525
529 void keyPressed(const Event::KeyEvent& event) override;
530
540 bool canHandleKeyPress(const Event::KeyEvent& event) override;
541
548 void draw(BackendRenderTarget& target, RenderStates states) const override;
549
551 protected:
552
562 TGUI_NODISCARD Signal& getSignal(String signalName) override;
563
569 void rendererChanged(const String& property) override;
570
574 TGUI_NODISCARD std::unique_ptr<DataIO::Node> save(SavingRenderersMap& renderers) const override;
575
579 void load(const std::unique_ptr<DataIO::Node>& node, const LoadingRenderersMap& renderers) override;
580
584 void updateTextSize() override;
585
589 void scrollbarValueChanged() override;
590
592 // Returns the size without the borders
594 TGUI_NODISCARD Vector2f getInnerSize() const;
595
597 // Updates the position of the items and the scrollbar
599 void updateItemPositions();
600
602 // Update the colors and text style of the selected and hovered items
604 void updateSelectedAndHoveringItemColorsAndStyle();
605
607 // Update the color and text style of all the items
609 void updateItemColorsAndStyle();
610
612 // Update on which item the mouse is standing
614 void updateHoveringItem(int item);
615
617 // Update which item is selected
619 void updateSelectedItem(int item);
620
622 // Update the hovered item based on a mouse event. The innerPos is the mouse pos relative to the area inside the borders.
624 void setHoveredItemBasedOnMousePos(Vector2f innerPos);
625
627 // Update the selected (and hovered) item based on a mouse event. The innerPos is relative to the area inside the borders.
629 void setSelectedItemBasedOnMousePos(Vector2f innerPos);
630
632 // Checks whether the scrollbar value was changed and emit the onScroll event if it did
634 void triggerOnScroll();
635
637 // Adds an item to the list. Called from both addItem and addMultipleItems
639 void addItemImpl(const String& itemName, const String& id);
640
642 // This function is called every frame with the time passed since the last frame.
644 bool updateTime(Duration elapsedTime) override;
645
647 // Makes a copy of the widget
649 TGUI_NODISCARD Widget::Ptr clone() const override;
650
652 public:
653
654 SignalItem onItemSelect = {"ItemSelected"};
655 SignalItem onMousePress = {"MousePressed"};
656 SignalItem onMouseRelease = {"MouseReleased"};
657 SignalItem onDoubleClick = {"DoubleClicked"};
658 SignalItem onRightClick = {"RightClicked"};
659 SignalUInt onScroll = {"Scrolled"};
660
662 protected:
663
664 struct Item
665 {
666 Text text;
667 Any data;
668 String id;
669 };
670
671 std::vector<Item> m_items;
672
673 // What is the index of the selected item?
674 // This is also used by combo box, so it can't just be changed to a pointer!
675 int m_selectedItem = -1;
676
677 int m_hoveringItem = -1;
678
679 unsigned int m_itemHeight = 0;
680
681 // This will store the maximum number of items in the list box (zero by default, meaning that there is no limit)
682 std::size_t m_maxItems = 0;
683
684 // When there are too many items a scrollbar will be shown
685 unsigned int m_lastScrollbarValue = 0;
686
687 // Will be set to true after the first click, but gets reset to false when the second click does not occur soon after
688 bool m_possibleDoubleClick = false;
689
690 bool m_autoScroll = true;
692
693 Sprite m_spriteBackground;
694
695 // Cached renderer properties
696 Borders m_bordersCached;
697 Borders m_paddingCached;
698 Color m_borderColorCached;
699 Color m_backgroundColorCached;
700 Color m_backgroundColorHoverCached;
701 Color m_selectedBackgroundColorCached;
702 Color m_selectedBackgroundColorHoverCached;
703 Color m_textColorCached;
704 Color m_textColorHoverCached;
705 Color m_selectedTextColorCached;
706 Color m_selectedTextColorHoverCached;
707 TextStyles m_textStyleCached;
708 TextStyles m_selectedTextStyleCached;
709
711 };
712
714}
715
717
718#endif // TGUI_LIST_BOX_HPP
Base class for render targets.
Definition BackendRenderTarget.hpp:46
Wrapper for colors.
Definition Color.hpp:71
Wrapper for durations.
Definition Duration.hpp:53
Class to store the position or size of a widget.
Definition Layout.hpp:321
Definition ListBoxRenderer.hpp:35
unsigned int getScrollbarMaxValue() const
Returns the maximum thumb position of the scrollbar.
std::vector< String > getItemIds() const
Returns a copy of the item ids in the list box.
bool changeItem(const String &originalValue, const String &newValue)
Changes an item with name originalValue to newValue.
DataType getItemData(std::size_t index) const
Returns user data stored in the item.
Definition ListBox.hpp:371
void setItemHeight(unsigned int itemHeight)
Changes the height of the items in the list box.
std::size_t getItemCount() const
Returns the amount of items in the list box.
bool changeItemByIndex(std::size_t index, const String &newValue)
Changes the name of an item at the given index to newValue.
bool changeItemById(const String &id, const String &newValue)
Changes the name of an item with the given id to newValue.
void setTextAlignment(HorizontalAlignment alignment)
Changes the horizontal text alignment.
unsigned int getScrollbarValue() const
Returns the thumb position of the scrollbar.
unsigned int getItemHeight() const
Returns the height of the items in the list box.
std::vector< String > getItems() const
Returns a copy of the items in the list box.
HorizontalAlignment getTextAlignment() const
Gets the current horizontal text alignment.
static ListBox::Ptr copy(const ListBox::ConstPtr &listBox)
Makes a copy of another list box.
void addMultipleItems(const std::vector< String > &itemNames)
Adds multiple items to the list.
ListBoxRenderer * getRenderer() override
Returns the renderer, which gives access to functions that determine how the widget is displayed.
void setItemData(std::size_t index, Any data)
Store some user data with the item.
String getItemById(const String &id) const
Returns the item name of the item with the given id.
void scrollbarValueChanged() override
Called when the value of the scrollbar has been changed via getScrollbar()->setValue(....
void updateTextSize() override
Called when the text size is changed (either by setTextSize or via the renderer).
void deselectItem()
Deselects the selected item.
SignalItem onItemSelect
An item was selected in the list box. Optional parameter: selected item or its index.
Definition ListBox.hpp:654
ListBoxRenderer * getSharedRenderer() override
Returns the renderer, which gives access to functions that determine how the widget is displayed.
std::shared_ptr< const ListBox > ConstPtr
Shared constant widget pointer.
Definition ListBox.hpp:44
void setMaximumItems(std::size_t maximumItems=0)
Changes the maximum items that the list box can contain.
SignalItem onDoubleClick
An item was double clicked. Optional parameter: selected item or its index.
Definition ListBox.hpp:657
int getHoveredItemIndex() const
Gets the index of the item below the mouse cursor.
void draw(BackendRenderTarget &target, RenderStates states) const override
Draw the widget to a render target.
bool leftMousePressed(Vector2f pos) override
Called by the parent when the left mouse button goes down on top of the widget.
bool canHandleKeyPress(const Event::KeyEvent &event) override
Called by the parent of the widget to check if keyPressed would process the event.
SignalItem onMousePress
The mouse went down on an item. Optional parameter: selected item or its index.
Definition ListBox.hpp:655
String getSelectedItemId() const
Gets the id of the selected item.
static ListBox::Ptr create()
Creates a new list box widget.
bool contains(const String &item) const
Returns whether the list box contains the given item.
void removeAllItems()
Removes all items from the list.
SignalItem onMouseRelease
The mouse was released on one of the items. Optional parameter: selected item or its index.
Definition ListBox.hpp:656
bool removeItemByIndex(std::size_t index)
Removes the item from the list box.
Signal & getSignal(String signalName) override
Retrieves a signal based on its name.
void load(const std::unique_ptr< DataIO::Node > &node, const LoadingRenderersMap &renderers) override
Loads the widget from a tree of nodes.
bool removeItemById(const String &id)
Removes the item that were added with the given id.
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...
String getIdByIndex(std::size_t index) const
Returns the id of the item at the given index.
bool setSelectedItemById(const String &id)
Selects an item in the list box.
bool setSelectedItem(const String &itemName)
Selects an item in the list box.
void setScrollbarValue(unsigned int value)
Changes the thumb position of the scrollbar.
Widget::Ptr clone() const override
Makes a copy of the widget if you don't know its exact type.
bool removeItem(const String &itemName)
Removes the item from the list with the given name.
void setSize(const Layout2d &size) override
Changes the size of the list box.
bool containsId(const String &id) const
Returns whether the list box contains an item with the given id.
String getItemByIndex(std::size_t index) const
Returns the item name of the item at the given index.
SignalUInt onScroll
The list was scrolled. Optional parameter: new value of scrollbar.
Definition ListBox.hpp:659
std::size_t addItem(const String &itemName, const String &id="")
Adds an item to the list.
bool getAutoScroll() const
Returns whether the list box scrolls to the bottom when a new item is added.
bool isMouseOnWidget(Vector2f pos) const override
Returns whether the mouse position (which is relative to the parent widget) lies on top of the widget...
int getSelectedItemIndex() const
Gets the index of the selected item.
void rendererChanged(const String &property) override
Function called when one of the properties of the renderer is changed.
HorizontalAlignment TextAlignment
The horizontal text alignment.
Definition ListBox.hpp:51
void setAutoScroll(bool autoScroll)
Changes whether the list box scrolls to the bottom when a new item is added.
std::size_t getMaximumItems() const
Returns the maximum items that the list box can contain.
static constexpr const char StaticWidgetType[]
Type name of the widget.
Definition ListBox.hpp:46
std::shared_ptr< ListBox > Ptr
Shared widget pointer.
Definition ListBox.hpp:43
bool setSelectedItemByIndex(std::size_t index)
Selects an item in the list box.
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.
int getIndexById(const String &id) const
Returns the index of the item with the given id.
SignalItem onRightClick
Right mouse pressed on list box (also fires if not on top of item). Optional parameter: selected item...
Definition ListBox.hpp:658
String getSelectedItem() const
Returns the currently selected item.
ScrollbarChildInterface()
Default constructor.
Signal to which the user can subscribe to get callbacks from.
Definition Signal.hpp:520
Signal to which the user can subscribe to get callbacks from.
Definition Signal.hpp:59
Definition Sprite.hpp:45
Wrapper class to store strings.
Definition String.hpp:93
Wrapper for text styles.
Definition TextStyle.hpp:55
Backend-independent wrapper around the backend-specific text class.
Definition Text.hpp:53
virtual void setSize(const Layout2d &size)
Changes the size of the widget.
Namespace that contains all TGUI functions and classes.
Definition AbsoluteOrRelativeValue.hpp:36
HorizontalAlignment
The horizontal alignment.
Definition Layout.hpp:60
@ Left
Align to the left side.
Definition Layout.hpp:61
SignalTyped< unsigned int > SignalUInt
Signal with one "unsigned int" as optional unbound parameter.
Definition Signal.hpp:422
Definition Event.hpp:38
Definition ListBox.hpp:665
States used for drawing.
Definition RenderStates.hpp:38