14#define EAT_ALL_INPUT_EVENTS TFALSE
20 m_fItemSpacing = 0.0f;
21 m_pDefaultFocusElement =
TNULL;
22 m_pCancelItem =
TNULL;
23 m_pLastMenuItem =
TNULL;
24 m_pFocusedMenuItem =
TNULL;
32 m_fnActivateCallback =
TNULL;
33 m_fnFocusCallback =
TNULL;
34 m_pCallbackUserData =
TNULL;
36 m_bHorizontalFlow =
TFALSE;
38 m_bMouseStateDirty =
TFALSE;
39 m_pHoveredMenuItem =
TNULL;
50 if ( m_bMouseStateDirty )
54 if ( m_pLastMenuItem !=
TNULL )
57 m_pHoveredMenuItem =
TNULL;
70 oElementInvTransform.
Transform( vecElementRelCursorPos, vecCursorPos );
72 if ( pItem->
IsPointInside( vecElementRelCursorPos.
x, vecElementRelCursorPos.
y ) )
74 if ( m_pFocusedMenuItem != pItem )
77 ASoundManager::GetSingleton()->PlayCue( m_eFocusSound );
80 m_pHoveredMenuItem = pItem;
85 pItem = pItem->m_pPrevMenuItem;
86 if ( pItem == m_pLastMenuItem )
break;
90 m_bMouseStateDirty =
TFALSE;
93 if ( m_pLastMenuItem !=
TNULL )
104 pItem = pItem->m_pPrevMenuItem;
105 if ( pItem == m_pLastMenuItem )
break;
109 m_fTime += a_fDeltaTime;
138 switch ( a_eCommand )
150 a_pEvent->StartRepeat( 0.5f, 0.1f );
155 a_pEvent->StartRepeat( 0.5f, 0.1f );
159 a_pEvent->StartRepeat( 0.5f, 0.1f );
163 a_pEvent->StartRepeat( 0.5f, 0.1f );
171 if ( m_pFocusedMenuItem )
180 ASoundManager::GetSingleton()->PlayCue( m_eBackSound );
183 if ( m_fnActivateCallback )
184 m_fnActivateCallback( m_pCallbackUserData, m_pCancelItem );
189 ASoundManager::GetSingleton()->PlayCue( m_eNegativeSound );
194 ActivateFocusedButton();
204 AGUI2MenuItem* pNewFocused = m_pFocusedMenuItem->m_pNextMenuItem;
207 while ( pNewFocused->m_pNextMenuItem && !pNewFocused->
CanFocus() )
208 pNewFocused = pNewFocused->m_pNextMenuItem;
210 if ( pNewFocused != m_pFocusedMenuItem )
214 ASoundManager::GetSingleton()->PlayCue( m_eFocusSound );
216 if ( m_fnFocusCallback )
217 m_fnFocusCallback( m_pCallbackUserData, m_pFocusedMenuItem, pNewFocused );
226 AGUI2MenuItem* pNewFocused = m_pFocusedMenuItem->m_pPrevMenuItem;
229 while ( pNewFocused->m_pPrevMenuItem && !pNewFocused->
CanFocus() )
230 pNewFocused = pNewFocused->m_pPrevMenuItem;
232 if ( pNewFocused != m_pFocusedMenuItem )
236 ASoundManager::GetSingleton()->PlayCue( m_eFocusSound );
238 if ( m_fnFocusCallback )
239 m_fnFocusCallback( m_pCallbackUserData, m_pFocusedMenuItem, pNewFocused );
254 if ( m_pLastMenuItem )
257 m_pLastMenuItem = &a_rMenuItem;
267 if ( m_pFocusedMenuItem )
268 m_pFocusedMenuItem->OnFocusLost();
270 m_pFocusedMenuItem = &a_rMenuItem;
289 TFLOAT fItemWidth, fItemHeight;
297 fOffsetY = fItemHeight * 0.5f + pMenuItem->
GetFlowOffset() + fItemPosY + m_fItemSpacing;
300 pMenuItem = pMenuItem->m_pPrevMenuItem;
301 if ( pMenuItem == m_pLastMenuItem )
break;
312 if ( m_pFocusedMenuItem )
315 m_bHorizontalFlow =
TFALSE;
326 ActivateFocusedButton();
335 if ( m_pLastMenuItem !=
TNULL )
344 pItem->
SetShadowAlpha( ( a_fShadowAlpha == -1.0f ) ? a_fAlpha : a_fShadowAlpha );
347 pItem = pItem->m_pPrevMenuItem;
348 if ( pItem == m_pLastMenuItem )
break;
355void AGUI2Menu::ActivateFocusedButton()
357 if ( m_fnActivateCallback && m_pFocusedMenuItem )
360 ASoundManager::GetSingleton()->PlayCue( m_eSelectSound );
362 if ( m_fnActivateCallback )
363 m_fnActivateCallback( m_pCallbackUserData, m_pFocusedMenuItem );
#define TOSHI_NAMESPACE_USING
@ AGUI2ATTACHMENT_MIDDLECENTER
@ AGUI2ATTACHMENT_TOPCENTER
#define EAT_ALL_INPUT_EVENTS
TFORCEINLINE const T & Max(const T &a, const T &b)
static AGUI2MouseCursor & GetMouseCursor()
AGUI2Transform & GetTransform()
void AddChildTail(AGUI2Element &a_rElement)
void SetAttachment(AGUI2ATTACHMENT a_eAnchor, AGUI2ATTACHMENT a_ePivot)
virtual void GetDimensions(TFLOAT &a_rWidth, TFLOAT &a_rHeight)
virtual void SetShadowAlpha(TFLOAT a_fAlpha)
void GetInvScreenTransform(AGUI2Transform &a_rOutTransform)
virtual TBOOL IsPointInside(TFLOAT a_fX, TFLOAT a_fY)
virtual void SetAlpha(TFLOAT a_fAlpha)
void SetMouseStateDirty()
void SetMenuAlpha(TFLOAT a_fAlpha, TFLOAT a_fShadowAlpha=-1.0f)
AGUI2MenuItem * GetHoveredMenuItem() const
TBOOL ProcessInputCommand(AInputCommand a_eCommand, const Toshi::TInputInterface::InputEvent *a_pEvent)
void Update(TFLOAT a_fDeltaTime)
TBOOL TriggerButtonPress(AGUI2MenuItem &a_rMenuItem)
void AddMenuItem(AGUI2MenuItem &a_rMenuItem)
void SetFocusAt(AGUI2MenuItem &a_rMenuItem)
void ReflowChildrenVertically()
TBOOL ProcessInputEvent(const Toshi::TInputInterface::InputEvent *a_pEvent)
virtual COMMANDRESULT OnInputCommand(AGUI2Menu::ACTIONFLAGS &a_rActionFlags)
virtual void SetAlpha(TFLOAT a_fAlpha) override
void LinkMenuItemBefore(AGUI2MenuItem &a_rLinkAfter)
virtual TFLOAT GetFlowVisualOffset()
virtual TFLOAT GetFlowOffset()
virtual void OnUpdate(TFLOAT a_fDeltaTime)
const Toshi::TVector2 & GetCursorPos() const
void Transform(Toshi::TVector2 &a_rOutVec, const Toshi::TVector2 &a_rTransformVec) const
constexpr void SetTranslation(TFLOAT a_fX, TFLOAT a_fY)