diff options
Diffstat (limited to 'game/client/tf/vgui/store/tf_store_page_base.cpp')
| -rw-r--r-- | game/client/tf/vgui/store/tf_store_page_base.cpp | 278 |
1 files changed, 278 insertions, 0 deletions
diff --git a/game/client/tf/vgui/store/tf_store_page_base.cpp b/game/client/tf/vgui/store/tf_store_page_base.cpp new file mode 100644 index 0000000..ee867e8 --- /dev/null +++ b/game/client/tf/vgui/store/tf_store_page_base.cpp @@ -0,0 +1,278 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//=============================================================================// + + +#include "cbase.h" +#include "store/tf_store_page_base.h" +//#include "store/v1/tf_store_preview_item.h" +#include "econ_item_inventory.h" +#include "store/store_viewcart.h" +#include "c_tf_freeaccount.h" +#include "rtime.h" +#include "econ_ui.h" + +// memdbgon must be the last include file in a .cpp file!!! +#include <tier0/memdbgon.h> + +extern const char *g_aPlayerClassNames[TF_CLASS_MENU_BUTTONS]; + +const char *g_szClassFilterStrings[] = +{ + "", // Undefined + "#Store_Items_Scout", + "#Store_Items_Sniper", + "#Store_Items_Soldier", + "#Store_Items_Demoman", + "#Store_Items_Medic", + "#Store_Items_HWGuy", + "#Store_Items_Pyro", + "#Store_Items_Spy", + "#Store_Items_Engineer" +}; + +DECLARE_BUILD_FACTORY( CStorePreviewClassIcon ); + +ConVar tf_explanations_store( "tf_explanations_store", "0", FCVAR_ARCHIVE, "Whether the user has seen explanations for this panel." ); + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +CTFStorePageBase::CTFStorePageBase(Panel *parent, const CEconStoreCategoryManager::StoreCategory_t *pPageData, const char *pPreviewItemResFile ) : CStorePage(parent, pPageData, pPreviewItemResFile) +{ + m_flStartExplanationsAt = 0; + + // TF has an option for each class, all class items, all items, and an unowned item option. Let's make sure they all fit. + if ( m_pFilterComboBox ) + { + m_pFilterComboBox->SetNumberOfEditLines( 12 ); + } +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CTFStorePageBase::OnPageShow( void ) +{ + BaseClass::OnPageShow(); + + // If this is the first time we've opened the store, start the armory explanations + if ( !tf_explanations_store.GetBool() && m_pPageData ) + { + m_flStartExplanationsAt = engine->Time() + 0.5; + vgui::ivgui()->AddTickSignal( GetVPanel() ); + } +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CTFStorePageBase::OnCommand( const char *command ) +{ + if ( !Q_stricmp( command, "show_explanations" ) ) + { + if ( !m_flStartExplanationsAt ) + { + m_flStartExplanationsAt = engine->Time(); + vgui::ivgui()->AddTickSignal( GetVPanel() ); + } + RequestFocus(); + } + else + { + BaseClass::OnCommand( command ); + } +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CTFStorePageBase::GetFiltersForDef( GameItemDefinition_t *pDef, CUtlVector<int> *pVecFilters ) +{ + pVecFilters->AddToTail( FILTER_ALL_ITEMS ); + + // Add item to unowned filter only if it doesn't belong to these categories. + const econ_store_entry_t *pEntry = EconUI()->GetStorePanel()->GetPriceSheet()->GetEntry( pDef->GetDefinitionIndex() ); + if( !pEntry->IsListedInCategory( CEconStoreCategoryManager::k_CategoryID_Tools ) && + !pEntry->IsListedInCategory( CEconStoreCategoryManager::k_CategoryID_Maps ) && + !pEntry->IsListedInCategory( CEconStoreCategoryManager::k_CategoryID_Bundles ) && + !pEntry->IsListedInCategory( CEconStoreCategoryManager::k_CategoryID_Collections ) ) + { + bool bItemOwned = false; + int iCount = InventoryManager()->GetLocalInventory()->GetItemCount(); + for ( int i = 0; i < iCount; i++ ) + { + if ( InventoryManager()->GetLocalInventory()->GetItem( i )->GetItemDefIndex() == pDef->GetDefinitionIndex() ) + { + bItemOwned = true; + break; + } + } + + if ( !bItemOwned ) + { + pVecFilters->AddToTail( FILTER_UNOWNED_ITEMS ); + } + } + + if ( pDef->CanBeUsedByAllClasses() ) + pVecFilters->AddToTail( FILTER_ALLCLASS_ITEMS ); + + for ( int iClass = TF_FIRST_NORMAL_CLASS; iClass < TF_LAST_NORMAL_CLASS; iClass++ ) + { + if ( pDef->CanBeUsedByClass( iClass ) ) + pVecFilters->AddToTail( iClass ); + } +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CTFStorePageBase::OnItemDetails( vgui::Panel *panel ) +{ + CStoreItemControlsPanel *pControlsPanel = dynamic_cast< CStoreItemControlsPanel * >( panel ); + if ( pControlsPanel ) + { + const econ_store_entry_t *pEntry = pControlsPanel->GetItem(); + if ( pEntry ) + { + SelectItemPanel( pControlsPanel->GetItemModelPanel() ); + PostMessage( EconUI()->GetStorePanel(), new KeyValues("ArmoryOpened", "itemdef", pEntry->GetItemDefinitionIndex() ) ); + } + } +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CTFStorePageBase::ShowPreview( int iClass, const econ_store_entry_t* pEntry ) +{ + if ( iClass < TF_FIRST_NORMAL_CLASS || iClass >= TF_LAST_NORMAL_CLASS ) + { + iClass = TF_CLASS_SCOUT; + } + + BaseClass::ShowPreview( iClass, pEntry ); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CTFStorePageBase::UpdateFilterComboBox( void ) +{ + if ( !m_pFilterComboBox ) + return; + + wchar_t wzLocalized[256]; + wchar_t wszCount[16]; + + m_pFilterComboBox->RemoveAll(); + + // All items + KeyValues *pKeyValues = new KeyValues( "data" ); + pKeyValues->SetInt( "filter", FILTER_ALL_ITEMS ); + m_pFilterComboBox->AddItem( "#Store_ClassFilter_None", pKeyValues ); + +#if NEWFILTER + // All classes + int nCount = m_pPrimaryFilter->GetCountForFilterItem( FILTER_ALLCLASS_ITEMS ); + if ( nCount ) + { + pKeyValues->SetInt( "filter", FILTER_ALLCLASS_ITEMS ); + + _snwprintf( wszCount, ARRAYSIZE( wszCount ), L"%d", nCount ); + g_pVGuiLocalize->ConstructString_safe( wzLocalized, g_pVGuiLocalize->Find( "#Store_ClassFilter_AllClasses" ), 1, wszCount ); + m_pFilterComboBox->AddItem( wzLocalized, pKeyValues ); + } + + // Individual classes + for ( int iClass = TF_FIRST_NORMAL_CLASS; iClass < TF_LAST_NORMAL_CLASS; iClass++ ) + { + nCount = m_pPrimaryFilter->GetCountForFilterItem( iClass ); + if ( !nCount ) + continue; + + pKeyValues->SetInt( "filter", iClass ); + + _snwprintf( wszCount, ARRAYSIZE( wszCount ), L"%d", nCount ); + g_pVGuiLocalize->ConstructString_safe( wzLocalized, g_pVGuiLocalize->Find( g_szClassFilterStrings[iClass] ), 1, wszCount ); + m_pFilterComboBox->AddItem( wzLocalized, pKeyValues ); + } + + // Unowned item filter + nCount = m_pPrimaryFilter->GetCountForFilterItem( FILTER_UNOWNED_ITEMS ); + if ( nCount ) + { + pKeyValues->SetInt( "filter", FILTER_UNOWNED_ITEMS ); + + _snwprintf( wszCount, ARRAYSIZE( wszCount ), L"%d", nCount ); + g_pVGuiLocalize->ConstructString_safe( wzLocalized, g_pVGuiLocalize->Find( "#Store_Items_Unowned" ), 1, wszCount ); + m_pFilterComboBox->AddItem( wzLocalized, pKeyValues ); + } + +#else + // All classes + if ( m_vecFilterCounts[FILTER_ALLCLASS_ITEMS] ) + { + pKeyValues->SetInt( "filter", FILTER_ALLCLASS_ITEMS ); + + _snwprintf( wszCount, ARRAYSIZE( wszCount ), L"%d", m_vecFilterCounts[FILTER_ALLCLASS_ITEMS] ); + g_pVGuiLocalize->ConstructString_safe( wzLocalized, g_pVGuiLocalize->Find( "#Store_ClassFilter_AllClasses" ), 1, wszCount ); + m_pFilterComboBox->AddItem( wzLocalized, pKeyValues ); + } + + // Individual classes + for ( int iClass = TF_FIRST_NORMAL_CLASS; iClass < TF_LAST_NORMAL_CLASS; iClass++ ) + { + if ( m_vecFilterCounts[iClass] == 0 ) + continue; + + pKeyValues->SetInt( "filter", iClass ); + + _snwprintf( wszCount, ARRAYSIZE( wszCount ), L"%d", m_vecFilterCounts[iClass] ); + g_pVGuiLocalize->ConstructString_safe( wzLocalized, g_pVGuiLocalize->Find( g_szClassFilterStrings[iClass] ), 1, wszCount ); + m_pFilterComboBox->AddItem( wzLocalized, pKeyValues ); + } + + // Unowned item filter + if ( m_vecFilterCounts[FILTER_UNOWNED_ITEMS] ) + { + pKeyValues->SetInt( "filter", FILTER_UNOWNED_ITEMS ); + + _snwprintf( wszCount, ARRAYSIZE( wszCount ), L"%d", m_vecFilterCounts[FILTER_UNOWNED_ITEMS] ); + g_pVGuiLocalize->ConstructString_safe( wzLocalized, g_pVGuiLocalize->Find( "#Store_Items_Unowned" ), 1, wszCount ); + m_pFilterComboBox->AddItem( wzLocalized, pKeyValues ); + } +#endif + + pKeyValues->deleteThis(); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CTFStorePageBase::OnTick( void ) +{ + BaseClass::OnTick(); + + if ( m_flStartExplanationsAt && m_flStartExplanationsAt < engine->Time() ) + { + m_flStartExplanationsAt = 0; + + tf_explanations_store.SetValue( 1 ); + + CExplanationPopup *pPopup = dynamic_cast<CExplanationPopup*>( FindChildByName("StartExplanation") ); + if ( pPopup ) + { + pPopup->Popup(); + } + } + + if ( !m_flStartExplanationsAt ) + { + vgui::ivgui()->RemoveTickSignal( GetVPanel() ); + } +} + |