1 | //************************************ bs::framework - Copyright 2018 Marko Pintera **************************************// |
2 | //*********** Licensed under the MIT license. See LICENSE.md for full terms. This notice is not to be removed. ***********// |
3 | #pragma once |
4 | |
5 | #include "BsPrerequisites.h" |
6 | #include "GUI/BsGUIElementBase.h" |
7 | #include "Math/BsVector2I.h" |
8 | |
9 | namespace bs |
10 | { |
11 | /** @addtogroup Implementation |
12 | * @{ |
13 | */ |
14 | |
15 | /** |
16 | * Base class for layout GUI element. Layout element positions and sizes any child elements according to element styles |
17 | * and layout options. |
18 | */ |
19 | class BS_EXPORT GUILayout : public GUIElementBase |
20 | { |
21 | public: |
22 | GUILayout(const GUIDimensions& dimensions); |
23 | GUILayout(); |
24 | virtual ~GUILayout(); |
25 | |
26 | /** Creates a new element and adds it to the layout after all existing elements. */ |
27 | template<class Type, class... Args> |
28 | Type* addNewElement(Args &&...args) |
29 | { |
30 | Type* elem = Type::create(std::forward<Args>(args)...); |
31 | addElement(elem); |
32 | return elem; |
33 | } |
34 | |
35 | /** Creates a new element and inserts it before the element at the specified index. */ |
36 | template<class Type, class... Args> |
37 | Type* insertNewElement(UINT32 idx, Args &&...args) |
38 | { |
39 | Type* elem = Type::create(std::forward<Args>(args)...); |
40 | insertElement(idx, elem); |
41 | return elem; |
42 | } |
43 | |
44 | /** Adds a new element to the layout after all existing elements. */ |
45 | void addElement(GUIElementBase* element); |
46 | |
47 | /** Removes the specified element from the layout. */ |
48 | void removeElement(GUIElementBase* element); |
49 | |
50 | /** Removes a child element at the specified index. */ |
51 | void removeElementAt(UINT32 idx); |
52 | |
53 | /** Inserts a GUI element before the element at the specified index. */ |
54 | void insertElement(UINT32 idx, GUIElementBase* element); |
55 | |
56 | /** Removes all child elements and destroys them. */ |
57 | void clear(); |
58 | |
59 | /** Returns number of child elements in the layout. */ |
60 | UINT32 getNumChildren() const { return (UINT32)mChildren.size(); } |
61 | |
62 | /** Destroy the layout. Removes it from parent and widget, and deletes it. */ |
63 | static void destroy(GUILayout* layout); |
64 | |
65 | public: // ***** INTERNAL ****** |
66 | /** @name Internal |
67 | * @{ |
68 | */ |
69 | |
70 | /** @copydoc GUIElementBase::_getLayoutSizeRange */ |
71 | LayoutSizeRange _getLayoutSizeRange() const override { return _getCachedSizeRange(); } |
72 | |
73 | /** Returns a size range that was cached during the last GUIElementBase::_updateOptimalLayoutSizes call. */ |
74 | LayoutSizeRange _getCachedSizeRange() const { return mSizeRange; } |
75 | |
76 | /** |
77 | * Returns a size ranges for all children that was cached during the last GUIElementBase::_updateOptimalLayoutSizes |
78 | * call. |
79 | */ |
80 | const Vector<LayoutSizeRange>& _getCachedChildSizeRanges() const { return mChildSizeRanges; } |
81 | |
82 | /** @copydoc GUIElementBase::_getOptimalSize */ |
83 | Vector2I _getOptimalSize() const override { return mSizeRange.optimal; } |
84 | |
85 | /** @copydoc GUIElementBase::_getPadding */ |
86 | const RectOffset& _getPadding() const override; |
87 | |
88 | /** @copydoc GUIElementBase::_getType */ |
89 | Type _getType() const override { return GUIElementBase::Type::Layout; } |
90 | |
91 | /** @} */ |
92 | |
93 | protected: |
94 | Vector<LayoutSizeRange> mChildSizeRanges; |
95 | LayoutSizeRange mSizeRange; |
96 | }; |
97 | |
98 | /** @} */ |
99 | } |