OpenBarnyard
 
Loading...
Searching...
No Matches
AAudioOptionsState.cpp
Go to the documentation of this file.
1#include "pch.h"
4#include "SoundBank/ui.h"
8#include "GUI/AGUI2.h"
9
10//-----------------------------------------------------------------------------
11// Enables memory debugging.
12// Note: Should be the last include!
13//-----------------------------------------------------------------------------
14#include <Core/TMemoryDebugOn.h>
15
17
19
23
27
28TBOOL AAudioOptionsState::ProcessInput( const Toshi::TInputInterface::InputEvent* a_pInputEvent )
29{
30 TIMPLEMENT();
31
33 {
34 if ( m_oGridMenu.ProcessInputEvent( a_pInputEvent ) )
35 return TTRUE;
36 }
37
38 return BaseClass::ProcessInput( a_pInputEvent );
39}
40
41TBOOL AAudioOptionsState::ProcessCommand( AInputCommand a_eInputCommand, const Toshi::TInputInterface::InputEvent* a_pInputEvent, TBOOL& a_rStopEvents )
42{
43 TIMPLEMENT();
44
46 {
47 if ( a_eInputCommand == AInputCommand_Cancel )
48 {
49 ASoundManager::GetSingleton()->PlayCue( soundbank::UI_MENUBACK );
51 m_iFocusedItemId = -1;
52 return TTRUE;
53 }
54 else if ( a_eInputCommand == AInputCommand_Left )
55 {
56 a_pInputEvent->StartRepeat();
57 return TTRUE;
58 }
59 else if ( a_eInputCommand == AInputCommand_Right )
60 {
61 a_pInputEvent->StartRepeat();
62 return TTRUE;
63 }
64
65 if ( m_oGridMenu.ProcessInputCommand( a_eInputCommand, a_pInputEvent ) )
66 return TTRUE;
67 }
68
69 return BaseClass::ProcessCommand( a_eInputCommand, a_pInputEvent, a_rStopEvents );
70}
71
73{
74 TIMPLEMENT();
75
77
78 m_oGridMenu.CreateGrid( AUDIOOPTIONS_NUMOF, 2, 40.0f, 20.0f );
79 m_oGridMenu.SetCallbackUserData( this );
80 m_oGridMenu.SetFocusSound( soundbank::UI_MENUCLICK );
81 m_oGridMenu.SetBackSound( soundbank::UI_MENUBACK );
82 m_oGridMenu.SetSelectSound( soundbank::UI_MENUOK );
83 m_oGridMenu.BlockActivation( TTRUE );
84
85 m_oGridMenu.SetItemActivationCallback( []( void* a_pUserData, AGUI2MenuGridItem* a_pItem ) {
86 TSTATICCAST( AAudioOptionsState, a_pUserData )->m_eMenuState = MENUSTATE_MENU_DISAPPEAR;
87 } );
88 m_oGridMenu.SetItemFocusCallback( []( void* a_pUserData, AGUI2MenuGridItem* a_pOldFocus, AGUI2MenuGridItem* a_pNewFocus ) {
89 TSTATICCAST( AAudioOptionsState, a_pUserData )->OnMenuGridItemFocused( *a_pOldFocus, *a_pNewFocus );
90 } );
91
92 // Create sliders
93 for ( TINT i = 0; i < AUDIOOPTIONS_NUMOF; i++ )
94 {
95 // Initialise label
96 const TWCHAR* wszText = ALocaleManager::GetSingleton()->GetString( AUDIOOPTIONS_TEXTS[ i ] );
97
98 m_aTextItems[ i ].Create( pFont, pFont->GetTextWidth( wszText ), wszText, 10.0f );
99 m_aTextItems[ i ].SetFocusedColour( AGUI2STYLE_COLOR_FOCUSED );
100 m_aTextItems[ i ].SetEnabledColour( AGUI2STYLE_COLOR_SECONDARY );
101 m_aTextItems[ i ].SetDisabledColour( AGUI2STYLE_COLOR_DISABLED );
102 m_aTextItems[ i ].SetFocusedScale( 1.0f );
103 m_aTextItems[ i ].OnFocusLost();
104 m_aTextItems[ i ].SetId( i );
105 m_aTextItems[ i ].SetTextShadow( TTRUE, 0xa0000000, 0.6f );
106 m_aTextItems[ i ].SetTextShadowOffset( 5.0f );
107 m_oGridMenu.AddMenuGridItem( m_aTextItems[ i ] );
108
109 // Initialise slider
110 m_aVolumeSliders[ i ].Create( "left_arrow", "left_arrow2", "Statue_GoldStar" );
111 m_aVolumeSliders[ i ].SetEnabled( TFALSE );
112 m_aVolumeSliders[ i ].SetId( i );
113 m_aVolumeSliders[ i ].SetCallbackUserData( this );
114 m_aVolumeSliders[ i ].SetArrowFocusedCallback( []( void* a_pUserData, TINT a_iSliderID ) {
115 AAudioOptionsState* pState = TSTATICCAST( AAudioOptionsState, a_pUserData );
116 pState->m_oGridMenu.SetFocusAt( &pState->m_aTextItems[ a_iSliderID ] );
117 pState->m_iFocusedItemId = a_iSliderID;
118 } );
119 m_oGridMenu.AddMenuGridItem( m_aVolumeSliders[ i ] );
120 }
121
122 // Update side elements
123 m_aTextItems[ AUDIOOPTIONS_EFFECTS ].SetSideElements( TNULL, TNULL, &m_aTextItems[ AUDIOOPTIONS_SPEECH ], &m_aTextItems[ AUDIOOPTIONS_MUSIC ] );
124 m_aTextItems[ AUDIOOPTIONS_MUSIC ].SetSideElements( TNULL, TNULL, &m_aTextItems[ AUDIOOPTIONS_EFFECTS ], &m_aTextItems[ AUDIOOPTIONS_SPEECH ] );
125 m_aTextItems[ AUDIOOPTIONS_SPEECH ].SetSideElements( TNULL, TNULL, &m_aTextItems[ AUDIOOPTIONS_MUSIC ], &m_aTextItems[ AUDIOOPTIONS_EFFECTS ] );
126
127 m_oGridMenu.ReflowChildren();
128
129 // Center text elements
130 for ( TINT i = 0; i < AUDIOOPTIONS_NUMOF; i++ )
131 {
132 m_aTextItems[ i ].SetTransform(
133 m_aTextItems[ i ].GetWidth() * 0.5f + m_aTextItems[ i ].GetTransform().GetTranslation().x,
134 m_aTextItems[ i ].GetTransform().GetTranslation().y
135 );
136
137 m_aTextItems[ i ].SetAttachment( AGUI2ATTACHMENT_TOPLEFT, AGUI2ATTACHMENT_TOPCENTER );
138 }
139
140 // ...
141 m_oDialog.AddChildTail( m_oGridMenu );
142 m_oGridMenu.SetFocusAt( &m_aTextItems[ 0 ] );
143
144 m_oDialogTitle.SetText( ALocaleManager::GetSingleton()->GetString( 302 ) );
146
148
149 m_oDialog.SetDimensions( m_oGridMenu.GetWidth() + 128.0f, m_oGridMenu.GetHeight() + 150.0f );
150}
151
153{
154 TIMPLEMENT();
155 for ( TINT i = 0; i < AUDIOOPTIONS_NUMOF; i++ )
156 {
157 m_aTextItems[ i ].RemoveSelf();
158 }
159
160 m_oGridMenu.RemoveSelf();
162}
163
165{
166 ASoundManager::GetSingleton()->PlayCue( soundbank::UI_MENUOK );
168}
169
171{
172 TIMPLEMENT();
173}
174
181
183{
184 TIMPLEMENT();
185 m_iFocusedItemId = -1;
186}
187
189{
190 m_bMouseDirty = TFALSE;
191 m_iLastPressedArrowIndex = -1;
192}
193
197
198TBOOL AVolumeSlider::Create( const TCHAR* a_szLeftArrow, const TCHAR* a_szRightArrow, const TCHAR* a_szBarIcon )
199{
200 // Setup left arrow
202 TVALIDPTR( pLeftArrow );
203
204 m_aArrows[ 0 ].SetDimensions( pLeftArrow->GetWidth(), pLeftArrow->GetHeight() );
205 m_aArrows[ 0 ].SetTextureSection( pLeftArrow );
206 m_aArrows[ 0 ].SetTransform( 0.0f, 0.0f );
207 m_aArrows[ 0 ].SetAttachment( AGUI2ATTACHMENT_MIDDLELEFT, AGUI2ATTACHMENT_MIDDLELEFT );
208 AddChildTail( m_aArrows[ 0 ] );
209
210 // Setup bar icons
212 TVALIDPTR( pBarIcon );
213
214 TFLOAT fBarWidth = pBarIcon->GetWidth();
215 TFLOAT fBarHeight = pBarIcon->GetHeight();
216 TFLOAT fBarX = pLeftArrow->GetWidth();
217
218 for ( TINT i = 0; i < TARRAYSIZE( m_aBars ); i++ )
219 {
220 m_aBars[ i ].SetDimensions( fBarWidth, fBarHeight );
221 m_aBars[ i ].SetTextureSection( pBarIcon );
222 m_aBars[ i ].SetTransform( fBarX, 0.0f );
223 m_aBars[ i ].GetTransform().Scale( ms_fBarScale, ms_fBarScale );
224 m_aBars[ i ].SetAttachment( AGUI2ATTACHMENT_MIDDLELEFT, AGUI2ATTACHMENT_MIDDLELEFT );
225 AddChildTail( m_aBars[ i ] );
226
227 fBarX += ms_fBarScale * fBarWidth;
228 }
229
230 // Setup right arrow
232 TVALIDPTR( pRightArrow );
233
234 m_aArrows[ 1 ].SetDimensions( pRightArrow->GetWidth(), pRightArrow->GetHeight() );
235 m_aArrows[ 1 ].SetTextureSection( pRightArrow );
236 m_aArrows[ 1 ].SetTransform( fBarX, 0.0f );
237 m_aArrows[ 1 ].SetAttachment( AGUI2ATTACHMENT_MIDDLELEFT, AGUI2ATTACHMENT_MIDDLELEFT );
238 AddChildTail( m_aArrows[ 1 ] );
239
240 SetDimensions( fBarX + pRightArrow->GetWidth(), m_aBars[ 0 ].GetHeight() * ms_fBarScale );
241 return TTRUE;
242}
243
244void AVolumeSlider::OnUpdate( TFLOAT a_fDeltaTime )
245{
246 if ( m_bMouseDirty )
247 {
248 // Check if any of the arrow rectangles was pressed
249 m_iLastPressedArrowIndex = -1;
250 AGUI2Transform oElementInvTransform;
251
253
254 for ( TINT i = 0; i < TARRAYSIZE( m_aArrows ); i++ )
255 {
256 // Get inverse transform of the current UI element
257 m_aArrows[ i ].GetInvScreenTransform( oElementInvTransform );
258
259 // Get cursor position that is relative to the UI element
260 TVector2 vecElementRelCursorPos;
261 oElementInvTransform.Transform( vecElementRelCursorPos, vecCursorPos );
262
263 if ( m_aArrows[ i ].IsPointInside( vecElementRelCursorPos.x, vecElementRelCursorPos.y ) )
264 {
265 TVALIDPTR( m_fnArrowFocusCallback );
266 m_fnArrowFocusCallback( m_pCallbackUserData, m_iID );
267 m_iLastPressedArrowIndex = i;
268 }
269 }
270
271 m_bMouseDirty = TFALSE;
272 }
273}
#define TIMPLEMENT()
Definition Defines.h:136
#define TSTATICCAST(POINTERTYPE, VALUE)
Definition Defines.h:69
#define TOSHI_NAMESPACE_USING
Definition Defines.h:46
#define TARRAYSIZE(ARRAY)
Definition Defines.h:70
#define TVALIDPTR(PTR)
Definition Defines.h:139
#define TDEFINE_CLASS(...)
Definition TObject.h:120
wchar_t TWCHAR
Definition Typedefs.h:21
char TCHAR
Definition Typedefs.h:20
float TFLOAT
Definition Typedefs.h:4
#define TNULL
Definition Typedefs.h:23
int TINT
Definition Typedefs.h:7
#define TFALSE
Definition Typedefs.h:24
#define TTRUE
Definition Typedefs.h:25
bool TBOOL
Definition Typedefs.h:6
@ AGUI2ATTACHMENT_TOPLEFT
@ AGUI2ATTACHMENT_MIDDLELEFT
@ AGUI2ATTACHMENT_TOPCENTER
#define AGUI2STYLE_COLOR_FOCUSED
Definition AGUI2Style.h:10
#define AGUI2STYLE_COLOR_SECONDARY
Definition AGUI2Style.h:9
#define AGUI2STYLE_FONT_PRIMARY
Definition AGUI2Style.h:4
#define AGUI2STYLE_COLOR_DISABLED
Definition AGUI2Style.h:11
AInputCommand
Definition AInputMap.h:12
@ AInputCommand_Right
Definition AInputMap.h:34
@ AInputCommand_Left
Definition AInputMap.h:33
@ AInputCommand_Cancel
Definition AInputMap.h:16
@ UI_MENUCLICK
Definition ui.h:28
@ UI_MENUOK
Definition ui.h:34
@ UI_MENUBACK
Definition ui.h:31
TFLOAT y
Definition TVector2.h:139
TFLOAT x
Definition TVector2.h:139
TBOOL Create(const TCHAR *a_szLeftArrow, const TCHAR *a_szRightArrow, const TCHAR *a_szBarIcon)
virtual void OnUpdate(TFLOAT a_fDeltaTime) override
virtual void OnInsertion() override
virtual void OnMenuClose() override
virtual TBOOL ProcessInput(const Toshi::TInputInterface::InputEvent *a_pInputEvent) override
virtual void OnMenuItemFocused(AGUI2MenuItem &a_rOldFocus, AGUI2MenuItem &a_rNewFocus) override
virtual TBOOL ProcessCommand(AInputCommand a_eInputCommand, const Toshi::TInputInterface::InputEvent *a_pInputEvent, TBOOL &a_rStopEvents) override
virtual void OnMenuItemActivated(AGUI2MenuItem &a_rMenuItem) override
virtual void OnMenuGridItemFocused(AGUI2MenuGridItem &a_rOldFocus, AGUI2MenuGridItem &a_rNewFocus)
static constexpr TINT AUDIOOPTIONS_TEXTS[AUDIOOPTIONS_NUMOF]
virtual void OnRemoval() override
TBOOL m_bFocusedElementBloated
AGUI2TextBox m_oDialogTitle
virtual void OnRemoval() override
virtual TBOOL ProcessCommand(AInputCommand a_eInputCommand, const Toshi::TInputInterface::InputEvent *a_pInputEvent, TBOOL &a_rStopEvents) override
void OnButtonActivated(AGUI2Button *a_pButton)
MENUSTATE m_eMenuState
AGUI2Dialog m_oDialog
virtual TBOOL ProcessInput(const Toshi::TInputInterface::InputEvent *a_pInputEvent) override
virtual void OnInsertion() override
void Remove()
static AGUI2MouseCursor & GetMouseCursor()
Definition AGUI2.h:30
void AddChildTail(AGUI2Element &a_rElement)
virtual TBOOL IsPointInside(TFLOAT a_fX, TFLOAT a_fY)
virtual void SetDimensions(TFLOAT a_fWidth, TFLOAT a_fHeight)
TFLOAT GetTextWidth(const TWCHAR *a_wszText, TFLOAT a_fScale=1.0f)
static AGUI2Font * FindFont(const TCHAR *a_szFontName)
void SetFocusAt(AGUI2MenuGridItem *a_pMenuItem)
const Toshi::TVector2 & GetCursorPos() const
static AGUI2TextureSection * GetTextureSection(const TCHAR *a_szSectionName)
void Transform(Toshi::TVector2 &a_rOutVec, const Toshi::TVector2 &a_rTransformVec) const