Files
GTASource/game/frontend/page_deck/layout/DynamicLayoutContext.cpp
expvintl 419f2e4752 init
2025-02-23 17:40:52 +08:00

208 lines
4.7 KiB
C++

/////////////////////////////////////////////////////////////////////////////////
//
// FILE : DynamicLayoutContext.cpp
// PURPOSE : Helper class that acts as a RAII support for dynamic layouts
//
// AUTHOR : james.strain
// STARTED : January 2021
//
/////////////////////////////////////////////////////////////////////////////////
#include "DynamicLayoutContext.h"
#include "frontend/page_deck/uiPageConfig.h"
#if UI_PAGE_DECK_ENABLED
// game
#include "frontend/page_deck/PageItemCategoryBase.h"
#include "frontend/page_deck/layout/PageLayoutBase.h"
#include "frontend/page_deck/layout/PageLayoutDecoratorItem.h"
#include "frontend/ui_channel.h"
CDynamicLayoutContext::CDynamicLayoutContext( CComplexObject& root, CPageItemCategoryBase& category )
: superclass()
, m_layout( category.GetLayout() )
{
if( m_layout )
{
m_layout->Reset();
Initialize( root );
GenerateItems( category );
}
}
CDynamicLayoutContext::CDynamicLayoutContext( CComplexObject& root, CPageLayoutBase& layout )
: superclass()
, m_layout( &layout )
{
m_layout->Reset();
Initialize( root );
}
CDynamicLayoutContext::~CDynamicLayoutContext()
{
RemoveItems();
}
void CDynamicLayoutContext::RemoveItems()
{
// We don't own the m_layout pointer so leave it alone
if( m_layout )
{
m_layout->UnregisterAll();
}
int const c_count = m_items.GetCount();
for( int index = 0; index < c_count; ++index )
{
m_items[index]->Shutdown();
delete m_items[index];
}
m_items.ResetCount();
}
void CDynamicLayoutContext::ResolveLayoutDerived( Vec2f_In screenspacePosPx, Vec2f_In localPosPx, Vec2f_In sizePx )
{
CComplexObject& displayObject = GetDisplayObject();
displayObject.SetPositionInPixels( localPosPx );
if( m_layout )
{
m_layout->RecalculateLayout( screenspacePosPx, sizePx );
m_layout->NotifyOfLayoutUpdate();
}
}
void CDynamicLayoutContext::GenerateItems( CPageItemCategoryBase& category )
{
if( m_layout )
{
auto itemFunc = [this]( CPageItemBase& item )
{
CPageLayoutDecoratorItem * const layoutItem = rage_new CPageLayoutDecoratorItem( *m_layout, item );
m_items.PushAndGrow( layoutItem );
layoutItem->Initialize( GetDisplayObject() );
m_layout->RegisterItem( *layoutItem, layoutItem->GenerateParams() );
};
category.ForEachItem( itemFunc );
}
}
#if RSG_BANK
void CDynamicLayoutContext::DebugRenderDerived() const
{
if( m_layout )
{
m_layout->DebugRender();
}
}
#endif
void CDynamicLayoutContext::SetDefaultFocus()
{
if( m_layout )
{
m_layout->SetDefaultFocus();
}
}
void CDynamicLayoutContext::InvalidateFocus()
{
if( m_layout )
{
m_layout->InvalidateFocus();
}
}
void CDynamicLayoutContext::RefreshFocusVisuals()
{
if( m_layout )
{
m_layout->RefreshFocusVisuals();
}
}
void CDynamicLayoutContext::ClearFocusVisuals()
{
if( m_layout )
{
m_layout->ClearFocusVisuals();
}
}
fwuiInput::eHandlerResult CDynamicLayoutContext::HandleDigitalNavigation( int const deltaX, int const deltaY )
{
fwuiInput::eHandlerResult result( fwuiInput::ACTION_NOT_HANDLED );
if( m_layout )
{
result = m_layout->HandleDigitalNavigation( deltaX, deltaY );
}
return result;
}
fwuiInput::eHandlerResult CDynamicLayoutContext::HandleInputAction( eFRONTEND_INPUT const inputAction, IPageMessageHandler& messageHandler ) const
{
fwuiInput::eHandlerResult result( fwuiInput::ACTION_NOT_HANDLED );
if( m_layout )
{
result = m_layout->HandleInputAction( inputAction, messageHandler );
}
return result;
}
void CDynamicLayoutContext::UpdateVisuals()
{
int const c_count = m_items.GetCount();
for( int index = 0; index < c_count; ++index )
{
CPageLayoutDecoratorItem * const layoutItem = m_items[ index ];
layoutItem->UpdateVisuals();
}
}
void CDynamicLayoutContext::OnPageEvent(uiPageDeckMessageBase& msg)
{
int const c_count = m_items.GetCount();
for (int index = 0; index < c_count; ++index)
{
CPageLayoutDecoratorItem * const layoutItem = m_items[index];
layoutItem->OnPageEvent(msg);
}
}
char const * CDynamicLayoutContext::GetFocusTooltip() const
{
char const * result = nullptr;
if( m_layout )
{
result = m_layout->GetFocusTooltip();
}
return result;
}
void CDynamicLayoutContext::UpdateInstructionalButtons() const
{
if( m_layout )
{
m_layout->UpdateInstructionalButtons();
}
}
void CDynamicLayoutContext::PlayEnterAnimation()
{
if( m_layout )
{
m_layout->PlayEnterAnimation();
}
}
#endif // UI_PAGE_DECK_ENABLED