TGUI  0.9.5
Loading...
Searching...
No Matches
Container.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_CONTAINER_HPP
27#define TGUI_CONTAINER_HPP
28
29#include <TGUI/Widget.hpp>
30
31#include <list>
32
34
35namespace tgui
36{
46 class TGUI_API Container : public Widget
47 {
48 public:
49
50 typedef std::shared_ptr<Container> Ptr;
51 typedef std::shared_ptr<const Container> ConstPtr;
52
53
61 Container(const char* typeName, bool initRenderer);
62
63
67 Container(const Container& copy);
68
69
73 Container(Container&& copy) noexcept;
74
75
80
81
85 Container& operator= (const Container& right);
86
87
91 Container& operator= (Container&& right) noexcept;
92
93
98 void setSize(const Layout2d& size) override;
99 using Widget::setSize;
100
101
108 const std::vector<Widget::Ptr>& getWidgets() const
109 {
110 return m_widgets;
111 }
112
113
121 template<typename Function>
122 void sortWidgets(Function&& function)
123 {
124 std::sort(m_widgets.begin(), m_widgets.end(), std::forward<Function>(function));
125 }
126
127
137 virtual void add(const Widget::Ptr& widgetPtr, const String& widgetName = "");
138
139
153 Widget::Ptr get(const String& widgetName) const;
154
155
170 template <class T>
171 typename T::Ptr get(const String& widgetName) const
172 {
173 return std::dynamic_pointer_cast<T>(get(widgetName));
174 }
175
176
185 virtual bool remove(const Widget::Ptr& widget);
186
187
192 virtual void removeAllWidgets();
193
194
199 virtual Vector2f getInnerSize() const;
200
201
210 {
211 return Vector2f{0, 0};
212 }
213
214
220 void setTextSize(unsigned int size) override;
221
222
231 void loadWidgetsFromFile(const String& filename, bool replaceExisting = true);
232
233
241 void saveWidgetsToFile(const String& filename);
242
243
250 void loadWidgetsFromStream(std::stringstream& stream, bool replaceExisting = true);
251
252
259 void loadWidgetsFromStream(std::stringstream&& stream, bool replaceExisting = true);
260
261
268 void saveWidgetsToStream(std::stringstream& stream, const String& rootDirectory = "") const;
269
270
281 void loadWidgetsFromNodeTree(const std::unique_ptr<DataIO::Node>& rootNode, bool replaceExisting = true);
282
283
295 std::unique_ptr<DataIO::Node> saveWidgetsToNodeTree(const String& rootDirectory = "") const;
296
297
305 void moveWidgetToFront(const Widget::Ptr& widget);
306
307
315 void moveWidgetToBack(const Widget::Ptr& widget);
316
317
328 std::size_t moveWidgetForward(const Widget::Ptr& widget);
329
330
341 std::size_t moveWidgetBackward(const Widget::Ptr& widget);
342
343
354 bool setWidgetIndex(const Widget::Ptr& widget, std::size_t index);
355
356
362 int getWidgetIndex(const Widget::Ptr& widget) const;
363
364
374
375
385
386
395
396
405 bool focusNextWidget(bool recursive = true);
406
407
416 bool focusPreviousWidget(bool recursive = true);
417
418
427 void setFocused(bool focused) override;
428
429
436
437
445
446
454
455
463
464
471
472
478 bool processTextEnteredEvent(char32_t key);
479
480
485 void childWidgetFocused(const Widget::Ptr& child);
486
487
491 void leftMousePressed(Vector2f pos) override;
492
496 void rightMousePressed(Vector2f pos) override;
497
501 void leftMouseReleased(Vector2f pos) override;
502
506 void rightMouseReleased(Vector2f pos) override;
507
511 void mouseMoved(Vector2f pos) override;
512
516 void keyPressed(const Event::KeyEvent& event) override;
517
521 void textEntered(char32_t key) override;
522
526 bool mouseWheelScrolled(float delta, Vector2f pos) override;
527
531 void mouseNoLongerOnWidget() override;
532
536 void leftMouseButtonNoLongerDown() override;
537
541 void rightMouseButtonNoLongerDown() override;
542
543
546 // Shows the tool tip when the widget is located below the mouse.
547 // Returns its tool tip or the tool tip from a child widget if the mouse is on top of the widget.
548 // A nullptr is returned when the mouse is not on top of the widget or when the tool tip is empty.
550 Widget::Ptr askToolTip(Vector2f mousePos) override;
551
552
555 // This function is called every frame with the time passed since the last frame.
557 bool updateTime(Duration elapsedTime) override;
558
559
564 void setParent(Container* parent) override;
565
566
571 void setParentGui(GuiBase* gui);
572
573
575 protected:
576
577
584 void rendererChanged(const String& property) override;
585
586
593 void draw(BackendRenderTargetBase& target, RenderStates states) const override;
594
595
599 std::unique_ptr<DataIO::Node> save(SavingRenderersMap& renderers) const override;
600
601
605 void load(const std::unique_ptr<DataIO::Node>& node, const LoadingRenderersMap& renderers) override;
606
607
609 // Checks above which widget the mouse is standing.
610 // If there is no widget below the mouse then this function will return a null pointer.
612 Widget::Ptr getWidgetBelowMouse(Vector2f mousePos) const;
613
614
616 // Checks which widget is below the mouse and updates the cached value.
617 // Note that a nullptr is stored and returned if the widget that is found by getWidgetBelowMouse is disabled.
619 Widget::Ptr updateWidgetBelowMouse(Vector2f mousePos);
620
621
623 // Find out what the index of the focused widget is. Returns 0 when no widget is focused and index+1 otherwise.
625 std::size_t getFocusedWidgetIndex() const;
626
627
629 // Try to focus the given child widget
631 bool tryFocusWidget(const tgui::Widget::Ptr &widget, bool reverseWidgetOrder, bool recursive);
632
633
635 // Transform the mouse position for the child widget based its origin, rotation and scaling.
637 Vector2f transformMousePos(const Widget::Ptr& widget, Vector2f mousePos) const;
638
639
641 // Finishes adding a widget to the container
643 void widgetAdded(Widget::Ptr widgetPtr);
644
645
647 // Turns texture and font filenames into paths relative to the form file
649 void injectFormFilePath(const std::unique_ptr<DataIO::Node>& node, const String& path, std::map<String, bool>& checkedFilenames) const;
650
651
653 // Mutual code in loadWidgetsFromFile and loadWidgetsFromStream
655 void loadWidgetsImpl(const std::unique_ptr<DataIO::Node>& rootNode, bool replaceExisting);
656
657
659 protected:
660
661 std::vector<Widget::Ptr> m_widgets;
662
663 Widget::Ptr m_widgetBelowMouse;
664 Widget::Ptr m_widgetWithLeftMouseDown;
665 Widget::Ptr m_widgetWithRightMouseDown;
666 Widget::Ptr m_focusedWidget;
667
668 Vector2f m_prevInnerSize;
669
670 // Does focusing the next widget always keep a widget from this container focused (e.g. in a ChildWindow)?
671 bool m_isolatedFocus = false;
672
673
674 friend class SubwidgetContainer; // Needs access to save and load functions
675
677 };
678
679
683 class TGUI_API RootContainer : public Container
684 {
685 public:
686
687 typedef std::shared_ptr<RootContainer> Ptr;
688 typedef std::shared_ptr<const RootContainer> ConstPtr;
689
690
698 RootContainer(const char* typeName = "RootContainer", bool initRenderer = true);
699
700
707 void setSize(const Layout2d& size) override;
708 using Widget::setSize;
709
710
717 void setFocused(bool focused) override;
718
719
728 bool isMouseOnWidget(Vector2f pos) const override;
729
730
737 void draw(BackendRenderTargetBase& target, RenderStates states) const override;
738
739
741 private:
742
744 // Returns a nullptr.
746 Widget::Ptr clone() const override
747 {
748 return nullptr;
749 }
750
752 };
753
754
756}
757
759
760#endif // TGUI_CONTAINER_HPP
Base class for render targets.
Definition BackendRenderTarget.hpp:48
Container widget.
Definition Container.hpp:47
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.
std::shared_ptr< Container > Ptr
Shared widget pointer.
Definition Container.hpp:50
~Container()
Destructor.
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 draw(BackendRenderTargetBase &target, RenderStates states) const override
Draw the child widgets to a render target.
void loadWidgetsFromStream(std::stringstream &&stream, bool replaceExisting=true)
Loads the child widgets from a string stream.
bool processMouseWheelScrollEvent(float delta, Vector2f pos)
Inform the container about a mouse wheel scroll event.
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:108
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.
bool setWidgetIndex(const Widget::Ptr &widget, std::size_t index)
Changes the index of a widget in this container.
void sortWidgets(Function &&function)
Sorts a list of all the widgets in this container.
Definition Container.hpp:122
void setTextSize(unsigned int size) override
Changes the character size of all existing and future child widgets.
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.
T::Ptr get(const String &widgetName) const
Returns a pointer to a widget that was added earlier.
Definition Container.hpp:171
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:209
int getWidgetIndex(const Widget::Ptr &widget) const
Returns the current index of a widget in this container.
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.
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.
std::shared_ptr< const Container > ConstPtr
Shared constant widget pointer.
Definition Container.hpp:51
virtual Widget::Ptr getWidgetAtPosition(Vector2f pos) const
Returns the leaf child widget that is located at the given position.
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.
Wrapper for durations.
Definition Duration.hpp:52
Base class for the Gui.
Definition GuiBase.hpp:45
Class to store the position or size of a widget.
Definition Layout.hpp:262
Definition Container.hpp:684
std::shared_ptr< const RootContainer > ConstPtr
Shared constant widget pointer.
Definition Container.hpp:688
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 setFocused(bool focused) override
Focus or unfocus the widget.
void draw(BackendRenderTargetBase &target, RenderStates states) const override
Draws all widgets to a render target.
std::shared_ptr< RootContainer > Ptr
Shared widget pointer.
Definition Container.hpp:687
void setSize(const Layout2d &size) override
Changes the size of the container.
Wrapper class to store strings.
Definition String.hpp:79
Base class for widgets that consist of subwidgets that act together as if they are a single widget.
Definition SubwidgetContainer.hpp:43
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
MouseButton
Mouse buttons.
Definition Event.hpp:148
States used for drawing.
Definition RenderStates.hpp:39