TGUI 1.11
Loading...
Searching...
No Matches
Container.hpp
1
2//
3// TGUI - Texus' Graphical User Interface
4// Copyright (C) 2012-2025 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_CONTAINER_HPP
26#define TGUI_CONTAINER_HPP
27
28#include <TGUI/Widget.hpp>
29
30#include <list>
31
33
34namespace tgui
35{
45 class TGUI_API Container : public Widget
46 {
47 public:
48
49 using Ptr = std::shared_ptr<Container>;
50 using ConstPtr = std::shared_ptr<const Container>;
51
59 Container(const char* typeName, bool initRenderer);
60
64 Container(const Container& copy);
65
69 Container(Container&& copy) noexcept;
70
74 ~Container() override;
75
79 Container& operator= (const Container& right);
80
84 Container& operator= (Container&& right) noexcept;
85
90 void setSize(const Layout2d& size) override;
91 using Widget::setSize;
92
98 TGUI_NODISCARD const std::vector<Widget::Ptr>& getWidgets() const
99 {
100 return m_widgets;
101 }
102
109 template<typename Function>
110 void sortWidgets(Function&& function)
111 {
112 std::sort(m_widgets.begin(), m_widgets.end(), std::forward<Function>(function));
113 }
114
126 virtual void add(const Widget::Ptr& widgetPtr, const String& widgetName = "");
127
140 TGUI_NODISCARD Widget::Ptr get(const String& widgetName) const;
141
155 template <class WidgetType>
156 TGUI_NODISCARD typename WidgetType::Ptr get(const String& widgetName) const
157 {
158 return std::dynamic_pointer_cast<WidgetType>(get(widgetName));
159 }
160
168 virtual bool remove(const Widget::Ptr& widget);
169
173 virtual void removeAllWidgets();
174
179 TGUI_NODISCARD virtual Vector2f getInnerSize() const;
180
187 TGUI_NODISCARD virtual Vector2f getChildWidgetsOffset() const
188 {
189 return Vector2f{0, 0};
190 }
191
200 void loadWidgetsFromFile(const String& filename, bool replaceExisting = true);
201
209 void saveWidgetsToFile(const String& filename);
210
217 void loadWidgetsFromStream(std::stringstream& stream, bool replaceExisting = true);
218
225 void loadWidgetsFromStream(std::stringstream&& stream, bool replaceExisting = true);
226
233 void saveWidgetsToStream(std::stringstream& stream, const String& rootDirectory = "") const;
234
245 void loadWidgetsFromNodeTree(const std::unique_ptr<DataIO::Node>& rootNode, bool replaceExisting = true);
246
258 TGUI_NODISCARD std::unique_ptr<DataIO::Node> saveWidgetsToNodeTree(const String& rootDirectory = "") const;
259
267 void moveWidgetToFront(const Widget::Ptr& widget);
268
276 void moveWidgetToBack(const Widget::Ptr& widget);
277
288 std::size_t moveWidgetForward(const Widget::Ptr& widget);
289
300 std::size_t moveWidgetBackward(const Widget::Ptr& widget);
301
312 virtual bool setWidgetIndex(const Widget::Ptr& widget, std::size_t index);
313
319 TGUI_NODISCARD int getWidgetIndex(const Widget::Ptr& widget) const;
320
329 TGUI_NODISCARD Widget::Ptr getFocusedChild() const;
330
339 TGUI_NODISCARD Widget::Ptr getFocusedLeaf() const;
340
341#ifndef TGUI_REMOVE_DEPRECATED_CODE
351 TGUI_DEPRECATED("Use getWidgetAtPos instead") TGUI_NODISCARD virtual Widget::Ptr getWidgetAtPosition(Vector2f pos) const;
352#endif
365 TGUI_NODISCARD virtual Widget::Ptr getWidgetAtPos(Vector2f pos, bool recursive) const;
366
375 bool focusNextWidget(bool recursive = true);
376
385 bool focusPreviousWidget(bool recursive = true);
386
395 void setFocused(bool focused) override;
396
402 bool processMouseMoveEvent(Vector2f pos);
403
410 bool processMousePressEvent(Event::MouseButton button, Vector2f pos);
411
419
427 bool processScrollEvent(float delta, Vector2f pos, bool touch);
428
435
441 bool processTextEnteredEvent(char32_t key);
442
447 void childWidgetFocused(const Widget::Ptr& child);
448
452 bool leftMousePressed(Vector2f pos) override;
453
457 void rightMousePressed(Vector2f pos) override;
458
462 void leftMouseReleased(Vector2f pos) override;
463
467 void rightMouseReleased(Vector2f pos) override;
468
472 void mouseMoved(Vector2f pos) override;
473
477 void keyPressed(const Event::KeyEvent& event) override;
478
488 bool canHandleKeyPress(const Event::KeyEvent& event) override;
489
493 void textEntered(char32_t key) override;
494
498 bool scrolled(float delta, Vector2f pos, bool touch) override;
499
503 void mouseNoLongerOnWidget() override;
504
508 void leftMouseButtonNoLongerDown() override;
509
513 void rightMouseButtonNoLongerDown() override;
514
517 // Shows the tool tip when the widget is located below the mouse.
518 // Returns its tool tip or the tool tip from a child widget if the mouse is on top of the widget.
519 // A nullptr is returned when the mouse is not on top of the widget or when the tool tip is empty.
521 TGUI_NODISCARD Widget::Ptr askToolTip(Vector2f mousePos) override;
522
525 // This function is called every frame with the time passed since the last frame.
527 bool updateTime(Duration elapsedTime) override;
528
533 void setParent(Container* parent) override;
534
539 void setParentGui(BackendGui* gui);
540
546 void updateChildrenWithAutoLayout();
547
549 protected:
550
556 void rendererChanged(const String& property) override;
557
564 void draw(BackendRenderTarget& target, RenderStates states) const override;
565
569 TGUI_NODISCARD std::unique_ptr<DataIO::Node> save(SavingRenderersMap& renderers) const override;
570
574 void load(const std::unique_ptr<DataIO::Node>& node, const LoadingRenderersMap& renderers) override;
575
579 void updateTextSize() override;
580
582 // Checks above which widget the mouse is standing.
583 // If there is no widget below the mouse then this function will return a null pointer.
585 TGUI_NODISCARD Widget::Ptr getWidgetBelowMouse(Vector2f mousePos) const;
586
588 // Checks which widget is below the mouse and updates the cached value.
589 // Note that a nullptr is stored and returned if the widget that is found by getWidgetBelowMouse is disabled.
591 Widget::Ptr updateWidgetBelowMouse(Vector2f mousePos);
592
594 // Find out what the index of the focused widget is. Returns 0 when no widget is focused and index+1 otherwise.
596 TGUI_NODISCARD std::size_t getFocusedWidgetIndex() const;
597
599 // Try to focus the given child widget
601 bool tryFocusWidget(const Widget::Ptr &widget, bool reverseWidgetOrder, bool recursive);
602
604 // Transform the mouse position for the child widget based its origin, rotation and scaling.
606 TGUI_NODISCARD Vector2f transformMousePos(const Widget::Ptr& widget, Vector2f mousePos) const;
607
609 // Finishes adding a widget to the container
611 void widgetAdded(const Widget::Ptr& widgetPtr);
612
614 // Turns texture and font filenames into paths relative to the form file
616 void injectFormFilePath(const std::unique_ptr<DataIO::Node>& node, const String& path, std::map<String, bool>& checkedFilenames) const;
617
619 // Mutual code in loadWidgetsFromFile and loadWidgetsFromStream
621 void loadWidgetsImpl(const std::unique_ptr<DataIO::Node>& rootNode, bool replaceExisting);
622
624 protected:
625
626 std::vector<Widget::Ptr> m_widgets;
627
628 Widget::Ptr m_widgetBelowMouse;
629 Widget::Ptr m_widgetWithLeftMouseDown;
630 Widget::Ptr m_widgetWithRightMouseDown;
631 Widget::Ptr m_focusedWidget;
632 bool m_draggingWidget = false;
633
634 Vector2f m_prevInnerSize;
635
636 // Does focusing the next widget always keep a widget from this container focused (e.g. in a ChildWindow)?
637 bool m_isolatedFocus = false;
638
639 friend class SubwidgetContainer; // Needs access to save and load functions
640
642 };
643
647 class TGUI_API RootContainer : public Container
648 {
649 public:
650
651 using Ptr = std::shared_ptr<RootContainer>;
652 using ConstPtr = std::shared_ptr<const RootContainer>;
653
654 static constexpr const char StaticWidgetType[] = "RootContainer";
655
663 RootContainer(const char* typeName = StaticWidgetType, bool initRenderer = true);
664
671 void setFocused(bool focused) override;
672
680 TGUI_NODISCARD bool isMouseOnWidget(Vector2f pos) const override;
681
685 void mouseNoLongerOnWidget() override;
686
693 void draw(BackendRenderTarget& target, RenderStates states) const override;
694
696 private:
697
699 // Returns a nullptr.
701 Widget::Ptr clone() const override
702 {
703 return nullptr;
704 }
705
707 };
708
710}
711
713
714#endif // TGUI_CONTAINER_HPP
Base class for the Gui.
Definition BackendGui.hpp:45
Base class for render targets.
Definition BackendRenderTarget.hpp:46
virtual bool remove(const Widget::Ptr &widget)
Removes a single widget that was added to the container.
bool processMousePressEvent(Event::MouseButton button, Vector2f pos)
Inform the container about a mouse press event.
Container(const Container &copy)
Copy constructor.
std::unique_ptr< DataIO::Node > saveWidgetsToNodeTree(const String &rootDirectory="") const
Saves the child widgets to a tree of nodes that contain all information about the widgets.
bool processMouseReleaseEvent(Event::MouseButton button, Vector2f pos)
Inform the container about a mouse release event.
Container(Container &&copy) noexcept
Move constructor.
std::size_t moveWidgetBackward(const Widget::Ptr &widget)
Places a widget one step backward in the z-order.
bool focusPreviousWidget(bool recursive=true)
Focuses the previous widget in this container.
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.
~Container() override
Destructor.
bool canHandleKeyPress(const Event::KeyEvent &event) override
Called by the parent of the widget to check if keyPressed would process the event.
void draw(BackendRenderTarget &target, RenderStates states) const override
Draw the child widgets to a render target.
std::shared_ptr< Container > Ptr
Shared widget pointer.
Definition Container.hpp:49
bool processScrollEvent(float delta, Vector2f pos, bool touch)
Inform the container about a scroll event (either mouse wheel or two finger scrolling on touchscreen)
void rendererChanged(const String &property) override
Function called when one of the properties of the renderer is changed.
virtual void add(const Widget::Ptr &widgetPtr, const String &widgetName="")
Adds a widget to the container.
virtual void removeAllWidgets()
Removes all widgets that were added to the container.
void loadWidgetsFromStream(std::stringstream &&stream, bool replaceExisting=true)
Loads the child widgets from a string stream.
virtual Vector2f getInnerSize() const
Returns the space available for widgets inside the container.
Widget::Ptr get(const String &widgetName) const
Returns a pointer to a widget that was added earlier.
bool focusNextWidget(bool recursive=true)
Focuses the next widget in this container.
const std::vector< Widget::Ptr > & getWidgets() const
Returns a list of all the widgets in this container.
Definition Container.hpp:98
void loadWidgetsFromNodeTree(const std::unique_ptr< DataIO::Node > &rootNode, bool replaceExisting=true)
Loads the child widgets from a tree of nodes that contain all information about the widgets.
void sortWidgets(Function &&function)
Sorts a list of all the widgets in this container.
Definition Container.hpp:110
virtual Widget::Ptr getWidgetAtPos(Vector2f pos, bool recursive) const
Returns the widget that is located at the given position.
void load(const std::unique_ptr< DataIO::Node > &node, const LoadingRenderersMap &renderers) override
Loads the widget from a tree of nodes.
void moveWidgetToFront(const Widget::Ptr &widget)
Places a widget before all other widgets, to the front of the z-order.
void loadWidgetsFromFile(const String &filename, bool replaceExisting=true)
Loads the child widgets from a text file.
void moveWidgetToBack(const Widget::Ptr &widget)
Places a widget behind all other widgets, to the back of the z-order.
virtual bool setWidgetIndex(const Widget::Ptr &widget, std::size_t index)
Changes the index of a widget in this container.
std::size_t moveWidgetForward(const Widget::Ptr &widget)
Places a widget one step forward in the z-order.
virtual Vector2f getChildWidgetsOffset() const
Returns the distance between the position of the container and a widget that would be drawn inside th...
Definition Container.hpp:187
int getWidgetIndex(const Widget::Ptr &widget) const
Returns the current index of a widget in this container.
bool leftMousePressed(Vector2f pos) override
Called by the parent when the left mouse button goes down on top of the widget.
void updateTextSize() override
Called when the text size is changed (either by setTextSize or via the renderer)
bool processTextEnteredEvent(char32_t key)
Inform the container about a key press event.
void setFocused(bool focused) override
Focus or unfocus the widget.
bool processKeyPressEvent(Event::KeyEvent event)
Inform the container about a key press event.
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...
void saveWidgetsToFile(const String &filename)
Saves the child widgets to a text file.
void saveWidgetsToStream(std::stringstream &stream, const String &rootDirectory="") const
Saves the child widgets to a text file.
void setSize(const Layout2d &size) override
Changes the size of the container.
void loadWidgetsFromStream(std::stringstream &stream, bool replaceExisting=true)
Loads the child widgets from a string stream.
bool processMouseMoveEvent(Vector2f pos)
Inform the container about a mouse move event.
virtual Widget::Ptr getWidgetAtPosition(Vector2f pos) const
Returns the leaf child widget that is located at the given position.
WidgetType::Ptr get(const String &widgetName) const
Returns a pointer to a widget that was added earlier.
Definition Container.hpp:156
Widget::Ptr getFocusedChild() const
Returns the child widget that is focused inside this container.
Widget::Ptr getFocusedLeaf() const
Returns the leaf child widget that is focused inside this container.
std::shared_ptr< const Container > ConstPtr
Shared constant widget pointer.
Definition Container.hpp:50
Wrapper for durations.
Definition Duration.hpp:53
Class to store the position or size of a widget.
Definition Layout.hpp:321
std::shared_ptr< RootContainer > Ptr
Shared widget pointer.
Definition Container.hpp:651
static constexpr const char StaticWidgetType[]
Type name of the widget.
Definition Container.hpp:654
std::shared_ptr< const RootContainer > ConstPtr
Shared constant widget pointer.
Definition Container.hpp:652
bool isMouseOnWidget(Vector2f pos) const override
Returns whether the mouse position (which is relative to the parent widget) lies on top of the widget...
void draw(BackendRenderTarget &target, RenderStates states) const override
Draws all widgets to a render target.
void setFocused(bool focused) override
Focus or unfocus the widget.
Wrapper class to store strings.
Definition String.hpp:94
std::shared_ptr< Widget > Ptr
Shared widget pointer.
Definition Widget.hpp:87
virtual void setSize(const Layout2d &size)
Changes the size of the widget.
Namespace that contains all TGUI functions and classes.
Definition AbsoluteOrRelativeValue.hpp:36
KeyPressed event parameters.
Definition Event.hpp:168
MouseButton
Mouse buttons.
Definition Event.hpp:149
States used for drawing.
Definition RenderStates.hpp:38