OpenBarnyard
 
Loading...
Searching...
No Matches
AGUI2Element.h
Go to the documentation of this file.
1#pragma once
2#include "AGUI2Style.h"
3#include "AGUI2Transform.h"
4
5#include <Toshi/Typedefs.h>
6#include <Math/TVector2.h>
7
8#include <Toshi/T2DList.h>
9
10class AGUI2Element;
11
13{
14public:
16
17public:
19 {
20 m_pNext = this;
21 m_pPrev = this;
22 }
23
25 {
26 Unlink();
27 }
28
29 void Unlink()
30 {
31 m_pNext->m_pPrev = m_pPrev;
32 m_pPrev->m_pNext = m_pNext;
33 m_pNext = this;
34 m_pPrev = this;
35 }
36
37 // Sets a_rNode to be next after this
38 void LinkAfter( AGUI2ElementNode& a_rNode )
39 {
40 m_pNext = &a_rNode;
41 m_pPrev = a_rNode.m_pPrev;
42 a_rNode.m_pPrev = this;
43 m_pPrev->m_pNext = this;
44 }
45
46 // Sets a_rNode to be previous to this
48 {
49 m_pNext = a_rNode.m_pNext;
50 m_pPrev = &a_rNode;
51 a_rNode.m_pNext->m_pPrev = this;
52 a_rNode.m_pNext = this;
53 }
54
55 TBOOL IsLinked() const { return this != m_pNext; }
56 AGUI2ElementNode* GetNext() const { return m_pNext; }
57 AGUI2ElementNode* GetPrev() const { return m_pPrev; }
58
59protected:
62};
63
77
79{
80public:
81 using t_PostRender = void ( * )();
82
83public:
85 virtual ~AGUI2Element() = default;
86
87 virtual void Tick( TFLOAT a_fDeltaTime );
88 virtual void PreRender();
89 virtual void Render();
90 virtual void PostRender();
91 virtual void GetDimensions( TFLOAT& a_rWidth, TFLOAT& a_rHeight );
92 virtual TFLOAT GetWidth();
93 virtual TFLOAT GetHeight();
94 virtual void SetWidth( TFLOAT a_fWidth );
95 virtual void SetHeight( TFLOAT a_fHeight );
96 virtual void SetDimensions( TFLOAT a_fWidth, TFLOAT a_fHeight );
97 virtual void GetMins( TFLOAT& a_fX, TFLOAT& a_fY );
98 virtual void GetMaxs( TFLOAT& a_fX, TFLOAT& a_fY );
99 virtual void SetColour( TUINT32 a_uiColour );
100 virtual void SetAlpha( TFLOAT a_fAlpha );
101 virtual void SetShadowAlpha( TFLOAT a_fAlpha );
102 virtual void SetFocus( TBOOL a_bFocused );
103 virtual TBOOL IsPointInside( TFLOAT a_fX, TFLOAT a_fY );
104
105 void AnchorPos( TFLOAT& a_rX, TFLOAT& a_rY, TFLOAT a_fWidth, TFLOAT a_fHeight );
106 void PivotPos( TFLOAT& a_rX, TFLOAT& a_rY, TFLOAT a_fWidth, TFLOAT a_fHeight );
107
108 void GetScreenTransform( AGUI2Transform& a_rOutTransform );
109 void GetInvScreenTransform( AGUI2Transform& a_rOutTransform );
110
111 void Show()
112 {
113 m_eFlags |= 1;
114 }
115
116 void Hide()
117 {
118 m_eFlags &= ~1;
119 }
120
122 {
123 m_eFlags |= 16;
124 }
125
127 {
128 m_eFlags |= 8;
129 }
130
131 TBOOL HasFlags( TUINT32 a_uiFlags ) const
132 {
133 return ( m_eFlags & a_uiFlags ) == m_eFlags;
134 }
135
137 {
138 return ( m_eFlags & 1 ) && ( m_uiVisibilityMask & s_uiVisibilityMask ) != 0;
139 }
140
142 {
143 return m_eFlags & 2;
144 }
145
147 {
148 return m_eFlags & 8;
149 }
150
152 {
153 return m_eFlags & 16;
154 }
155
157 {
158 return ( ( m_uiColour & 0xFF000000 ) >> 24 ) * ( 1.0f / 255.0f );
159 }
160
161 void AddChildTail( AGUI2Element& a_rElement )
162 {
163 a_rElement.Unlink();
164 a_rElement.m_pParent = this;
165 a_rElement.LinkBefore( m_Children );
166 }
167
168 void AddChildHead( AGUI2Element& a_rElement )
169 {
170 a_rElement.Unlink();
171 a_rElement.m_pParent = this;
172 a_rElement.LinkAfter( m_Children );
173 }
174
175 void SetTranslation( TFLOAT a_fX, TFLOAT a_fY )
176 {
177 m_oTransform.SetTranslation( a_fX, a_fY );
178 }
179
180 void SetTranslation( const Toshi::TVector2& a_rTranslation )
181 {
182 m_oTransform.SetTranslation( a_rTranslation );
183 }
184
185 void SetTransform( TFLOAT a_fX, TFLOAT a_fY, float a_fRotAngle = 0.0f )
186 {
188 m_oTransform.Rotate( a_fRotAngle );
189 m_oTransform.SetTranslation( a_fX, a_fY );
190 }
191
192 void SetAnchor( AGUI2ATTACHMENT a_eAnchor )
193 {
194 m_eAnchor = a_eAnchor;
195 }
196
197 void SetPivot( AGUI2ATTACHMENT a_ePivot )
198 {
199 m_ePivot = a_ePivot;
200 }
201
203 {
204 m_eAnchor = a_eAnchor;
205 m_ePivot = a_ePivot;
206 }
207
209 {
210 return std::exchange( m_cbPostRender, a_cbNewCallback );
211 }
212
214 {
215 return m_oTransform;
216 }
217
218 // Returns first children or TNULL
220 {
221 return ( m_Children.IsLinked() ) ? (AGUI2Element*)m_Children.GetNext() : TNULL;
222 }
223
224 // Returns last children or TNULL
226 {
227 return ( m_Children.IsLinked() ) ? (AGUI2Element*)m_Children.GetPrev() : TNULL;
228 }
229
230 // Returns next children or TNULL
232 {
233 if ( a_pCurrentChild->GetNext() == &m_Children || a_pCurrentChild->GetNext() == a_pCurrentChild )
234 return TNULL;
235
236 return (AGUI2Element*)a_pCurrentChild->GetNext();
237 }
238
239 // Returns previous children or TNULL
241 {
242 if ( a_pCurrentChild->GetPrev() == &m_Children || a_pCurrentChild->GetPrev() == a_pCurrentChild )
243 return TNULL;
244
245 return (AGUI2Element*)a_pCurrentChild->GetPrev();
246 }
247
249 {
252 }
253
254 void LinkChildBefore( AGUI2Element& a_rNewChildren, AGUI2Element& a_rInsertAfter )
255 {
256 a_rNewChildren.LinkBefore( a_rInsertAfter );
257 }
258
259public:
260 inline static TUINT32 s_uiVisibilityMask = 0xFFFFFFFF;
261
262protected:
274};
float TFLOAT
Definition Typedefs.h:4
#define TNULL
Definition Typedefs.h:23
uint32_t TUINT32
Definition Typedefs.h:13
bool TBOOL
Definition Typedefs.h:6
AGUI2ATTACHMENT
@ AGUI2ATTACHMENT_TOPLEFT
@ AGUI2ATTACHMENT_MIDDLELEFT
@ AGUI2ATTACHMENT_MIDDLECENTER
@ AGUI2ATTACHMENT_BOTTOMLEFT
@ AGUI2ATTACHMENT_MIDDLERIGHT
@ AGUI2ATTACHMENT_BOTTOMRIGHT
@ AGUI2ATTACHMENT_NUMOF
@ AGUI2ATTACHMENT_TOPRIGHT
@ AGUI2ATTACHMENT_BOTTOMCENTER
@ AGUI2ATTACHMENT_TOPCENTER
TBOOL IsLinked() const
AGUI2ElementNode * m_pNext
AGUI2ElementNode * GetNext() const
virtual ~AGUI2ElementNode()
AGUI2ElementNode * GetPrev() const
void LinkAfter(AGUI2ElementNode &a_rNode)
void LinkBefore(AGUI2ElementNode &a_rNode)
AGUI2ElementNode * m_pPrev
void SetInFront()
AGUI2Transform & GetTransform()
void SetTranslation(TFLOAT a_fX, TFLOAT a_fY)
TUINT32 m_uiVisibilityMask
void SetPivot(AGUI2ATTACHMENT a_ePivot)
virtual void Render()
void SetTransform(TFLOAT a_fX, TFLOAT a_fY, float a_fRotAngle=0.0f)
void AnchorPos(TFLOAT &a_rX, TFLOAT &a_rY, TFLOAT a_fWidth, TFLOAT a_fHeight)
void AddChildTail(AGUI2Element &a_rElement)
TBOOL HasFlags(TUINT32 a_uiFlags) const
TBOOL IsVisible() const
TUINT32 m_eFlags
TUINT32 m_uiColour
virtual void GetMaxs(TFLOAT &a_fX, TFLOAT &a_fY)
void SetAnchor(AGUI2ATTACHMENT a_eAnchor)
void(*)() t_PostRender
virtual void SetWidth(TFLOAT a_fWidth)
void SetAttachment(AGUI2ATTACHMENT a_eAnchor, AGUI2ATTACHMENT a_ePivot)
AGUI2ATTACHMENT m_eAnchor
AGUI2Transform m_oTransform
AGUI2ElementNode m_Children
TBOOL ShouldRenderBeforeChildren()
virtual ~AGUI2Element()=default
void PivotPos(TFLOAT &a_rX, TFLOAT &a_rY, TFLOAT a_fWidth, TFLOAT a_fHeight)
virtual void GetMins(TFLOAT &a_fX, TFLOAT &a_fY)
virtual TFLOAT GetHeight()
TFLOAT GetAlpha() const
virtual TFLOAT GetWidth()
TBOOL IsFocused() const
virtual void PreRender()
AGUI2Element * GetNextChild(AGUI2Element *a_pCurrentChild)
virtual void GetDimensions(TFLOAT &a_rWidth, TFLOAT &a_rHeight)
void GetScreenTransform(AGUI2Transform &a_rOutTransform)
void RemoveSelf()
t_PostRender SetPostRenderCallback(t_PostRender a_cbNewCallback)
AGUI2Element * GetPrevChild(AGUI2Element *a_pCurrentChild)
virtual void PostRender()
virtual void SetColour(TUINT32 a_uiColour)
AGUI2Element * ChildBegin() const
virtual void Tick(TFLOAT a_fDeltaTime)
void SetRenderBeforeChildren()
static TUINT32 s_uiVisibilityMask
virtual void SetShadowAlpha(TFLOAT a_fAlpha)
void SetTranslation(const Toshi::TVector2 &a_rTranslation)
t_PostRender m_cbPostRender
AGUI2Element * m_pParent
TBOOL IsInFront() const
void LinkChildBefore(AGUI2Element &a_rNewChildren, AGUI2Element &a_rInsertAfter)
void GetInvScreenTransform(AGUI2Transform &a_rOutTransform)
AGUI2ATTACHMENT m_ePivot
AGUI2Element * ChildRBegin() const
virtual TBOOL IsPointInside(TFLOAT a_fX, TFLOAT a_fY)
virtual void SetDimensions(TFLOAT a_fWidth, TFLOAT a_fHeight)
virtual void SetHeight(TFLOAT a_fHeight)
void AddChildHead(AGUI2Element &a_rElement)
virtual void SetFocus(TBOOL a_bFocused)
virtual void SetAlpha(TFLOAT a_fAlpha)