summaryrefslogtreecommitdiff
path: root/game/client/econ/item_style_select_dialog.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'game/client/econ/item_style_select_dialog.cpp')
-rw-r--r--game/client/econ/item_style_select_dialog.cpp209
1 files changed, 209 insertions, 0 deletions
diff --git a/game/client/econ/item_style_select_dialog.cpp b/game/client/econ/item_style_select_dialog.cpp
new file mode 100644
index 0000000..0bcba8f
--- /dev/null
+++ b/game/client/econ/item_style_select_dialog.cpp
@@ -0,0 +1,209 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+//=============================================================================//
+
+
+#include "cbase.h"
+#include "vgui_controls/EditablePanel.h"
+#include "vgui_controls/ComboBox.h"
+#include "econ_item_system.h"
+#include "econ_item_constants.h"
+#include "item_style_select_dialog.h"
+#include "econ_gcmessages.h"
+#include "backpack_panel.h"
+#include "econ_ui.h"
+#include "gc_clientsystem.h"
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include <tier0/memdbgon.h>
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+CComboBoxBackpackOverlayDialogBase::CComboBoxBackpackOverlayDialogBase( vgui::Panel *parent, CEconItemView *pItem )
+ : vgui::EditablePanel( parent, "ComboBoxBackpackOverlayDialogBase" )
+ , m_pPreviewModelPanel( NULL )
+ , m_pItem( pItem )
+{
+ if ( m_pItem )
+ {
+ m_pPreviewModelPanel = new CItemModelPanel( this, "preview_model" );
+ m_pPreviewModelPanel->SetItem( m_pItem );
+ }
+
+ m_pComboBox = new vgui::ComboBox( this, "ComboBox", 5, false );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CComboBoxBackpackOverlayDialogBase::ApplySchemeSettings( vgui::IScheme *pScheme )
+{
+ LoadControlSettings( "Resource/UI/econ/ComboBoxBackpackOverlayDialog.res" );
+
+ BaseClass::ApplySchemeSettings( pScheme );
+
+ if ( m_pPreviewModelPanel )
+ {
+ if ( m_pPreviewModelPanel && m_pItem )
+ {
+ m_pPreviewModelPanel->SetItem( m_pItem );
+ }
+
+ m_pPreviewModelPanel->SetActAsButton( true, false );
+ }
+
+ if ( m_pComboBox )
+ {
+ m_pComboBox->RemoveAll();
+
+ vgui::HFont hFont = pScheme->GetFont( "HudFontSmallestBold", true );
+ m_pComboBox->SetFont( hFont );
+
+ PopulateComboBoxOptions();
+
+ m_pComboBox->AddActionSignalTarget( this );
+ }
+
+ CExLabel *pTitleLabel = dynamic_cast<CExLabel *>( FindChildByName( "TitleLabel" ) );
+ if ( pTitleLabel )
+ {
+ pTitleLabel->SetText( GetTitleLabelLocalizationToken() );
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CComboBoxBackpackOverlayDialogBase::OnCommand( const char *command )
+{
+ if ( !Q_strnicmp( command, "cancel", 6 ) )
+ {
+ TFModalStack()->PopModal( this );
+
+ SetVisible( false );
+ MarkForDeletion();
+ }
+ else if ( !Q_strnicmp( command, "apply", 5 ) )
+ {
+ OnComboBoxApplication();
+
+ TFModalStack()->PopModal( this );
+
+ SetVisible( false );
+ MarkForDeletion();
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CComboBoxBackpackOverlayDialogBase::Show()
+{
+ SetVisible( true );
+ MakePopup();
+ MoveToFront();
+ SetKeyBoardInputEnabled( true );
+ SetMouseInputEnabled( true );
+ TFModalStack()->PushModal( this );
+
+ // Special-case the path where we only wind up with one option in the combo box. If
+ // this happens we just pretend the user selected it and move on to the next step. For
+ // restoration, this will bring up a confirmation dialog, and for setting styles... well,
+ // we'd expect it to never happen because the option to bring up the UI wouldn't be enabled
+ // if there was only a single style.
+ if ( m_pComboBox && m_pComboBox->GetItemCount() == 1 )
+ {
+ OnCommand( "apply" );
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Called when text changes in combo box
+//-----------------------------------------------------------------------------
+void CComboBoxBackpackOverlayDialogBase::OnTextChanged( KeyValues *data )
+{
+ if ( !m_pComboBox )
+ return;
+
+ Panel *pPanel = reinterpret_cast<vgui::Panel *>( data->GetPtr("panel") );
+ vgui::ComboBox *pComboBox = dynamic_cast<vgui::ComboBox *>( pPanel );
+
+ if ( pComboBox == m_pComboBox )
+ {
+ OnComboBoxChanged( m_pComboBox->GetActiveItem() );
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CStyleSelectDialog::PopulateComboBoxOptions()
+{
+ CEconItemView* pItem = GetPreviewModelPanel()->GetItem();
+ Assert( pItem );
+
+ if ( pItem->GetStaticData()->GetNumStyles() )
+ {
+ KeyValues *pKeyValues = new KeyValues( "data" );
+ for ( style_index_t i=0; i<pItem->GetStaticData()->GetNumStyles(); i++ )
+ {
+ const CEconStyleInfo *pStyle = pItem->GetStaticData()->GetStyleInfo( i );
+ if ( pStyle && pStyle->IsSelectable() )
+ {
+ pKeyValues->SetInt( "style_index", i );
+ GetComboBox()->AddItem( pItem->GetStaticData()->GetStyleInfo( i )->GetName(), pKeyValues );
+ }
+ }
+ pKeyValues->deleteThis();
+
+ GetComboBox()->ActivateItemByRow( pItem->GetItemStyle() );
+ }
+ else
+ {
+ GetComboBox()->ActivateItemByRow( 0 );
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CStyleSelectDialog::OnComboBoxApplication()
+{
+ KeyValues *pKV = GetComboBox()->GetActiveItemUserData();
+ int iNewStyle = pKV->GetInt( "style_index", 0 );
+ CEconItemView* pItem = GetPreviewModelPanel()->GetItem();
+
+ if ( pItem )
+ {
+ const char* pszStyleName = pItem->GetStaticData()->GetStyleInfo( iNewStyle )->GetName();
+
+ // Tell the GC to update the style.
+ GCSDK::CGCMsg< MsgGCSetItemStyle_t > msg( k_EMsgGCSetItemStyle );
+ msg.Body().m_unItemID = pItem->GetItemID();
+ msg.Body().m_iStyle = iNewStyle;
+ GCClientSystem()->BSendMessage( msg );
+
+ EconUI()->Gamestats_ItemTransaction( IE_ITEM_CHANGED_STYLE, pItem, pszStyleName /* stored unlocalized here intentionally */, iNewStyle );
+
+ // Tell our parent about the change
+ if ( pItem && pItem->IsValid() )
+ {
+ KeyValues *pKey = new KeyValues( "SelectionReturned" );
+ pKey->SetUint64( "itemindex", pItem->GetItemID() );
+ PostMessage( GetParent(), pKey );
+ }
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CStyleSelectDialog::OnComboBoxChanged( int iNewSelection )
+{
+ GetPreviewModelPanel()->SetItemStyle( GetComboBox()->GetActiveItem() );
+ GetPreviewModelPanel()->UpdatePanels();
+} \ No newline at end of file