summaryrefslogtreecommitdiff
path: root/game/client/econ/item_pickup_panel.cpp
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /game/client/econ/item_pickup_panel.cpp
downloadarchived-source-engine-2018-hl2-src-master.tar.xz
archived-source-engine-2018-hl2-src-master.zip
Diffstat (limited to 'game/client/econ/item_pickup_panel.cpp')
-rw-r--r--game/client/econ/item_pickup_panel.cpp889
1 files changed, 889 insertions, 0 deletions
diff --git a/game/client/econ/item_pickup_panel.cpp b/game/client/econ/item_pickup_panel.cpp
new file mode 100644
index 0000000..4ff2811
--- /dev/null
+++ b/game/client/econ/item_pickup_panel.cpp
@@ -0,0 +1,889 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+//=============================================================================//
+
+#include "cbase.h"
+#include "vgui/IInput.h"
+#include <vgui/IVGui.h>
+#include <vgui/IScheme.h>
+#include <vgui/ILocalize.h>
+#include "vgui_controls/TextImage.h"
+#include "ienginevgui.h"
+#include "iclientmode.h"
+#include "baseviewport.h"
+#include "item_pickup_panel.h"
+#include "econ_ui.h"
+#include "econ_item_inventory.h"
+#include "econ_item_constants.h"
+#include "item_confirm_delete_dialog.h"
+#include "backpack_panel.h"
+
+#ifdef TF_CLIENT_DLL
+#include "c_tf_freeaccount.h"
+#include "clientmode_tf.h"
+#include "quest_log_panel.h"
+#endif
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+CItemPickupPanel::CItemPickupPanel( Panel *parent ) : Frame( parent, "item_pickup" )
+{
+ vgui::VPANEL gameuiPanel = enginevgui->GetPanel( PANEL_GAMEUIDLL );
+ SetParent( gameuiPanel );
+
+ // We don't want the gameui to delete us, or things get messy
+ SetAutoDelete( false );
+
+ SetMoveable( false );
+ SetSizeable( false );
+
+ vgui::HScheme scheme = vgui::scheme()->LoadSchemeFromFileEx( enginevgui->GetPanel( PANEL_CLIENTDLL ), "resource/ClientScheme.res", "ClientScheme");
+ SetScheme(scheme);
+ SetProportional( true );
+
+ m_pNextButton = new vgui::Button( this, "NextButton", "#Next" );
+ m_pPrevButton = new vgui::Button( this, "PrevButton", "#Prev" );
+ m_pDiscardButton = NULL;
+ m_pDiscardedLabel = NULL;
+ m_pOpenLoadoutButton = NULL;
+ m_pConfirmDeleteDialog = NULL;
+ m_pModelPanelsKV = NULL;
+ m_bRandomizePickupMethods = false;
+ m_pItemFoundMethod = NULL;
+ m_pCloseButton = NULL;
+
+ for ( int i = 0; i < ITEMPICKUP_NUM_MODELPANELS; i++ )
+ {
+ m_aModelPanels[i] = new CItemModelPanel( this, VarArgs("modelpanel%d", i) );
+ }
+
+ ListenForGameEvent( "gameui_hidden" );
+
+ vgui::EditablePanel *pToolTipPanel = new vgui::EditablePanel( this, "DiscardButtonTooltip" );
+ m_pToolTip = new CSimplePanelToolTip( this );
+ m_pToolTip->SetControlledPanel( pToolTipPanel );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+CItemPickupPanel::~CItemPickupPanel()
+{
+ if ( m_pModelPanelsKV )
+ {
+ m_pModelPanelsKV->deleteThis();
+ m_pModelPanelsKV = NULL;
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CItemPickupPanel::ApplySchemeSettings( vgui::IScheme *pScheme )
+{
+ BaseClass::ApplySchemeSettings( pScheme );
+
+ LoadControlSettings( "Resource/UI/econ/ItemPickupPanel.res" );
+
+ m_pItemsFoundLabel = dynamic_cast<vgui::Label*>(FindChildByName( "ItemsFoundLabel" ));
+ m_pDiscardedLabel = dynamic_cast<vgui::Label*>( FindChildByName("DiscardedLabel") );
+ m_pItemFoundMethod = dynamic_cast<vgui::Label*>(FindChildByName( "SelectedItemFoundMethodLabel" ));
+
+ for ( int i = 0; i < ITEMPICKUP_NUM_MODELPANELS; i++ )
+ {
+ m_aModelPanels[i]->SetPaintBackgroundType( 2 );
+ }
+
+ m_pDiscardButton = dynamic_cast<CExImageButton*>( FindChildByName("DiscardButton") );
+ if ( m_pDiscardButton )
+ {
+ m_pDiscardButton->SetTooltip( m_pToolTip, "" );
+ }
+
+ m_pOpenLoadoutButton = dynamic_cast<vgui::Button*>( FindChildByName("OpenLoadoutButton") );
+ m_pCloseButton = dynamic_cast<CExButton*>( FindChildByName("CloseButton") );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CItemPickupPanel::ApplySettings( KeyValues *inResourceData )
+{
+ BaseClass::ApplySettings( inResourceData );
+
+ KeyValues *pModelKV = inResourceData->FindKey( "modelpanelskv" );
+ if ( pModelKV )
+ {
+ if ( m_pModelPanelsKV )
+ {
+ m_pModelPanelsKV->deleteThis();
+ }
+ m_pModelPanelsKV = new KeyValues("modelpanelkv");
+ pModelKV->CopySubkeys( m_pModelPanelsKV );
+
+ for ( int i = 0; i < ITEMPICKUP_NUM_MODELPANELS; i++ )
+ {
+ m_aModelPanels[i]->ApplySettings( m_pModelPanelsKV );
+ }
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CItemPickupPanel::PerformLayout( void )
+{
+ if ( GetVParent() )
+ {
+ int w,h;
+ vgui::ipanel()->GetSize( GetVParent(), w, h );
+ SetBounds(0,0,w,h);
+ }
+
+ BaseClass::PerformLayout();
+
+ // Now lay out our model panels
+ for ( int i = 0; i < ITEMPICKUP_NUM_MODELPANELS; i++ )
+ {
+ int iPos = (i - ITEMPICKUP_MODELPANEL_CENTER);
+ int iXPos = (GetWide() * 0.5) + (iPos * m_iModelPanelSpacing) + (iPos * m_iModelPanelW) - (m_iModelPanelW * 0.5);
+ m_aModelPanels[i]->SetBounds( iXPos, m_iModelPanelY, m_iModelPanelW, m_iModelPanelH );
+ m_aModelPanels[i]->SetVisible( m_aModelPanels[i]->HasItem() );
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CItemPickupPanel::ShowPanel(bool bShow)
+{
+ if ( bShow )
+ {
+ // Start with the first item centered, and the rest off to the right.
+ m_iSelectedItem = 0;
+ UpdateModelPanels();
+ MoveToFront(); // Any open dialogs from the main menu (options, servers, etc.) showing up sometimes - this should fix.
+ }
+ else
+ {
+ for ( int i = 0; i < m_aItems.Count(); i++ )
+ {
+ if ( !m_aItems[i].bDiscarded )
+ {
+ // if not a real item, ignore
+ if ( m_aItems[i].pItem.GetSOCData() == NULL )
+ {
+ continue;
+ }
+
+ // ignore items that are purchased or are store promotional items
+ CEconItem *pEconItem = m_aItems[i].pItem.GetSOCData();
+ switch ( pEconItem->GetOrigin() )
+ {
+ case kEconItemOrigin_PreviewItem:
+ case kEconItemOrigin_Purchased:
+ case kEconItemOrigin_StorePromotion:
+ continue;
+ }
+ }
+ }
+
+ if ( m_pConfirmDeleteDialog )
+ {
+ m_pConfirmDeleteDialog->MarkForDeletion();
+ m_pConfirmDeleteDialog = NULL;
+ }
+
+ m_aItems.Purge();
+ }
+
+ SetMouseInputEnabled( bShow );
+ SetVisible( bShow );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CItemPickupPanel::FireGameEvent( IGameEvent *event )
+{
+ if ( !IsVisible() )
+ return;
+
+ const char * type = event->GetName();
+
+ if ( Q_strcmp(type, "gameui_hidden") == 0 )
+ {
+ ShowPanel( false );
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CItemPickupPanel::OnCommand( const char *command )
+{
+ if ( !Q_stricmp( command, "vguicancel" ) )
+ {
+ AcknowledgeItems();
+ ShowPanel( false );
+ }
+ else if ( !Q_stricmp( command, "changeloadout" ) )
+ {
+ AcknowledgeItems();
+ ShowPanel( false );
+ EconUI()->OpenEconUI( ECONUI_LOADOUT, true );
+ }
+ else if ( !Q_stricmp( command, "nextitem" ) )
+ {
+ m_iSelectedItem = clamp( m_iSelectedItem+1, 0, m_aItems.Count()-1 );
+ UpdateModelPanels();
+ }
+ else if ( !Q_stricmp( command, "previtem" ) )
+ {
+ m_iSelectedItem = clamp( m_iSelectedItem-1, 0, m_aItems.Count()-1 );
+ UpdateModelPanels();
+ }
+ else if ( !Q_stricmp( command, "discarditem" ) )
+ {
+ // Bring up confirm dialog
+ CConfirmDeleteItemDialog *pConfirm = vgui::SETUP_PANEL( new CConfirmDeleteItemDialog( this ) );
+ if ( pConfirm )
+ {
+ pConfirm->Show();
+
+ m_pConfirmDeleteDialog = pConfirm;
+ }
+ }
+ else
+ {
+ engine->ClientCmd( const_cast<char *>( command ) );
+ }
+
+ BaseClass::OnCommand( command );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CItemPickupPanel::UpdateModelPanels( void )
+{
+ for ( int i = 0; i < ITEMPICKUP_NUM_MODELPANELS; i++ )
+ {
+ int iPos = (i - ITEMPICKUP_MODELPANEL_CENTER);
+ int iItem = m_iSelectedItem + iPos;
+ if ( iItem < 0 || iItem >= m_aItems.Count() )
+ {
+ m_aModelPanels[i]->SetItem( NULL );
+ m_aModelPanels[i]->SetVisible( false );
+ continue;
+ }
+
+ m_aModelPanels[i]->SetItem( &m_aItems[iItem].pItem );
+ m_aModelPanels[i]->SetVisible( true );
+ }
+
+ // Enable next & prev buttons if there are other items to the sides
+ bool bCanScrollRight = (m_iSelectedItem + 1) < m_aItems.Count();
+ m_pNextButton->SetVisible( bCanScrollRight );
+ m_pNextButton->SetEnabled( bCanScrollRight );
+ bool bCanScrollLeft = ((m_iSelectedItem - 1) >= 0) && m_aItems.Count();
+ m_pPrevButton->SetVisible( bCanScrollLeft );
+ m_pPrevButton->SetEnabled( bCanScrollLeft );
+
+ bool bDiscarded = false;
+ if ( m_iSelectedItem >= 0 && m_iSelectedItem < m_aItems.Count() )
+ {
+ bDiscarded = m_aItems[m_iSelectedItem].bDiscarded;
+ }
+
+ bool bAllowDiscard = true;
+
+ int iFoundMethod = 0;
+ if ( m_bRandomizePickupMethods )
+ {
+ iFoundMethod = RandomInt( 0, ARRAYSIZE(g_pszItemPickupMethodStrings)-1 );
+ }
+ else if ( m_iSelectedItem >= 0 && m_iSelectedItem < m_aItems.Count() )
+ {
+ iFoundMethod = GetUnacknowledgedReason( m_aItems[m_iSelectedItem].pItem.GetInventoryPosition() );
+ bAllowDiscard = ( iFoundMethod <= UNACK_ITEM_DROPPED );
+ iFoundMethod--;
+
+ if ( iFoundMethod < 0 || iFoundMethod >= ARRAYSIZE(g_pszItemPickupMethodStrings) )
+ {
+ iFoundMethod = 0;
+ }
+ }
+
+ // Hide the discard button if it's not a random find
+ m_pDiscardButton->SetVisible( !bDiscarded && bAllowDiscard );
+ m_pOpenLoadoutButton->SetVisible( !bDiscarded );
+ m_pDiscardedLabel->SetVisible( bDiscarded );
+
+ if ( m_pItemFoundMethod )
+ {
+ enum
+ {
+ COLOR_NORMAL = 1,
+ COLOR_HIGHLIGHTED = 2,
+ };
+
+ m_pItemFoundMethod->GetTextImage()->ClearColorChangeStream();
+
+ wchar_t wszTmp[1024];
+ wchar_t *pLocText = g_pVGuiLocalize->Find( g_pszItemPickupMethodStrings[iFoundMethod] );
+ if ( pLocText )
+ {
+ // Loop through and replace the color changes
+ Color baseColor = m_pItemFoundMethod->GetFgColor();
+ wchar_t *wpszChar = pLocText;
+ int iOutPos = 0;
+ while ( *wpszChar )
+ {
+ if ( *wpszChar == COLOR_NORMAL )
+ {
+ m_pItemFoundMethod->GetTextImage()->AddColorChange( baseColor, iOutPos );
+ }
+ else if ( *wpszChar == COLOR_HIGHLIGHTED )
+ {
+ m_pItemFoundMethod->GetTextImage()->AddColorChange( Color(200,80,60,255), iOutPos );
+ }
+ else
+ {
+ wszTmp[iOutPos] = *wpszChar;
+ iOutPos++;
+ }
+ wpszChar++;
+
+ if ( iOutPos >= (ARRAYSIZE(wszTmp) - 1) )
+ {
+ wszTmp[iOutPos] = L'\0';
+ break;
+ }
+ }
+
+ if ( iOutPos < (ARRAYSIZE(wszTmp) - 1) )
+ {
+ wszTmp[iOutPos] = L'\0';
+ }
+
+ m_pItemFoundMethod->SetText( wszTmp );
+ }
+ }
+
+ if ( m_pItemsFoundLabel )
+ {
+ if ( m_aItems.Count() > 1 )
+ {
+ m_pItemsFoundLabel->SetText( "#NewItemsAcquired" );
+ SetDialogVariable( "numitems", m_aItems.Count() );
+ }
+ else
+ {
+ m_pItemsFoundLabel->SetText( "#NewItemAcquired" );
+ }
+ }
+
+ SetDialogVariable( "selecteditem", m_iSelectedItem+1 );
+
+ // Update the loadout button as appropriate
+ if ( m_iSelectedItem >= 0 && m_iSelectedItem < m_aItems.Count() )
+ {
+ if ( m_aItems[m_iSelectedItem].pItem.IsValid() && !bDiscarded )
+ {
+ SetDialogVariable("loadouttext", g_pVGuiLocalize->Find( "#OpenGeneralLoadout" ) );
+ }
+ }
+
+ if ( m_pCloseButton )
+ {
+ const char *pszCloseString = (m_bReturnToGame && engine->IsInGame()) ? "#CloseItemPanel" : "#GameUI_OK";
+ m_pCloseButton->SetText( g_pVGuiLocalize->Find( pszCloseString ) );
+ }
+ m_pCloseButton->RequestFocus();
+}
+
+//-----------------------------------------------------------------------------
+void CItemPickupPanel::AcknowledgeItems( void )
+{
+ // On command, AckKnowledge all these items
+ for ( int i = 0; i < m_aItems.Count(); i++ )
+ {
+ InventoryManager()->AcknowledgeItem( &m_aItems[i].pItem, false );
+ }
+
+ InventoryManager()->SaveAckFile();
+
+ // If we were crafting, and the craft panel is up, we return to that instead.
+ if ( EconUI()->IsUIPanelVisible( ECONUI_CRAFTING ) )
+ return;
+
+ // Check to make sure the player has room for all his items. If not, bring up the discard panel. Otherwise, go away.
+ if ( !InventoryManager()->CheckForRoomAndForceDiscard( ) )
+ {
+#ifdef TF_CLIENT_DLL
+ // If the quest log is up, we just go back to that
+ if ( GetQuestLog() && GetQuestLog()->IsVisible() )
+ return;
+#endif
+ // If we're connected to a game server, we also close the game UI.
+ if ( m_bReturnToGame && engine->IsInGame() )
+ {
+ engine->ClientCmd_Unrestricted( "gameui_hide" );
+ }
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Handles the escape key
+//-----------------------------------------------------------------------------
+void CItemPickupPanel::OnKeyCodeTyped( vgui::KeyCode code )
+{
+ if( code == KEY_ESCAPE )
+ {
+ OnCommand( "vguicancel" );
+ }
+ else
+ {
+ BaseClass::OnKeyCodeTyped( code );
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Handles button press code for controllers and enter
+//-----------------------------------------------------------------------------
+void CItemPickupPanel::OnKeyCodePressed( vgui::KeyCode code )
+{
+ ButtonCode_t nButtonCode = GetBaseButtonCode( code );
+
+ if( code == KEY_ENTER || nButtonCode == KEY_XBUTTON_A || nButtonCode == KEY_XBUTTON_B || nButtonCode == STEAMCONTROLLER_A || nButtonCode == STEAMCONTROLLER_B )
+ {
+ OnCommand( "vguicancel" );
+ }
+ else if( code == KEY_HOME || nButtonCode == KEY_XBUTTON_Y || nButtonCode == STEAMCONTROLLER_Y )
+ {
+ OnCommand( "changeloadout" );
+ }
+
+ else if ( nButtonCode == KEY_XBUTTON_RIGHT ||
+ nButtonCode == KEY_XSTICK1_RIGHT ||
+ nButtonCode == KEY_XSTICK2_RIGHT ||
+ nButtonCode == KEY_RIGHT )
+ {
+ OnCommand( "nextitem" );
+ }
+ else if ( nButtonCode == KEY_XBUTTON_LEFT ||
+ nButtonCode == KEY_XSTICK1_LEFT ||
+ nButtonCode == KEY_XSTICK2_LEFT ||
+ nButtonCode == KEY_LEFT )
+ {
+ OnCommand( "previtem" );
+ }
+ else
+ {
+ BaseClass::OnKeyCodePressed( code );
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CItemPickupPanel::AddItem( CEconItemView *pItem )
+{
+ // Guard against duplicates
+ FOR_EACH_VEC( m_aItems, i )
+ {
+ if ( m_aItems[i].pItem.GetItemID() == pItem->GetItemID() )
+ return;
+ }
+
+ int iIdx = m_aItems.AddToTail();
+ m_aItems[iIdx].pItem = *pItem;
+ m_aItems[iIdx].bDiscarded = false;
+
+ if ( IsVisible() )
+ {
+ UpdateModelPanels();
+ InvalidateLayout();
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CItemPickupPanel::OnConfirmDelete( KeyValues *data )
+{
+ m_pConfirmDeleteDialog = NULL;
+ m_pCloseButton->RequestFocus();
+
+ int iConfirmed = data->GetInt( "confirmed", 0 );
+ if ( !iConfirmed )
+ return;
+
+ if ( m_iSelectedItem >= 0 && m_iSelectedItem < m_aItems.Count() )
+ {
+ if ( m_aItems[m_iSelectedItem].pItem.IsValid() )
+ {
+ CPlayerInventory *pInventory = InventoryManager()->GetLocalInventory();
+ if ( pInventory )
+ {
+ EconUI()->Gamestats_ItemTransaction( IE_ITEM_DISCARDED, &m_aItems[m_iSelectedItem].pItem );
+
+ InventoryManager()->DropItem( m_aItems[m_iSelectedItem].pItem.GetItemID() );
+ InvalidateLayout();
+
+ m_aItems[m_iSelectedItem].bDiscarded = true;
+ m_pDiscardButton->SetVisible( false );
+ m_pOpenLoadoutButton->SetVisible( false );
+ m_pDiscardedLabel->SetVisible( true );
+
+ // If we've discarded all our items, we exit immediately
+ bool bFoundUndiscarded = false;
+ for ( int i = 0; i < m_aItems.Count(); i++ )
+ {
+ if ( !m_aItems[i].bDiscarded )
+ {
+ bFoundUndiscarded = true;
+ break;
+ }
+ }
+
+ if ( !bFoundUndiscarded )
+ {
+ OnCommand( "vguicancel" );
+ }
+ }
+ }
+ }
+}
+
+static vgui::DHANDLE<CItemPickupPanel> g_ItemPickupPanel;
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+CItemPickupPanel *OpenItemPickupPanel( void )
+{
+ if (!g_ItemPickupPanel.Get())
+ {
+ g_ItemPickupPanel = vgui::SETUP_PANEL( new CItemPickupPanel( NULL ) );
+ g_ItemPickupPanel->InvalidateLayout( false, true );
+ }
+
+ engine->ClientCmd_Unrestricted( "gameui_activate" );
+ g_ItemPickupPanel->ShowPanel( true );
+
+ return g_ItemPickupPanel;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+CItemPickupPanel *GetItemPickupPanel( void )
+{
+ return g_ItemPickupPanel.Get();
+}
+
+//=======================================================================================================================================================
+// ITEM DISCARD PANEL
+//=======================================================================================================================================================
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+CItemDiscardPanel::CItemDiscardPanel( Panel *parent ) : Frame( parent, "item_discard" )
+{
+ vgui::VPANEL gameuiPanel = enginevgui->GetPanel( PANEL_GAMEUIDLL );
+ SetParent( gameuiPanel );
+
+ // We don't want the gameui to delete us, or things get messy
+ SetAutoDelete( false );
+
+ SetMoveable( false );
+ SetSizeable( false );
+
+ vgui::HScheme scheme = vgui::scheme()->LoadSchemeFromFileEx( enginevgui->GetPanel( PANEL_CLIENTDLL ), "resource/ClientScheme.res", "ClientScheme");
+ SetScheme(scheme);
+ SetProportional( true );
+
+ m_pModelPanel = new CItemModelPanel( this, "modelpanel" );
+
+ m_pBackpackPanel = new CBackpackPanel( this, "backpack_panel" );
+ m_pConfirmDeleteDialog = NULL;
+
+ m_bDiscardedNewItem = false;
+ m_bMadeRoom = false;
+ m_pDiscardedLabelCarat = NULL;
+ m_pDiscardedLabel = NULL;
+ m_pDiscardButton = NULL;
+ m_pCloseButton = NULL;
+
+ m_pItemMouseOverPanel = new CItemModelPanel( this, "ItemMouseOverItemPanel" );
+ m_pItemToolTip = new CSimplePanelToolTip( this );
+ m_pItemToolTip->SetControlledPanel( m_pItemMouseOverPanel );
+ m_pModelPanel->SetTooltip( m_pItemToolTip, "" );
+ m_pModelPanel->SetActAsButton( false, true );
+
+ ListenForGameEvent( "gameui_hidden" );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CItemDiscardPanel::ApplySchemeSettings( vgui::IScheme *pScheme )
+{
+ BaseClass::ApplySchemeSettings( pScheme );
+
+ m_pItemMouseOverPanel->InvalidateLayout( true, true );
+ m_pModelPanel->InvalidateLayout( true, true );
+ LoadControlSettings( "Resource/UI/econ/ItemDiscardPanel.res" );
+
+ // Highlight the X on the discard button
+ m_pDiscardButton = dynamic_cast<CExButton*>( FindChildByName("DiscardButton") );
+ if ( m_pDiscardButton )
+ {
+ SetXToRed( m_pDiscardButton );
+ }
+ m_pCloseButton = dynamic_cast<CExButton*>( FindChildByName("CloseButton") );
+
+ m_pDiscardedLabel = dynamic_cast<vgui::Label*>( FindChildByName("DiscardedLabel") );
+ m_pDiscardedLabelCarat = dynamic_cast<vgui::Label*>( FindChildByName("DiscardedCaratLabel") );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CItemDiscardPanel::PerformLayout( void )
+{
+ if ( GetVParent() )
+ {
+ int w,h;
+ vgui::ipanel()->GetSize( GetVParent(), w, h );
+ SetBounds(0,0,w,h);
+ }
+
+ BaseClass::PerformLayout();
+
+ m_pDiscardedLabelCarat->SetVisible( m_bDiscardedNewItem );
+ m_pDiscardedLabel->SetVisible( m_bDiscardedNewItem );
+ m_pDiscardButton->SetVisible( !m_bDiscardedNewItem && !m_bMadeRoom );
+ m_pCloseButton->SetVisible( m_bDiscardedNewItem || m_bMadeRoom );
+
+ if ( m_pItemMouseOverPanel->IsVisible() )
+ {
+ m_pItemMouseOverPanel->SetVisible( false );
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CItemDiscardPanel::ShowPanel(bool bShow)
+{
+ if ( bShow )
+ {
+ m_bDiscardedNewItem = false;
+ m_bMadeRoom = false;
+ m_pBackpackPanel->ShowPanel( 0, true );
+ InvalidateLayout();
+ }
+ else
+ {
+ if ( m_pConfirmDeleteDialog )
+ {
+ m_pConfirmDeleteDialog->MarkForDeletion();
+ m_pConfirmDeleteDialog = NULL;
+ }
+ }
+
+ SetMouseInputEnabled( bShow );
+ SetVisible( bShow );
+
+#ifdef TF_CLIENT_DLL
+ // If the player made room and is a trial account, suggest that they upgrade to get more space.
+ if ( bShow && IsFreeTrialAccount() )
+ {
+ ShowUpgradeMessageBox( "#TF_TrialNeedSpace_Title", "#TF_TrialNeedSpace_Text" );
+ }
+#endif
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CItemDiscardPanel::FireGameEvent( IGameEvent *event )
+{
+ if ( !IsVisible() )
+ return;
+
+ const char * type = event->GetName();
+
+ if ( Q_strcmp(type, "gameui_hidden") == 0 )
+ {
+ // If they haven't discarded down to <MAX items, bring us right back up again
+ if ( InventoryManager()->CheckForRoomAndForceDiscard() )
+ {
+ engine->ClientCmd_Unrestricted( "gameui_activate" );
+ }
+ else
+ {
+ ShowPanel( false );
+ }
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CItemDiscardPanel::OnCommand( const char *command )
+{
+ if ( !Q_stricmp( command, "vguicancel" ) )
+ {
+ ShowPanel( false );
+
+ // Check to make sure the player has room for all his items. If not, bring up the discard panel. Otherwise, go away.
+ if ( !InventoryManager()->CheckForRoomAndForceDiscard() )
+ {
+ // If we're connected to a game server, we also close the game UI.
+ if ( engine->IsInGame() )
+ {
+ engine->ClientCmd_Unrestricted( "gameui_hide" );
+ }
+ }
+ }
+ else if ( !Q_stricmp( command, "discarditem" ) )
+ {
+ // Bring up confirm dialog
+ CConfirmDeleteItemDialog *pConfirm = vgui::SETUP_PANEL( new CConfirmDeleteItemDialog( this ) );
+ if ( pConfirm )
+ {
+ pConfirm->Show();
+
+ m_pConfirmDeleteDialog = pConfirm;
+ }
+ }
+ else
+ {
+ engine->ClientCmd( const_cast<char *>( command ) );
+ }
+
+ BaseClass::OnCommand( command );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CItemDiscardPanel::SetItem( CEconItemView *pItem )
+{
+ if ( m_pModelPanel )
+ {
+ m_pModelPanel->SetItem( pItem );
+ }
+
+ if ( m_pItemMouseOverPanel )
+ {
+ m_pItemMouseOverPanel->SetItem( pItem );
+ IScheme *pScheme = scheme()->GetIScheme( GetScheme() );
+ m_pItemMouseOverPanel->InvalidateLayout(true);
+ m_pItemMouseOverPanel->SetBorder( pScheme->GetBorder("MainMenuBGBorder") );
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CItemDiscardPanel::OnConfirmDelete( KeyValues *data )
+{
+ if ( !m_bDiscardedNewItem && !m_bMadeRoom && data && m_pModelPanel->HasItem() )
+ {
+ int iConfirmed = data->GetInt( "confirmed", 0 );
+ if ( iConfirmed == 2 )
+ {
+ // Player discarded an item from the backpack to make room
+ m_bMadeRoom = true;
+ InvalidateLayout();
+ }
+ else if ( iConfirmed )
+ {
+ CPlayerInventory *pInventory = InventoryManager()->GetLocalInventory();
+ if ( !pInventory )
+ return;
+
+ InventoryManager()->DropItem( m_pModelPanel->GetItem()->GetItemID() );
+ m_bDiscardedNewItem = true;
+ InvalidateLayout();
+ }
+
+ m_pBackpackPanel->RequestFocus();
+ }
+
+ m_pConfirmDeleteDialog = NULL;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Handles the escape key
+//-----------------------------------------------------------------------------
+void CItemDiscardPanel::OnKeyCodeTyped( vgui::KeyCode code )
+{
+ if( code == KEY_ESCAPE )
+ {
+ OnCommand( "vguicancel" );
+ }
+ else
+ {
+ BaseClass::OnKeyCodeTyped( code );
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Handles button press code for controllers and enter
+//-----------------------------------------------------------------------------
+void CItemDiscardPanel::OnKeyCodePressed( vgui::KeyCode code )
+{
+ ButtonCode_t nButtonCode = GetBaseButtonCode( code );
+
+ if( nButtonCode == KEY_XBUTTON_B )
+ {
+ OnCommand( "vguicancel" );
+ }
+ else
+ {
+ BaseClass::OnKeyCodePressed( code );
+ }
+}
+
+
+
+static vgui::DHANDLE<CItemDiscardPanel> g_ItemDiscardPanel;
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+CItemDiscardPanel *OpenItemDiscardPanel( void )
+{
+ if (!g_ItemDiscardPanel.Get())
+ {
+ g_ItemDiscardPanel = vgui::SETUP_PANEL( new CItemDiscardPanel( NULL ) );
+ g_ItemDiscardPanel->InvalidateLayout( false, true );
+ }
+
+ engine->ClientCmd_Unrestricted( "gameui_activate" );
+ g_ItemDiscardPanel->ShowPanel( true );
+
+ return g_ItemDiscardPanel;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+CItemDiscardPanel *GetItemDiscardPanel( void )
+{
+ return g_ItemDiscardPanel.Get();
+}
+
+