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.
 
 
 
 
 
 

387 lines
12 KiB

//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
//=============================================================================//
#include "cbase.h"
#include "store_viewcart.h"
#include "vgui/IInput.h"
#include "baseviewport.h"
#include "iclientmode.h"
#include "ienginevgui.h"
#include "econ_item_inventory.h"
#include <vgui/ILocalize.h>
#include "econ_item_system.h"
#include "item_model_panel.h"
#include "vgui_controls/ScrollBarSlider.h"
// memdbgon must be the last include file in a .cpp file!!!
#include <tier0/memdbgon.h>
DECLARE_BUILD_FACTORY( CCartViewItemEntry );
//-----------------------------------------------------------------------------
// Purpose: Basic help dialog
//-----------------------------------------------------------------------------
CStoreViewCartPanel::CStoreViewCartPanel( Panel *parent ) : Frame(parent, "store_viewcart_panel")
{
// Store is parented to the game UI panel
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 );
ListenForGameEvent( "gameui_hidden" );
ListenForGameEvent( "cart_updated" );
m_pItemEntryKVs = NULL;
m_pClientArea = new EditablePanel(this, "ClientArea");
m_pItemListContainer = new vgui::EditablePanel( this, "ItemListContainer" );
m_pItemListContainerScroller = new vgui::ScrollableEditablePanel( m_pClientArea, m_pItemListContainer, "ItemListContainerScroller" );
m_pPurchaseFooter = new EditablePanel(m_pItemListContainer, "PurchaseFooter");
m_pEmptyCartLabel = NULL;
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
CStoreViewCartPanel::~CStoreViewCartPanel()
{
if ( m_pItemEntryKVs )
{
m_pItemEntryKVs->deleteThis();
m_pItemEntryKVs = NULL;
}
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CStoreViewCartPanel::ApplySchemeSettings( vgui::IScheme *pScheme )
{
BaseClass::ApplySchemeSettings( pScheme );
LoadControlSettings( ShouldUseNewStore() ? "Resource/UI/econ/store/v2/StoreViewCartPanel.res" : "Resource/UI/econ/store/v1/StoreViewCartPanel.res" );
m_bReapplyItemKVs = true;
m_pItemListContainerScroller->GetScrollbar()->SetAutohideButtons( true );
m_pEmptyCartLabel = dynamic_cast<vgui::Label*>( m_pClientArea->FindChildByName("EmptyCartLabel") );
m_pFeaturedItemImage = dynamic_cast<vgui::ImagePanel*>( m_pItemListContainer->FindChildByName("FeaturedItemSymbol") );
if ( m_pFeaturedItemImage )
{
m_pFeaturedItemImage->SetMouseInputEnabled( false );
m_pFeaturedItemImage->SetKeyBoardInputEnabled( false );
}
CExButton *pCheckoutButton = dynamic_cast<CExButton*>( m_pClientArea->FindChildByName("CheckoutButton") );
if ( pCheckoutButton )
{
pCheckoutButton->AddActionSignalTarget( this );
}
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CStoreViewCartPanel::ApplySettings( KeyValues *inResourceData )
{
BaseClass::ApplySettings( inResourceData );
KeyValues *pItemKV = inResourceData->FindKey( "item_entry_kv" );
if ( pItemKV )
{
if ( m_pItemEntryKVs )
{
m_pItemEntryKVs->deleteThis();
}
m_pItemEntryKVs = new KeyValues("item_entry_kv");
pItemKV->CopySubkeys( m_pItemEntryKVs );
}
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CStoreViewCartPanel::PerformLayout( void )
{
if ( GetVParent() )
{
int w,h;
vgui::ipanel()->GetSize( GetVParent(), w, h );
SetBounds(0,0,w,h);
}
if ( m_bReapplyItemKVs )
{
m_bReapplyItemKVs = false;
if ( m_pItemEntryKVs )
{
FOR_EACH_VEC( m_pItemEntries, i )
{
m_pItemEntries[i]->ApplySettings( m_pItemEntryKVs );
m_pItemEntries[i]->InvalidateLayout();
}
}
}
BaseClass::PerformLayout();
if ( m_pItemEntries.Count() )
{
int iTall = m_pItemEntries[0]->GetTall();
m_pItemListContainer->SetSize( m_pItemListContainer->GetWide(), (iTall * m_pItemEntries.Count()) + m_pPurchaseFooter->GetTall() );
m_pItemListContainerScroller->InvalidateLayout( true );
m_pItemListContainerScroller->GetScrollbar()->InvalidateLayout( true );
int iX,iY;
m_pItemEntries[0]->GetPos( iX, iY );
FOR_EACH_VEC( m_pItemEntries, i )
{
iY = (iTall * i);
m_pItemEntries[i]->SetPos( iX, iY );
}
m_pPurchaseFooter->SetVisible( true );
m_pPurchaseFooter->SetPos( 0, iTall * m_pItemEntries.Count() );
}
else
{
m_pItemListContainer->SetSize( m_pItemListContainer->GetWide(), 100 );
m_pItemListContainer->InvalidateLayout( true );
m_pItemListContainerScroller->InvalidateLayout( true );
m_pPurchaseFooter->SetVisible( false );
}
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CStoreViewCartPanel::ShowPanel(bool bShow)
{
if ( bShow )
{
InvalidateLayout( false, true );
Activate();
CExButton *pCloseButton = dynamic_cast<CExButton*>( FindChildByName("CloseButton") );
if ( pCloseButton )
{
pCloseButton->RequestFocus();
}
// don't display the WA sales tax outside of the US
vgui::Panel *pPanel = FindChildByName( "WashingtonStateSalesTaxLabel", true );
if ( pPanel )
{
pPanel->SetVisible( FStrEq( EconUI()->GetStorePanel()->GetCountryCode(), "US" ) == true );
}
}
SetVisible( bShow );
if ( bShow )
{
UpdateCartItemList();
m_pItemListContainerScroller->GetScrollbar()->SetValue( 0 );
}
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CStoreViewCartPanel::FireGameEvent( IGameEvent *event )
{
const char * type = event->GetName();
if ( Q_strcmp(type, "gameui_hidden") == 0 )
{
ShowPanel( false );
}
else if ( Q_strcmp(type, "cart_updated") == 0 )
{
UpdateCartItemList();
}
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CStoreViewCartPanel::UpdateCartItemList( void )
{
CStoreCart *pCart = EconUI()->GetStorePanel()->GetCart();
int iNumEntriesInCart = pCart->GetNumEntries();
// Update the item count
wchar_t wszCount[16];
_snwprintf( wszCount, ARRAYSIZE( wszCount ), L"%d", pCart->GetTotalItems() );
wchar_t wzLocalized[32];
g_pVGuiLocalize->ConstructString_safe( wzLocalized, g_pVGuiLocalize->Find( "#Store_CartItems" ), 1, wszCount );
m_pClientArea->SetDialogVariable("storecart", wzLocalized );
// Create / Update all the item entries
if ( m_pItemEntries.Count() < iNumEntriesInCart )
{
for ( int i = m_pItemEntries.Count(); i < iNumEntriesInCart; i++ )
{
CCartViewItemEntry *pPanel = vgui::SETUP_PANEL( new CCartViewItemEntry( m_pItemListContainer, VarArgs("itementry%d", i) ) );
pPanel->ApplySettings( m_pItemEntryKVs );
m_pItemEntries.AddToTail( pPanel );
}
}
else
{
for ( int i = m_pItemEntries.Count()-1; i >= iNumEntriesInCart; i-- )
{
m_pItemEntries[i]->MarkForDeletion();
m_pItemEntries.Remove( i );
}
}
if ( m_pEmptyCartLabel )
{
m_pEmptyCartLabel->SetVisible( iNumEntriesInCart == 0 );
}
InvalidateLayout( true );
if ( !iNumEntriesInCart )
return;
bool bFeaturedImagePanelVisible = false;
// Set all the entries up
FOR_EACH_VEC( m_pItemEntries, i )
{
if ( i >= iNumEntriesInCart )
{
m_pItemEntries[i]->SetVisible( false );
continue;
}
cart_item_t *pCartItem = pCart->GetItem(i);
m_pItemEntries[i]->SetEntry( pCartItem, i );
m_pItemEntries[i]->SetVisible( true );
// If we're the featured item, show it
if ( pCartItem && pCartItem->pEntry == EconUI()->GetStorePanel()->GetFeaturedEntry() )
{
bFeaturedImagePanelVisible = true;
int iX, iY;
m_pItemEntries[i]->GetPos( iX, iY );
m_pFeaturedItemImage->SetPos( iX, iY + m_pItemEntries[i]->GetTall() - m_pFeaturedItemImage->GetTall() );
}
}
if ( m_pFeaturedItemImage->IsVisible() != bFeaturedImagePanelVisible )
{
m_pFeaturedItemImage->SetVisible( bFeaturedImagePanelVisible );
}
// Update total price
item_price_t unTotalPrice = pCart->GetTotalPrice();
wchar_t wzLocalizedPrice[ kLocalizedPriceSizeInChararacters ];
MakeMoneyString( wzLocalizedPrice, ARRAYSIZE( wzLocalizedPrice ), unTotalPrice, EconUI()->GetStorePanel()->GetCurrency() );
m_pPurchaseFooter->SetDialogVariable( "totalprice", wzLocalizedPrice );
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CStoreViewCartPanel::OnCommand( const char *command )
{
if ( !Q_stricmp( command, "close" ) )
{
ShowPanel( false );
}
else if ( !Q_strnicmp( command, "remove", 6 ) )
{
int iIndex = atoi(command+6);
if ( iIndex >= 0 && iIndex < m_pItemEntries.Count() )
{
CStoreCart *pCart = EconUI()->GetStorePanel()->GetCart();
pCart->RemoveFromCart( iIndex );
}
return;
}
else if ( !Q_stricmp( command, "checkout" ) )
{
EconUI()->GetStorePanel()->InitiateCheckout( false );
}
else
{
engine->ClientCmd( const_cast<char *>( command ) );
}
BaseClass::OnCommand( command );
}
static vgui::DHANDLE<CStoreViewCartPanel> g_StoreViewCartPanel;
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
CStoreViewCartPanel *OpenStoreViewCartPanel( void )
{
if (!g_StoreViewCartPanel.Get())
{
g_StoreViewCartPanel = vgui::SETUP_PANEL( new CStoreViewCartPanel( NULL ) );
g_StoreViewCartPanel->InvalidateLayout( false, true );
}
engine->ClientCmd_Unrestricted( "gameui_activate" );
g_StoreViewCartPanel->ShowPanel( true );
return g_StoreViewCartPanel;
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
CStoreViewCartPanel *GetStoreViewCartPanel( void )
{
return g_StoreViewCartPanel.Get();
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CCartViewItemEntry::SetEntry( cart_item_t *pEntry, int iEntryIndex )
{
m_pEntry = pEntry;
SetDialogVariable( "quantity", pEntry->iQuantity );
int iSubTotal = pEntry->GetDisplayPrice();
wchar_t wzLocalizedPrice[ kLocalizedPriceSizeInChararacters ];
MakeMoneyString( wzLocalizedPrice, ARRAYSIZE( wzLocalizedPrice ), iSubTotal, EconUI()->GetStorePanel()->GetCurrency() );
SetDialogVariable("price", wzLocalizedPrice );
CItemModelPanel *pItemPanel = dynamic_cast<CItemModelPanel*>( FindChildByName("itempanel") );
if ( pItemPanel )
{
CEconItemView ItemData;
ItemData.Init( pEntry->pEntry->GetItemDefinitionIndex(), AE_UNIQUE, AE_USE_SCRIPT_VALUE, true );
pItemPanel->SetItem( &ItemData );
}
CExButton *pRemoveButton = dynamic_cast<CExButton*>( FindChildByName("RemoveButton") );
if ( pRemoveButton )
{
pRemoveButton->SetCommand( VarArgs("remove%d",iEntryIndex) );
pRemoveButton->AddActionSignalTarget( GetStoreViewCartPanel() );
}
}