You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
359 lines
9.8 KiB
359 lines
9.8 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// |
|
//=============================================================================// |
|
|
|
#include "cbase.h" |
|
#include "tier3/tier3.h" |
|
#include "vgui/ILocalize.h" |
|
#include "lifetime_stats_page.h" |
|
#include <vgui_controls/SectionedListPanel.h> |
|
#include "cs_client_gamestats.h" |
|
#include "filesystem.h" |
|
#include "cs_weapon_parse.h" |
|
#include "buy_presets/buy_presets.h" |
|
#include "../vgui_controls/ScrollBar.h" |
|
#include "stat_card.h" |
|
|
|
using namespace vgui; |
|
|
|
// memdbgon must be the last include file in a .cpp file!!! |
|
#include "tier0/memdbgon.h" |
|
|
|
|
|
KeyValues *g_pPreloadedCSBaseStatGroupLayout = NULL; |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: creates child panels, passes down name to pick up any settings from res files. |
|
//----------------------------------------------------------------------------- |
|
CBaseStatsPage::CBaseStatsPage(vgui::Panel *parent, const char *name) : BaseClass(parent, "CSBaseStatsDialog") |
|
{ |
|
vgui::IScheme *pScheme = scheme()->GetIScheme( GetScheme() ); |
|
|
|
m_listItemFont = pScheme->GetFont( "StatsPageText", IsProportional() ); |
|
|
|
m_statsList = new SectionedListPanel( this, "StatsList" ); |
|
m_statsList->SetClickable(false); |
|
m_statsList->SetDrawHeaders(false); |
|
|
|
m_bottomBar = new ImagePanel(this, "BottomBar"); |
|
|
|
m_pGroupsList = new vgui::PanelListPanel( this, "listpanel_groups" ); |
|
m_pGroupsList->SetFirstColumnWidth( 0 ); |
|
|
|
SetBounds(0, 0, 900, 780); |
|
SetMinimumSize( 256, 780 ); |
|
|
|
SetBgColor(GetSchemeColor("ListPanel.BgColor", GetBgColor(), pScheme)); |
|
|
|
m_pStatCard = new StatCard(this, "ignored"); |
|
|
|
ListenForGameEvent( "player_stats_updated" ); |
|
|
|
m_bStatsDirty = true; |
|
} |
|
|
|
CBaseStatsPage::~CBaseStatsPage() |
|
{ |
|
delete m_statsList; |
|
} |
|
|
|
|
|
void CBaseStatsPage::MoveToFront() |
|
{ |
|
UpdateStatsData(); |
|
m_pStatCard->UpdateInfo(); |
|
} |
|
|
|
void CBaseStatsPage::UpdateStatsData() |
|
{ |
|
// Hide the group list scrollbar |
|
if (m_pGroupsList->GetScrollbar()) |
|
{ |
|
m_pGroupsList->GetScrollbar()->SetWide(0); |
|
} |
|
|
|
UpdateGroupPanels(); |
|
RepopulateStats(); |
|
|
|
m_bStatsDirty = false; |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Loads settings from statsdialog.res in hl2/resource/ui/ |
|
//----------------------------------------------------------------------------- |
|
void CBaseStatsPage::ApplySchemeSettings( vgui::IScheme *pScheme ) |
|
{ |
|
BaseClass::ApplySchemeSettings( pScheme ); |
|
LoadControlSettings("resource/ui/CSBaseStatsDialog.res"); |
|
|
|
m_statsList->SetClickable(false); |
|
m_statsList->SetDrawHeaders(false); |
|
|
|
m_statsList->SetVerticalScrollbar(true); |
|
|
|
SetBgColor(Color(86,86,86,255)); |
|
|
|
//Remove any pre-existing sections and add then fresh (this can happen on a resolution change) |
|
m_statsList->RemoveAllSections(); |
|
|
|
m_statsList->AddSection( 0, "Players"); |
|
|
|
m_statsList->SetFontSection(0, m_listItemFont); |
|
|
|
m_pGroupsList->SetBgColor(Color(86,86,86,255)); |
|
m_statsList->SetBgColor(Color(52,52,52,255)); |
|
} |
|
|
|
void CBaseStatsPage::SetActiveStatGroup (CBaseStatGroupPanel* groupPanel) |
|
{ |
|
for (int i = 0; i < m_pGroupsList->GetItemCount(); i++) |
|
{ |
|
CBaseStatGroupPanel *pPanel = (CBaseStatGroupPanel*)m_pGroupsList->GetItemPanel(i); |
|
if ( pPanel ) |
|
{ |
|
if ( pPanel != groupPanel ) |
|
{ |
|
pPanel->SetGroupActive( false ); |
|
} |
|
else |
|
{ |
|
pPanel->SetGroupActive( true ); |
|
} |
|
} |
|
} |
|
} |
|
|
|
void CBaseStatsPage::UpdateGroupPanels() |
|
{ |
|
int iGroupCount = m_pGroupsList->GetItemCount(); |
|
vgui::IScheme *pGroupScheme = scheme()->GetIScheme( GetScheme() ); |
|
|
|
for ( int i = 0; i < iGroupCount; i++ ) |
|
{ |
|
CBaseStatGroupPanel *pPanel = (CBaseStatGroupPanel*)m_pGroupsList->GetItemPanel(i); |
|
if ( pPanel ) |
|
{ |
|
pPanel->Update( pGroupScheme ); |
|
} |
|
} |
|
} |
|
|
|
|
|
|
|
void CBaseStatsPage::OnSizeChanged(int newWide, int newTall) |
|
{ |
|
BaseClass::OnSizeChanged(newWide, newTall); |
|
|
|
if (m_statsList) |
|
{ |
|
int labelX, labelY, listX, listY, listWide, listTall; |
|
m_statsList->GetBounds(listX, listY, listWide, listTall); |
|
|
|
if (m_bottomBar) |
|
{ |
|
m_bottomBar->GetPos(labelX, labelY); |
|
m_bottomBar->SetPos(labelX, listY + listTall); |
|
} |
|
} |
|
} |
|
|
|
const wchar_t* CBaseStatsPage::TranslateWeaponKillIDToAlias( int statKillID ) |
|
{ |
|
CSWeaponID weaponIDIndex = WEAPON_MAX; |
|
for ( int i = 0; WeaponName_StatId_Table[i].killStatId != CSSTAT_UNDEFINED; ++i ) |
|
{ |
|
if( WeaponName_StatId_Table[i].killStatId == statKillID ) |
|
{ |
|
weaponIDIndex = WeaponName_StatId_Table[i].weaponId; |
|
break; |
|
} |
|
} |
|
|
|
if (weaponIDIndex == WEAPON_MAX) |
|
{ |
|
return NULL; |
|
} |
|
else |
|
{ |
|
return WeaponIDToDisplayName(weaponIDIndex); |
|
} |
|
} |
|
|
|
const wchar_t* CBaseStatsPage::LocalizeTagOrUseDefault( const char* tag, const wchar_t* def ) |
|
{ |
|
const wchar_t* result = g_pVGuiLocalize->Find( tag ); |
|
|
|
if ( !result ) |
|
result = def ? def : L"\0"; |
|
|
|
return result; |
|
} |
|
|
|
CBaseStatGroupPanel* CBaseStatsPage::AddGroup( const wchar_t* name, const char* title_tag, const wchar_t* def ) |
|
{ |
|
CBaseStatGroupPanel* newGroup = new CBaseStatGroupPanel( m_pGroupsList, this, "StatGroupPanel", 0 ); |
|
newGroup->SetGroupInfo( name, LocalizeTagOrUseDefault( title_tag, def ) ); |
|
newGroup->SetGroupActive( false ); |
|
|
|
m_pGroupsList->AddItem( NULL, newGroup ); |
|
|
|
return newGroup; |
|
} |
|
|
|
void CBaseStatsPage::FireGameEvent( IGameEvent * event ) |
|
{ |
|
const char *type = event->GetName(); |
|
|
|
if ( 0 == Q_strcmp( type, "player_stats_updated" ) ) |
|
m_bStatsDirty = true; |
|
} |
|
|
|
void CBaseStatsPage::OnThink() |
|
{ |
|
if ( m_bStatsDirty ) |
|
UpdateStatsData(); |
|
} |
|
|
|
CBaseStatGroupPanel::CBaseStatGroupPanel( vgui::PanelListPanel *parent, CBaseStatsPage *owner, const char* name, int iListItemID ) : BaseClass( parent, name ) |
|
{ |
|
m_pParent = parent; |
|
m_pOwner = owner; |
|
m_pSchemeSettings = NULL; |
|
|
|
m_pGroupIcon = SETUP_PANEL(new vgui::ImagePanel( this, "GroupIcon" )); |
|
m_pBaseStatGroupLabel = new vgui::Label( this, "GroupName", "name" ); |
|
m_pGroupButton = new CBaseStatGroupButton(this, "GroupButton", "" ); |
|
m_pGroupButton->SetPos( 0, 0 ); |
|
m_pGroupButton->SetZPos( 20 ); |
|
m_pGroupButton->SetWide( 256 ); |
|
m_pGroupButton->SetTall( 64 ); |
|
SetMouseInputEnabled( true ); |
|
parent->SetMouseInputEnabled( true ); |
|
|
|
m_bActiveButton = false; |
|
} |
|
|
|
CBaseStatGroupPanel::~CBaseStatGroupPanel() |
|
{ |
|
delete m_pBaseStatGroupLabel; |
|
delete m_pGroupIcon; |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Sets the parameter pIconPanel to display the specified achievement's icon file. |
|
//----------------------------------------------------------------------------- |
|
bool CBaseStatGroupPanel::LoadIcon( const char* pFilename) |
|
{ |
|
char imagePath[_MAX_PATH]; |
|
Q_strncpy( imagePath, "achievements\\", sizeof(imagePath) ); |
|
Q_strncat( imagePath, pFilename, sizeof(imagePath), COPY_ALL_CHARACTERS ); |
|
Q_strncat( imagePath, ".vtf", sizeof(imagePath), COPY_ALL_CHARACTERS ); |
|
|
|
char checkFile[_MAX_PATH]; |
|
Q_snprintf( checkFile, sizeof(checkFile), "materials\\vgui\\%s", imagePath ); |
|
if ( !g_pFullFileSystem->FileExists( checkFile ) ) |
|
{ |
|
Q_snprintf( imagePath, sizeof(imagePath), "hud\\icon_locked.vtf" ); |
|
} |
|
|
|
m_pGroupIcon->SetShouldScaleImage( true ); |
|
m_pGroupIcon->SetImage( imagePath ); |
|
m_pGroupIcon->SetVisible( true ); |
|
|
|
return m_pGroupIcon->IsVisible(); |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Loads settings from hl2/resource/ui/achievementitem.res |
|
// Sets display info for this achievement item. |
|
//----------------------------------------------------------------------------- |
|
void CBaseStatGroupPanel::ApplySchemeSettings( vgui::IScheme* pScheme ) |
|
{ |
|
if ( !g_pPreloadedCSBaseStatGroupLayout ) |
|
{ |
|
PreloadResourceFile(); |
|
} |
|
|
|
LoadControlSettings( "", NULL, g_pPreloadedCSBaseStatGroupLayout ); |
|
|
|
m_pSchemeSettings = pScheme; |
|
|
|
BaseClass::ApplySchemeSettings( pScheme ); |
|
} |
|
|
|
void CBaseStatGroupPanel::Update( vgui::IScheme* pScheme ) |
|
{ |
|
if ( m_pSchemeSettings ) |
|
{ |
|
|
|
// Set group name text |
|
m_pBaseStatGroupLabel->SetText( m_pGroupTitle ); |
|
m_pBaseStatGroupLabel->SetFgColor(Color(157, 194, 80, 255)); |
|
|
|
if ( !m_bActiveButton ) |
|
{ |
|
LoadIcon( "achievement-btn-up" ); |
|
} |
|
else |
|
{ |
|
LoadIcon( "achievement-btn-select" ); |
|
} |
|
} |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void CBaseStatGroupPanel::PreloadResourceFile( void ) |
|
{ |
|
const char *controlResourceName = "resource/ui/StatGroup.res"; |
|
|
|
g_pPreloadedCSBaseStatGroupLayout = new KeyValues(controlResourceName); |
|
g_pPreloadedCSBaseStatGroupLayout->LoadFromFile(g_pFullFileSystem, controlResourceName); |
|
} |
|
|
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Assigns a name and achievement id bounds for an achievement group. |
|
//----------------------------------------------------------------------------- |
|
void CBaseStatGroupPanel::SetGroupInfo ( const wchar_t* name, const wchar_t* title) |
|
{ |
|
// Store away the group name |
|
short _textLen = (short)wcslen(name) + 1; |
|
m_pGroupName = new wchar_t[_textLen]; |
|
Q_memcpy( m_pGroupName, name, _textLen * sizeof(wchar_t) ); |
|
|
|
_textLen = (short)wcslen(title) + 1; |
|
m_pGroupTitle = new wchar_t[_textLen]; |
|
Q_memcpy( m_pGroupTitle, title, _textLen * sizeof(wchar_t) ); |
|
} |
|
|
|
|
|
CBaseStatGroupButton::CBaseStatGroupButton( vgui::Panel *pParent, const char *pName, const char *pText ) : |
|
BaseClass( pParent, pName, pText ) |
|
{ |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Handle the case where the user presses an achievement group button. |
|
//----------------------------------------------------------------------------- |
|
void CBaseStatGroupButton::DoClick( void ) |
|
{ |
|
// Process when a group button is hit |
|
CBaseStatGroupPanel* pParent = static_cast<CBaseStatGroupPanel*>(GetParent()); |
|
|
|
if (pParent) |
|
{ |
|
CBaseStatsPage* pBaseStatsPage = static_cast<CBaseStatsPage*>(pParent->GetOwner()); |
|
|
|
if (pBaseStatsPage) |
|
{ |
|
pBaseStatsPage->SetActiveStatGroup( pParent ); |
|
pBaseStatsPage->UpdateStatsData(); |
|
} |
|
} |
|
}
|
|
|