TGUI  1.3.0
Loading...
Searching...
No Matches
Layout.hpp
1
2//
3// TGUI - Texus' Graphical User Interface
4// Copyright (C) 2012-2024 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_LAYOUT_HPP
27#define TGUI_LAYOUT_HPP
28
29#include <TGUI/Config.hpp>
30#include <TGUI/Vector2.hpp>
31
32#if !TGUI_EXPERIMENTAL_USE_STD_MODULE
33 #include <type_traits>
34 #include <functional>
35 #include <memory>
36 #include <string>
37#endif
38
40
41TGUI_MODULE_EXPORT namespace tgui
42{
43 class BackendGui;
44 class Widget;
45 class Container;
46
52 {
53 Left,
54 Center,
55 Right
56 };
57
58
64 {
65 Top ,
66 Center,
67 Bottom
68 };
69
75 enum class AutoLayout
76 {
77 Manual,
78 Top,
79 Left,
80 Right,
81 Bottom,
82 Leftmost,
83 Rightmost,
84 Fill
85 };
86
92 class TGUI_API Layout
93 {
94 public:
95
97 enum class Operation
98 {
99 Value,
100 Plus,
101 Minus,
102 Multiplies,
103 Divides,
104 Minimum,
105 Maximum,
106 BindingPosX, // X position, same as BindingLeft if widget origin isn't changed
107 BindingPosY, // Y position, same as BindingTop if widget origin isn't changed
108 BindingLeft,
109 BindingTop,
110 BindingWidth,
111 BindingHeight,
112 BindingInnerWidth,
113 BindingInnerHeight,
114 BindingString
115 };
116
117
119 public:
120
124 Layout() = default;
125
126
132 template <typename T, typename = typename std::enable_if_t<std::is_arithmetic<T>::value, T>>
133 Layout(T constant) :
134 m_value{static_cast<float>(constant)}
135 {
136 }
137
138
144 Layout(const char* expression) :
145 Layout{String{expression}}
146 {
147 }
148
149
155 Layout(String expression);
156
157
162 explicit Layout(Operation operation, Widget* boundWidget);
163
164
169 explicit Layout(Operation operation, std::unique_ptr<Layout> leftOperand, std::unique_ptr<Layout> rightOperand);
170
171
175 Layout(const Layout& other);
176
180 Layout(Layout&& other) noexcept;
181
185 Layout& operator=(const Layout& other);
186
190 Layout& operator=(Layout&& other) noexcept;
191
196
197
203 void replaceValue(const Layout& value);
204
205
211 TGUI_NODISCARD float getValue() const
212 {
213 return m_value;
214 }
215
216
222 TGUI_NODISCARD bool isConstant() const
223 {
224 return m_operation == Operation::Value;
225 }
226
227
234 TGUI_NODISCARD String toString() const;
235
236
244 void connectWidget(Widget* widget, bool xAxis, std::function<void()> valueChangedCallbackHandler);
245
246
251 void unbindWidget();
252
253
259 void recalculateValue();
260
261
266 TGUI_NODISCARD Layout* getLeftOperand() const;
267
268
273 TGUI_NODISCARD Layout* getRightOperand() const;
274
275
277 private:
278
279
281 // If a widget is bound, inform it that the layout no longer binds it
283 void unbindLayout();
284
285
287 // Resets the parent pointers of the left and right operands if they exist and tell the bound widget that this layout
288 // requires information about changes to its position or size when the operation requires a widget to be bound.
290 void resetPointers();
291
292
294 // Check whether sublayouts contain a string that refers to a widget which should be bound.
296 void parseBindingStringRecursive(Widget* widget, bool xAxis);
297
298
300 // Find the widget corresponding to the given name and bind it if found
302 void parseBindingString(const String& expression, Widget* widget, bool xAxis);
303
304
306 private:
307
308 float m_value = 0;
309 Layout* m_parent = nullptr;
310 Operation m_operation = Operation::Value;
311 std::unique_ptr<Layout> m_leftOperand = nullptr; // The left operand of the operation in case the operation is a math operation
312 std::unique_ptr<Layout> m_rightOperand = nullptr; // The left operand of the operation in case the operation is a math operation
313 Widget* m_boundWidget = nullptr; // The widget on which this layout depends in case the operation is a binding
314 String m_boundString; // String referring to a widget on which this layout depends in case the layout was created from a string and contains a binding operation
315 std::function<void()> m_connectedWidgetCallback = nullptr; // Function to call when the value of the layout changes in case the layout and sublayouts are not all constants
316 int m_callingCallbackCount = 0; // Used to detect that connectWidget is called in an infinity loop if certain layouts depend on each other
317
319 };
320
321
327 class TGUI_API Layout2d
328 {
329 public:
330
336 Layout2d(Vector2f constant = {0, 0}) :
337 x{constant.x},
338 y{constant.y}
339 {
340 }
341
342
349 Layout2d(Layout layoutX, Layout layoutY) :
350 x{std::move(layoutX)},
351 y{std::move(layoutY)}
352 {
353 }
354
355
363 Layout2d(const char* expression) :
364 x{expression},
365 y{expression}
366 {
367 }
368
369
377 Layout2d(const String& expression) :
378 x{expression},
379 y{expression}
380 {
381 }
382
383
389 TGUI_NODISCARD Vector2f getValue() const
390 {
391 return {x.getValue(), y.getValue()};
392 }
393
394
401 TGUI_NODISCARD String toString() const
402 {
403 return U"(" + x.toString() + U", " + y.toString() + U")";
404 }
405
407 public:
408
409 Layout x;
410 Layout y;
411 };
412
413
417 TGUI_NODISCARD TGUI_API Layout operator-(Layout right);
418
422 TGUI_NODISCARD TGUI_API Layout operator+(Layout left, Layout right);
423
427 TGUI_NODISCARD TGUI_API Layout operator-(Layout left, Layout right);
428
432 TGUI_NODISCARD TGUI_API Layout operator*(Layout left, Layout right);
433
437 TGUI_NODISCARD TGUI_API Layout operator/(Layout left, Layout right);
438
442 TGUI_NODISCARD TGUI_API Layout2d operator-(Layout2d right);
443
447 TGUI_NODISCARD TGUI_API Layout2d operator+(Layout2d left, Layout2d right);
448
452 TGUI_NODISCARD TGUI_API Layout2d operator-(Layout2d left, Layout2d right);
453
457 TGUI_NODISCARD TGUI_API Layout2d operator*(Layout2d left, const Layout& right);
458
462 TGUI_NODISCARD TGUI_API Layout2d operator*(const Layout& left, Layout2d right);
463
467 TGUI_NODISCARD TGUI_API Layout2d operator/(Layout2d left, const Layout& right);
468
469
471
472 inline namespace bind_functions
473 {
475 TGUI_NODISCARD TGUI_API Layout bindPosX(const std::shared_ptr<Widget>& widget);
476
478 TGUI_NODISCARD TGUI_API Layout bindPosY(const std::shared_ptr<Widget>& widget);
479
481 TGUI_NODISCARD TGUI_API Layout bindLeft(const std::shared_ptr<Widget>& widget);
482
484 TGUI_NODISCARD TGUI_API Layout bindTop(const std::shared_ptr<Widget>& widget);
485
487 TGUI_NODISCARD TGUI_API Layout bindWidth(const std::shared_ptr<Widget>& widget);
488
490 TGUI_NODISCARD TGUI_API Layout bindHeight(const std::shared_ptr<Widget>& widget);
491
493 TGUI_NODISCARD TGUI_API Layout bindInnerWidth(const std::shared_ptr<Container>& container);
494
496 TGUI_NODISCARD TGUI_API Layout bindInnerHeight(const std::shared_ptr<Container>& container);
497
499 TGUI_NODISCARD TGUI_API Layout bindRight(const std::shared_ptr<Widget>& widget);
500
502 TGUI_NODISCARD TGUI_API Layout bindBottom(const std::shared_ptr<Widget>& widget);
503
505 TGUI_NODISCARD TGUI_API Layout2d bindPosition(const std::shared_ptr<Widget>& widget);
506
508 TGUI_NODISCARD TGUI_API Layout2d bindSize(const std::shared_ptr<Widget>& widget);
509
511 TGUI_NODISCARD TGUI_API Layout2d bindInnerSize(const std::shared_ptr<Container>& container);
512
514 TGUI_NODISCARD TGUI_API Layout bindWidth(const BackendGui& gui);
515
517 TGUI_NODISCARD TGUI_API Layout bindHeight(const BackendGui& gui);
518
520 TGUI_NODISCARD TGUI_API Layout2d bindSize(const BackendGui& gui);
521
523 TGUI_NODISCARD TGUI_API Layout bindMin(const Layout& value1, const Layout& value2);
524
526 TGUI_NODISCARD TGUI_API Layout bindMax(const Layout& value1, const Layout& value2);
527 }
528
530}
531
533
534#endif // TGUI_LAYOUT_HPP
Base class for the Gui.
Definition BackendGui.hpp:47
Class to store the position or size of a widget.
Definition Layout.hpp:328
Layout2d(Vector2f constant={0, 0})
Default constructor to implicitly construct from a tgui::Vector2f.
Definition Layout.hpp:336
Layout2d(Layout layoutX, Layout layoutY)
Constructor to create the Layout2d from two Layout classes.
Definition Layout.hpp:349
Layout2d(const char *expression)
Constructs the Layout2d based on a string which will be parsed to determine the value of the layouts.
Definition Layout.hpp:363
TGUI_NODISCARD Vector2f getValue() const
Returns the cached value of the layout.
Definition Layout.hpp:389
Layout2d(const String &expression)
Constructs the Layout2d based on a string which will be parsed to determine the value of the layouts.
Definition Layout.hpp:377
Class to store the left, top, width or height of a widget.
Definition Layout.hpp:93
Layout(Layout &&other) noexcept
Move constructor.
Layout(String expression)
Constructs the layout based on a string which will be parsed to determine the value of the layout.
Operation
The operation which the layout has to perform to find its value.
Definition Layout.hpp:98
TGUI_NODISCARD float getValue() const
Return the cached value of the layout.
Definition Layout.hpp:211
Layout()=default
Default constructor.
Layout & operator=(Layout &&other) noexcept
Move assignment operator.
Layout(T constant)
Constructor to implicitly construct from numeric constant.
Definition Layout.hpp:133
Layout(const Layout &other)
Copy constructor.
~Layout()
Destructor.
void replaceValue(const Layout &value)
Replaces the value of the layout without overwriting its parent.
Layout(const char *expression)
Constructs the layout based on a string which will be parsed to determine the value of the layout.
Definition Layout.hpp:144
TGUI_NODISCARD bool isConstant() const
Return whether the layout stores a constant value.
Definition Layout.hpp:222
Layout & operator=(const Layout &other)
Copy assignment operator.
Wrapper class to store strings.
Definition String.hpp:101
The parent class for every widget.
Definition Widget.hpp:84
Namespace that contains all TGUI functions and classes.
Definition AbsoluteOrRelativeValue.hpp:39
TGUI_NODISCARD TGUI_API Layout bindLeft(const std::shared_ptr< Widget > &widget)
Bind to the left position of the widget.
TGUI_NODISCARD TGUI_API Layout bindRight(const std::shared_ptr< Widget > &widget)
Bind to the right position of the widget.
HorizontalAlignment
The horizontal alignment.
Definition Layout.hpp:52
@ Center
Center the object horizontally.
@ Right
Align to the right side.
@ Left
Align to the left side.
TGUI_NODISCARD TGUI_API Layout bindWidth(const std::shared_ptr< Widget > &widget)
Bind to the width of the widget.
TGUI_NODISCARD TGUI_API Layout bindMax(const Layout &value1, const Layout &value2)
Bind to the maximum value of two layouts.
TGUI_NODISCARD TGUI_API Layout bindHeight(const std::shared_ptr< Widget > &widget)
Bind to the height of the widget.
TGUI_NODISCARD TGUI_API Layout2d bindSize(const std::shared_ptr< Widget > &widget)
Bind to the size of the widget.
TGUI_NODISCARD TGUI_API Layout bindTop(const std::shared_ptr< Widget > &widget)
Bind to the top position of the widget.
TGUI_NODISCARD TGUI_API Layout bindInnerWidth(const std::shared_ptr< Container > &container)
Bind to the inner width of the container widget.
TGUI_NODISCARD TGUI_API Layout2d bindPosition(const std::shared_ptr< Widget > &widget)
Bind to the position of the widget.
AutoLayout
Alignments for how to position a widget in its parent.
Definition Layout.hpp:76
@ Leftmost
Places the widget on the left side and sets height to 100%. Width needs to be manually set....
@ Rightmost
Places the widget on the right side and sets height to 100%. Width needs to be manually set....
@ Fill
Sets the position and size to fill the entire area that isn't already taken by components with the ot...
@ Manual
Position and size need to be manually set. This is the default.
TGUI_NODISCARD TGUI_API Layout bindPosX(const std::shared_ptr< Widget > &widget)
Bind to the x position of the widget (same as bindLeft unless widget origin is changed)
TGUI_NODISCARD TGUI_API Layout bindBottom(const std::shared_ptr< Widget > &widget)
Bind to the bottom of the widget.
TGUI_NODISCARD TGUI_API Layout bindMin(const Layout &value1, const Layout &value2)
Bind to the minimum value of two layouts.
TGUI_NODISCARD TGUI_API Layout bindPosY(const std::shared_ptr< Widget > &widget)
Bind to the y position of the widget (same as bindTop unless widget origin is changed)
TGUI_NODISCARD TGUI_API Layout2d bindInnerSize(const std::shared_ptr< Container > &container)
Bind to the inner size of the container widget.
VerticalAlignment
The vertical alignment.
Definition Layout.hpp:64
@ Bottom
Align to the bottom.
@ Top
Align to the top.
TGUI_NODISCARD TGUI_API Layout bindInnerHeight(const std::shared_ptr< Container > &container)
Bind to the inner height of the container widget.