TGUI  0.9.1
Container.hpp
1 //
3 // TGUI - Texus' Graphical User Interface
4 // Copyright (C) 2012-2021 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 
35 namespace 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 
239  void saveWidgetsToFile(const String& filename);
240 
241 
248  void loadWidgetsFromStream(std::stringstream& stream, bool replaceExisting = true);
249 
250 
257  void loadWidgetsFromStream(std::stringstream&& stream, bool replaceExisting = true);
258 
259 
265  void saveWidgetsToStream(std::stringstream& stream) const;
266 
267 
275  void moveWidgetToFront(const Widget::Ptr& widget);
276 
277 
285  void moveWidgetToBack(const Widget::Ptr& widget);
286 
287 
298  std::size_t moveWidgetForward(const Widget::Ptr& widget);
299 
300 
311  std::size_t moveWidgetBackward(const Widget::Ptr& widget);
312 
313 
323 
324 
334 
335 
344 
345 
354  bool focusNextWidget(bool recursive = true);
355 
356 
365  bool focusPreviousWidget(bool recursive = true);
366 
367 
376  void setFocused(bool focused) override;
377 
378 
385 
386 
394 
395 
403 
404 
411  bool processMouseWheelScrollEvent(float delta, Vector2f pos);
412 
413 
420 
421 
427  bool processTextEnteredEvent(char32_t key);
428 
429 
434  void childWidgetFocused(const Widget::Ptr& child);
435 
436 
440  void leftMousePressed(Vector2f pos) override;
441 
445  void rightMousePressed(Vector2f pos) override;
446 
450  void leftMouseReleased(Vector2f pos) override;
451 
455  void rightMouseReleased(Vector2f pos) override;
456 
460  void mouseMoved(Vector2f pos) override;
461 
465  void keyPressed(const Event::KeyEvent& event) override;
466 
470  void textEntered(char32_t key) override;
471 
475  bool mouseWheelScrolled(float delta, Vector2f pos) override;
476 
480  void mouseNoLongerOnWidget() override;
481 
485  void leftMouseButtonNoLongerDown() override;
486 
490  void rightMouseButtonNoLongerDown() override;
491 
492 
495  // Shows the tool tip when the widget is located below the mouse.
496  // Returns its tool tip or the tool tip from a child widget if the mouse is on top of the widget.
497  // A nullptr is returned when the mouse is not on top of the widget or when the tool tip is empty.
499  Widget::Ptr askToolTip(Vector2f mousePos) override;
500 
501 
504  // This function is called every frame with the time passed since the last frame.
506  bool updateTime(Duration elapsedTime) override;
507 
508 
513  void setParent(Container* parent) override;
514 
515 
520  void setParentGui(GuiBase* gui);
521 
522 
524  protected:
525 
526 
533  void rendererChanged(const String& property) override;
534 
535 
542  void draw(BackendRenderTargetBase& target, RenderStates states) const override;
543 
544 
548  std::unique_ptr<DataIO::Node> save(SavingRenderersMap& renderers) const override;
549 
550 
554  void load(const std::unique_ptr<DataIO::Node>& node, const LoadingRenderersMap& renderers) override;
555 
556 
558  // Checks above which widget the mouse is standing.
559  // If there is no widget below the mouse then this function will return a null pointer.
561  Widget::Ptr mouseOnWhichWidget(Vector2f mousePos);
562 
563 
565  // Find out what the index of the focused widget is. Returns 0 when no widget is focused and index+1 otherwise.
567  std::size_t getFocusedWidgetIndex() const;
568 
569 
571  // Try to focus the given child widget
573  bool tryFocusWidget(const tgui::Widget::Ptr &widget, bool reverseWidgetOrder, bool recursive);
574 
575 
577  // Transform the mouse position for the child widget based its origin, rotation and scaling.
579  Vector2f transformMousePos(const Widget::Ptr& widget, Vector2f mousePos) const;
580 
581 
583  // Finishes adding a widget to the container
585  void widgetAdded(Widget::Ptr widgetPtr);
586 
587 
589  // Turns texture and font filenames into paths relative to the form file
591  void injectFormFilePath(const std::unique_ptr<DataIO::Node>& node, const String& path, std::map<String, bool>& checkedFilenames) const;
592 
593 
595  // Mutual code in loadWidgetsFromFile and loadWidgetsFromStream
597  void loadWidgetsImpl(const std::unique_ptr<DataIO::Node>& rootNode, bool replaceExisting);
598 
599 
601  protected:
602 
603  std::vector<Widget::Ptr> m_widgets;
604 
605  Widget::Ptr m_widgetBelowMouse;
606  Widget::Ptr m_widgetWithLeftMouseDown;
607  Widget::Ptr m_widgetWithRightMouseDown;
608  Widget::Ptr m_focusedWidget;
609 
610  Vector2f m_prevInnerSize;
611 
612  // Does focusing the next widget always keep a widget from this container focused (e.g. in a ChildWindow)?
613  bool m_isolatedFocus = false;
614 
615 
616  friend class SubwidgetContainer; // Needs access to save and load functions
617 
619  };
620 
621 
625  class TGUI_API RootContainer : public Container
626  {
627  public:
628 
629  typedef std::shared_ptr<RootContainer> Ptr;
630  typedef std::shared_ptr<const RootContainer> ConstPtr;
631 
632 
640  RootContainer(const char* typeName = "RootContainer", bool initRenderer = true);
641 
642 
649  void setSize(const Layout2d& size) override;
650  using Widget::setSize;
651 
652 
659  void setFocused(bool focused) override;
660 
661 
670  bool isMouseOnWidget(Vector2f pos) const override;
671 
672 
679  void draw(BackendRenderTargetBase& target, RenderStates states) const override;
680 
681 
683  private:
684 
686  // Returns a nullptr.
688  Widget::Ptr clone() const override
689  {
690  return nullptr;
691  }
692 
694  };
695 
696 
698 }
699 
701 
702 #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.
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::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.
const std::vector< Widget::Ptr > & getWidgets() const
Returns a list of all the widgets in this container.
Definition: Container.hpp:108
bool focusNextWidget(bool recursive=true)
Focuses the next 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::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::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
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 setSize(const Layout2d &size) override
Changes the size of the container.
void saveWidgetsToStream(std::stringstream &stream) const
Saves the child widgets to a text file.
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:626
std::shared_ptr< const RootContainer > ConstPtr
Shared constant widget pointer.
Definition: Container.hpp:630
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:629
void setSize(const Layout2d &size) override
Changes the size of the container.
Wrapper class to store strings.
Definition: String.hpp:74
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
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:167
MouseButton
Mouse buttons.
Definition: Event.hpp:148
States used for drawing.
Definition: RenderStates.hpp:39