Modified source engine (2017) developed by valve and leaked in 2020. Not for commercial purporses
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.

251 lines
9.5 KiB

5 years ago
//========= Copyright Valve Corporation, All rights reserved. ============//
//
//=======================================================================================//
#include "cbase.h"
#include "loadout_preset_panel.h"
#include "tf_item_inventory.h"
#include "econ/econ_item_preset.h"
#include "econ/econ_item_system.h"
// memdbgon must be the last include file in a .cpp file!!!
#include <tier0/memdbgon.h>
//-----------------------------------------------------------------------------
using namespace vgui;
//-----------------------------------------------------------------------------
DECLARE_BUILD_FACTORY( CLoadoutPresetPanel );
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
CLoadoutPresetPanel::CLoadoutPresetPanel( vgui::Panel *pParent, const char *pName )
: EditablePanel( pParent, "loadout_preset_panel" )
{
V_memset( m_pPresetButtons, 0, sizeof( m_pPresetButtons ) );
m_iClass = TF_CLASS_UNDEFINED;
m_pPresetButtonKv = NULL;
m_bDisplayVertical = false;
// Create all buttons
for ( int i = 0; i < MAX_PRESETS; ++i )
{
CFmtStr fmtTokenName( "TF_ItemPresetName%i", i );
CFmtStr fmtButtonName( "LoadPresetButton%i", i );
wchar_t *pwszPresetName = g_pVGuiLocalize->Find( fmtTokenName.Access() );
m_pPresetButtons[i] = new CExButton( this, fmtButtonName.Access(), pwszPresetName, this );
}
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CLoadoutPresetPanel::ApplySchemeSettings( vgui::IScheme *pScheme )
{
BaseClass::ApplySchemeSettings( pScheme );
LoadControlSettings( "Resource/UI/LoadoutPresetPanel.res" );
m_aDefaultColors[LOADED][FG][DEFAULT] = vgui::scheme()->GetIScheme( GetScheme() )->GetColor( "Econ.Button.PresetDefaultColorFg", Color( 255, 255, 255, 255 ) );
m_aDefaultColors[LOADED][FG][ARMED] = vgui::scheme()->GetIScheme( GetScheme() )->GetColor( "Econ.Button.PresetArmedColorFg", Color( 255, 255, 255, 255 ) );
m_aDefaultColors[LOADED][FG][DEPRESSED] = vgui::scheme()->GetIScheme( GetScheme() )->GetColor( "Econ.Button.PresetDepressedColorFg", Color( 255, 255, 255, 255 ) );
m_aDefaultColors[LOADED][BG][DEFAULT] = vgui::scheme()->GetIScheme( GetScheme() )->GetColor( "Econ.Button.PresetDefaultColorBg", Color( 255, 255, 255, 255 ) );
m_aDefaultColors[LOADED][BG][ARMED] = vgui::scheme()->GetIScheme( GetScheme() )->GetColor( "Econ.Button.PresetArmedColorBg", Color( 255, 255, 255, 255 ) );
m_aDefaultColors[LOADED][BG][DEPRESSED] = vgui::scheme()->GetIScheme( GetScheme() )->GetColor( "Econ.Button.PresetDepressedColorBg", Color( 255, 255, 255, 255 ) );
m_aDefaultColors[NOTLOADED][FG][DEFAULT] = vgui::scheme()->GetIScheme( GetScheme() )->GetColor( "Button.TextColor", Color( 255, 255, 255, 255 ) );
m_aDefaultColors[NOTLOADED][FG][ARMED] = vgui::scheme()->GetIScheme( GetScheme() )->GetColor( "Button.ArmedTextColor", Color( 255, 255, 255, 255 ) );
m_aDefaultColors[NOTLOADED][FG][DEPRESSED] = vgui::scheme()->GetIScheme( GetScheme() )->GetColor( "Button.DepressedTextColor", Color( 255, 255, 255, 255 ) );
m_aDefaultColors[NOTLOADED][BG][DEFAULT] = vgui::scheme()->GetIScheme( GetScheme() )->GetColor( "Button.BgColor", Color( 255, 255, 255, 255 ) );
m_aDefaultColors[NOTLOADED][BG][ARMED] = vgui::scheme()->GetIScheme( GetScheme() )->GetColor( "Button.ArmedBgColor", Color( 255, 255, 255, 255 ) );
m_aDefaultColors[NOTLOADED][BG][DEPRESSED] = vgui::scheme()->GetIScheme( GetScheme() )->GetColor( "Button.DepressedBgColor", Color( 255, 255, 255, 255 ) );
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CLoadoutPresetPanel::ApplySettings( KeyValues *pInResourceData )
{
BaseClass::ApplySettings( pInResourceData );
KeyValues *pPresetButtonKv = pInResourceData->FindKey( "presetbutton_kv" );
if ( pPresetButtonKv && !m_pPresetButtonKv )
{
m_pPresetButtonKv = new KeyValues( "presetbutton_kv" );
pPresetButtonKv->CopySubkeys( m_pPresetButtonKv );
}
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CLoadoutPresetPanel::PerformLayout()
{
BaseClass::PerformLayout();
if ( !m_pPresetButtons[0] )
return;
const int nBuffer = XRES( 2 );
for ( int i = 0; i < MAX_PRESETS; ++i )
{
if ( m_pPresetButtonKv )
{
m_pPresetButtons[i]->ApplySettings( m_pPresetButtonKv );
}
// Display buttons vertically or horizontally?
// NOTE: Button width and height will be valid here, since we've just applied settings
if ( m_bDisplayVertical )
{
const int nButtonHeight = m_pPresetButtons[0]->GetTall();
m_pPresetButtons[i]->SetPos( 0, i * ( nButtonHeight + nBuffer ) );
}
else
{
const int nButtonWidth = m_pPresetButtons[0]->GetWide();
const int nStartX = 0.5f * ( GetWide() - MAX_PRESETS * ( nButtonWidth + nBuffer ) );
m_pPresetButtons[i]->SetPos( nStartX + i * ( nButtonWidth + nBuffer ), 0 );
}
m_pPresetButtons[i]->SetVisible( true );
}
vgui::ivgui()->AddTickSignal( GetVPanel(), 150 );
UpdatePresetButtonStates();
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CLoadoutPresetPanel::SetClass( int iClass )
{
m_iClass = iClass;
if ( iClass != TF_CLASS_UNDEFINED )
{
UpdatePresetButtonStates();
}
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CLoadoutPresetPanel::EnableVerticalDisplay( bool bVertical )
{
m_bDisplayVertical = bVertical;
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CLoadoutPresetPanel::LoadPreset( int iPresetIndex )
{
TFInventoryManager()->LoadPreset( m_iClass, iPresetIndex );
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CLoadoutPresetPanel::OnCommand( const char *command )
{
if ( !V_strnicmp( command, "loadpreset_", 11 ) )
{
const int iPresetIndex = atoi( command + 11 );
LoadPreset( iPresetIndex );
}
else
{
BaseClass::OnCommand( command );
}
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CLoadoutPresetPanel::OnTick()
{
UpdatePresetButtonStates();
}
//-----------------------------------------------------------------------------
// Purpose: Processes some keypresses for the loadout panel
//-----------------------------------------------------------------------------
bool CLoadoutPresetPanel::HandlePresetKeyPressed( vgui::KeyCode code )
{
ButtonCode_t nButtonCode = GetBaseButtonCode( code );
if( nButtonCode == KEY_XBUTTON_LEFT_SHOULDER )
{
if( GetSelectedPresetID() > 0 )
LoadPreset( GetSelectedPresetID() - 1 );
return true;
}
else if( nButtonCode == KEY_XBUTTON_RIGHT_SHOULDER )
{
if( GetSelectedPresetID() < MAX_PRESETS - 1 )
LoadPreset( GetSelectedPresetID() + 1 );
return true;
}
else
{
return false;
}
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
equipped_preset_t CLoadoutPresetPanel::GetSelectedPresetID() const
{
if ( !InventoryManager()->GetLocalInventory() )
return INVALID_PRESET_INDEX;
const uint32 unAccountID = InventoryManager()->GetLocalInventory()->GetOwner().GetAccountID();
const CEconItemPerClassPresetData soSearch( unAccountID, m_iClass );
GCSDK::CSharedObjectCache *pSOCache = InventoryManager()->GetLocalInventory()->GetSOC();
if ( !pSOCache )
return INVALID_PRESET_INDEX;
const CEconItemPerClassPresetData *pExistingPerClassData = assert_cast<CEconItemPerClassPresetData *>( pSOCache->FindSharedObject( soSearch ) );
if ( !pExistingPerClassData )
return INVALID_PRESET_INDEX;
return pExistingPerClassData->GetActivePreset();
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CLoadoutPresetPanel::UpdatePresetButtonStates()
{
const equipped_preset_t unEquippedPresetID = GetSelectedPresetID();
for ( int i = 0; i < MAX_PRESETS; ++i )
{
if ( i == unEquippedPresetID )
{
m_pPresetButtons[i]->SetDefaultColor( m_aDefaultColors[LOADED][FG][DEFAULT], m_aDefaultColors[LOADED][BG][DEFAULT] );
m_pPresetButtons[i]->SetArmedColor( m_aDefaultColors[LOADED][FG][ARMED], m_aDefaultColors[LOADED][BG][ARMED] );
m_pPresetButtons[i]->SetDepressedColor( m_aDefaultColors[LOADED][FG][DEPRESSED], m_aDefaultColors[LOADED][BG][DEPRESSED] );
}
else
{
m_pPresetButtons[i]->SetDefaultColor( m_aDefaultColors[NOTLOADED][FG][DEFAULT], m_aDefaultColors[NOTLOADED][BG][DEFAULT] );
m_pPresetButtons[i]->SetArmedColor( m_aDefaultColors[NOTLOADED][FG][ARMED], m_aDefaultColors[NOTLOADED][BG][ARMED] );
m_pPresetButtons[i]->SetDepressedColor( m_aDefaultColors[NOTLOADED][FG][DEPRESSED], m_aDefaultColors[NOTLOADED][BG][DEPRESSED] );
}
CFmtStr fmtCmd( "loadpreset_%i", i );
m_pPresetButtons[i]->SetCommand( fmtCmd.Access() );
}
}