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.
425 lines
14 KiB
425 lines
14 KiB
5 years ago
|
//========= Copyright Valve Corporation, All rights reserved. ============//
|
||
|
//
|
||
|
// Purpose:
|
||
|
//
|
||
|
// $NoKeywords: $
|
||
|
//=============================================================================//
|
||
|
|
||
|
#ifndef STORE_PAGE_H
|
||
|
#define STORE_PAGE_H
|
||
|
#ifdef _WIN32
|
||
|
#pragma once
|
||
|
#endif
|
||
|
|
||
|
#include <game/client/iviewport.h>
|
||
|
#include "vgui_controls/PropertyPage.h"
|
||
|
#include <vgui_controls/Button.h>
|
||
|
#include <vgui_controls/ComboBox.h>
|
||
|
#include <vgui_controls/ImagePanel.h>
|
||
|
#include "econ_controls.h"
|
||
|
#include "econ_ui.h"
|
||
|
#include "econ_store.h"
|
||
|
#include "item_model_panel.h"
|
||
|
#include "econ_storecategory.h"
|
||
|
|
||
|
class CItemModelPanel;
|
||
|
class CItemModelPanelToolTip;
|
||
|
class CStorePreviewItemPanel;
|
||
|
class CStoreItemControlsPanel;
|
||
|
|
||
|
#define FILTER_ALL_ITEMS 0
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose: Base class for the preview icons in the store's item preview panel
|
||
|
//-----------------------------------------------------------------------------
|
||
|
class CBaseStorePreviewIcon : public vgui::EditablePanel
|
||
|
{
|
||
|
DECLARE_CLASS_SIMPLE( CBaseStorePreviewIcon, vgui::EditablePanel );
|
||
|
public:
|
||
|
CBaseStorePreviewIcon( vgui::Panel *parent, const char *name ) : vgui::EditablePanel(parent,name)
|
||
|
{
|
||
|
REGISTER_COLOR_AS_OVERRIDABLE( m_colPanelBG, "panel_bgcolor" );
|
||
|
REGISTER_COLOR_AS_OVERRIDABLE( m_colPanelBGMouseover, "panel_bgcolor_mouseover" );
|
||
|
m_bHover = false;
|
||
|
m_bSelected = false;
|
||
|
}
|
||
|
|
||
|
void SetSelected( bool bSelected )
|
||
|
{
|
||
|
m_bSelected = bSelected;
|
||
|
UpdateBgColor();
|
||
|
}
|
||
|
|
||
|
void ApplySchemeSettings( vgui::IScheme *pScheme )
|
||
|
{
|
||
|
BaseClass::ApplySchemeSettings( pScheme );
|
||
|
SetBgColor( m_colPanelBG );
|
||
|
}
|
||
|
|
||
|
virtual void PerformLayout( void )
|
||
|
{
|
||
|
BaseClass::PerformLayout();
|
||
|
|
||
|
int iWide = GetWide() - (m_iImageIndent * 2);
|
||
|
int iTall = GetTall() - (m_iImageIndent * 2);
|
||
|
SetInternalImageBounds( m_iImageIndent, m_iImageIndent, iWide, iTall );
|
||
|
}
|
||
|
|
||
|
virtual void OnCursorEntered()
|
||
|
{
|
||
|
BaseClass::OnCursorEntered();
|
||
|
m_bHover = true;
|
||
|
UpdateBgColor();
|
||
|
}
|
||
|
virtual void OnCursorExited()
|
||
|
{
|
||
|
BaseClass::OnCursorExited();
|
||
|
m_bHover = false;
|
||
|
UpdateBgColor();
|
||
|
}
|
||
|
|
||
|
virtual void SetInternalImageBounds( int iX, int iY, int iWide, int iTall ) = 0;
|
||
|
|
||
|
private:
|
||
|
Color m_colPanelBG;
|
||
|
Color m_colPanelBGMouseover;
|
||
|
CPanelAnimationVarAliasType( int, m_iImageIndent, "image_indent", "0", "proportional_int" );
|
||
|
|
||
|
bool m_bHover;
|
||
|
bool m_bSelected;
|
||
|
|
||
|
void UpdateBgColor()
|
||
|
{
|
||
|
if ( m_bHover || m_bSelected )
|
||
|
{
|
||
|
SetBgColor( m_colPanelBGMouseover );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
SetBgColor( m_colPanelBG );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
};
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose: An item preview icon in the store's item preview panel
|
||
|
//-----------------------------------------------------------------------------
|
||
|
class CStorePreviewItemIcon : public CBaseStorePreviewIcon
|
||
|
{
|
||
|
DECLARE_CLASS_SIMPLE( CStorePreviewItemIcon, CBaseStorePreviewIcon );
|
||
|
public:
|
||
|
CStorePreviewItemIcon( vgui::Panel *parent, const char *name ) : CBaseStorePreviewIcon(parent,name)
|
||
|
{
|
||
|
m_pItemPanel = new CItemModelPanel( this, "itempanel" );
|
||
|
m_pItemPanel->AddActionSignalTarget( this );
|
||
|
m_pItemPanel->SendPanelEnterExits( true );
|
||
|
m_pItemPanel->SetActAsButton( true, true );
|
||
|
}
|
||
|
|
||
|
virtual void ApplySchemeSettings( vgui::IScheme *pScheme )
|
||
|
{
|
||
|
BaseClass::ApplySchemeSettings( pScheme );
|
||
|
vgui::EditablePanel *pTmp = dynamic_cast<vgui::EditablePanel*>( FindChildByName("bgblockout") );
|
||
|
if ( pTmp )
|
||
|
{
|
||
|
pTmp->SetMouseInputEnabled( false );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
virtual void OnCursorEntered()
|
||
|
{
|
||
|
BaseClass::OnCursorEntered();
|
||
|
PostActionSignal(new KeyValues("ShowItemIconMouseover", "icon", m_iIconIndex));
|
||
|
}
|
||
|
virtual void OnCursorExited()
|
||
|
{
|
||
|
BaseClass::OnCursorExited();
|
||
|
PostActionSignal(new KeyValues("HideItemIconMouseover"));
|
||
|
}
|
||
|
virtual void OnMouseReleased(vgui::MouseCode code)
|
||
|
{
|
||
|
BaseClass::OnMouseReleased(code);
|
||
|
PostActionSignal(new KeyValues("ItemIconSelected", "icon", m_iIconIndex));
|
||
|
}
|
||
|
|
||
|
MESSAGE_FUNC_PTR( OnItemPanelMouseReleased, "ItemPanelMouseReleased", panel );
|
||
|
|
||
|
virtual void SetInternalImageBounds( int iX, int iY, int iWide, int iTall )
|
||
|
{
|
||
|
m_pItemPanel->SetBounds( iX, iY, iWide, iTall );
|
||
|
}
|
||
|
|
||
|
MESSAGE_FUNC_PTR( OnItemPanelEntered, "ItemPanelEntered", panel )
|
||
|
{
|
||
|
BaseClass::OnCursorEntered();
|
||
|
}
|
||
|
|
||
|
MESSAGE_FUNC_PTR( OnItemPanelExited, "ItemPanelExited", panel )
|
||
|
{
|
||
|
BaseClass::OnCursorExited();
|
||
|
}
|
||
|
|
||
|
void SetItem( int iIconIndex, int iItemDef )
|
||
|
{
|
||
|
m_iIconIndex = iIconIndex;
|
||
|
|
||
|
CEconItemView itemData;
|
||
|
itemData.Init( iItemDef, AE_UNIQUE, AE_USE_SCRIPT_VALUE, true );
|
||
|
m_pItemPanel->SetItem( &itemData );
|
||
|
}
|
||
|
|
||
|
void SetItem( int iIconIndex, CEconItemView *pItem )
|
||
|
{
|
||
|
m_iIconIndex = iIconIndex;
|
||
|
m_pItemPanel->SetItem( pItem );
|
||
|
}
|
||
|
|
||
|
CItemModelPanel *GetItemPanel( void ) { return m_pItemPanel; }
|
||
|
|
||
|
private:
|
||
|
CItemModelPanel *m_pItemPanel;
|
||
|
int m_iIconIndex;
|
||
|
};
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
class CStoreItemControlsPanel;
|
||
|
class CStoreItemControlsPanel : public vgui::EditablePanel
|
||
|
{
|
||
|
public:
|
||
|
DECLARE_CLASS_SIMPLE( CStoreItemControlsPanel, vgui::EditablePanel );
|
||
|
|
||
|
CStoreItemControlsPanel( vgui::Panel *pParent, const char *pPanelName, CItemModelPanel *pItemModelPanel );
|
||
|
virtual ~CStoreItemControlsPanel() {}
|
||
|
|
||
|
void SetMouseHoverHandler( Panel *pHandler );
|
||
|
virtual void ApplySchemeSettings( vgui::IScheme *pScheme );
|
||
|
|
||
|
const econ_store_entry_t *GetItem() const;
|
||
|
void SetItem( const econ_store_entry_t *pEntry );
|
||
|
void SetButtonsVisible( bool bVisible );
|
||
|
|
||
|
virtual void OnCursorEntered();
|
||
|
virtual void OnCursorExited();
|
||
|
|
||
|
void OnItemPanelEntered();
|
||
|
void OnItemPanelExited();
|
||
|
|
||
|
virtual void OnThink();
|
||
|
virtual void OnCommand( const char *command );
|
||
|
|
||
|
CItemModelPanel *GetItemModelPanel() { return m_pItemModelPanel; }
|
||
|
|
||
|
protected:
|
||
|
CItemModelPanel *m_pItemModelPanel;
|
||
|
const econ_store_entry_t *m_pEntry;
|
||
|
bool m_bButtonsVisible;
|
||
|
bool m_bItemPanelEntered;
|
||
|
vgui::DHANDLE< Panel > m_pMouseHoverHandler;
|
||
|
};
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
class CStorePricePanel : public vgui::EditablePanel
|
||
|
{
|
||
|
public:
|
||
|
DECLARE_CLASS_SIMPLE( CStorePricePanel, vgui::EditablePanel );
|
||
|
|
||
|
CStorePricePanel( vgui::Panel *pParent, const char *pPanelName );
|
||
|
virtual ~CStorePricePanel();
|
||
|
|
||
|
virtual const char* GetPanelResFile();
|
||
|
virtual void ApplySchemeSettings( vgui::IScheme *pScheme );
|
||
|
virtual void PerformLayout();
|
||
|
|
||
|
void SetPriceText( int iPrice, const char *pVariable, const econ_store_entry_t *pEntry );
|
||
|
virtual void SetItem( const econ_store_entry_t *pEntry );
|
||
|
|
||
|
MESSAGE_FUNC_PARAMS( OnStoreItemControlsPanelHover, "StoreItemControlsPanelHover", data );
|
||
|
|
||
|
protected:
|
||
|
bool m_bOldDiscountVisibility;
|
||
|
CExLabel *m_pPrice;
|
||
|
CExLabel *m_pDiscount;
|
||
|
CExLabel *m_pNew;
|
||
|
CExLabel *m_pHighlighted;
|
||
|
CExLabel *m_pSale;
|
||
|
EditablePanel *m_pSaleBorder;
|
||
|
CExLabel *m_pOGPrice;
|
||
|
Panel *m_pCrossout;
|
||
|
Panel *m_pLimited;
|
||
|
};
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
class CStorePage : public vgui::PropertyPage, public CGameEventListener
|
||
|
{
|
||
|
DECLARE_CLASS_SIMPLE( CStorePage, vgui::PropertyPage );
|
||
|
public:
|
||
|
CStorePage( Panel *parent, const CEconStoreCategoryManager::StoreCategory_t *pPageData, const char *pPreviewItemResFile = NULL );
|
||
|
virtual ~CStorePage();
|
||
|
|
||
|
virtual void OnPostCreate();
|
||
|
|
||
|
virtual void ApplySchemeSettings( vgui::IScheme *pScheme );
|
||
|
virtual void ApplySettings( KeyValues *inResourceData );
|
||
|
virtual void OnCommand( const char *command );
|
||
|
virtual void PerformLayout( void );
|
||
|
virtual void FireGameEvent( IGameEvent *event );
|
||
|
virtual void OnMouseWheeled( int delta );
|
||
|
|
||
|
virtual CStorePricePanel* CreatePricePanel( int iIndex );
|
||
|
|
||
|
void SetBorderForItem( CItemModelPanel *pItemPanel, bool bMouseOver );
|
||
|
void CalculateItemButtonPos( CItemModelPanel *pItemPanel, int x, int y, int *iXPos, int *iYPos );
|
||
|
int AssignItemToPanel( CItemModelPanel *pPanel, int iIndex );
|
||
|
void PositionItemPanel( CItemModelPanel *pPanel, int iIndex );
|
||
|
|
||
|
void UpdateModelPanels( void );
|
||
|
virtual void UpdateSelectionInfoPanel( void );
|
||
|
void UpdateCart( void );
|
||
|
void AddSelectionToCart( void );
|
||
|
void PreviewSelectionItem( void );
|
||
|
void DoPreviewItem( item_definition_index_t usItemDef );
|
||
|
const econ_store_entry_t *GetSelectedEntry( void );
|
||
|
|
||
|
int GetNumItemPanels( void ) { return m_iItemPanels; }
|
||
|
int GetNumColumns( void ) { return m_iItemColumns; }
|
||
|
int GetNumPages( void );
|
||
|
virtual void ShowPreview( int iClass, const econ_store_entry_t* pEntry );
|
||
|
void SetDetailsVisible( bool bVisible );
|
||
|
|
||
|
const char* GetPageName( void ) { return m_pPageData ? m_pPageData->m_pchName : NULL; }
|
||
|
|
||
|
virtual bool FindAndSelectEntry( const econ_store_entry_t *pEntry );
|
||
|
|
||
|
CItemModelPanelToolTip *GetItemTooltip( void ) { return m_pMouseOverTooltip; }
|
||
|
|
||
|
MESSAGE_FUNC( OnPageShow, "PageShow" );
|
||
|
MESSAGE_FUNC_PTR( OnItemPanelMouseReleased, "ItemPanelMouseReleased", panel ); // Comes from CStoreItemControlsPanel
|
||
|
MESSAGE_FUNC_PTR( OnItemPanelMouseDoublePressed, "ItemPanelMouseDoublePressed", panel );
|
||
|
MESSAGE_FUNC_PTR( OnItemPanelEntered, "ItemPanelEntered", panel );
|
||
|
MESSAGE_FUNC_PTR( OnItemPanelExited, "ItemPanelExited", panel );
|
||
|
MESSAGE_FUNC_PTR( OnItemAddToCart, "ItemAddToCart", panel );
|
||
|
MESSAGE_FUNC_PARAMS( OnTextChanged, "TextChanged", data );
|
||
|
MESSAGE_FUNC_PARAMS( OnPreviewItem, "PreviewItem", data );
|
||
|
|
||
|
virtual const char *GetPageResFile();
|
||
|
virtual CStorePreviewItemPanel *CreatePreviewPanel( void );
|
||
|
|
||
|
protected:
|
||
|
// Filtering
|
||
|
virtual bool DoesEntryFilterPassSecondaryFilter( const econ_store_entry_t *pEntry ) { return true; } // Allow derived classes to add an additional
|
||
|
virtual void UpdateFilteredItems( void );
|
||
|
virtual int GetNumPrimaryFilters( void ) { return 1; } // All Items
|
||
|
void SetFilter( int iFilter );
|
||
|
virtual void UpdateFilterComboBox( void );
|
||
|
virtual void GetFiltersForDef( GameItemDefinition_t *pDef, CUtlVector<int> *pVecFilters ) { pVecFilters->AddToTail( FILTER_ALL_ITEMS ); }
|
||
|
|
||
|
static int ItemDisplayOrderSort_UseSortOverride( const econ_store_entry_t *const *ppA, const econ_store_entry_t *const *ppB );
|
||
|
virtual void OrderItemsForDisplay( CUtlVector<const econ_store_entry_t *>& vecItems ) const;
|
||
|
|
||
|
protected:
|
||
|
void CreateItemPanels( void );
|
||
|
void DeSelectAllItemPanels( void );
|
||
|
void ToggleSelectItemPanel( CItemModelPanel *pPanel );
|
||
|
void SelectItemPanel( CItemModelPanel *pPanel );
|
||
|
void UpdateBackpackLabel( void );
|
||
|
bool IsHomePage( void ) { return m_pPageData && m_pPageData->m_bIsHome; }
|
||
|
|
||
|
protected:
|
||
|
const CEconStoreCategoryManager::StoreCategory_t *m_pPageData;
|
||
|
CStorePreviewItemPanel *m_pPreviewPanel;
|
||
|
const char *m_pPreviewItemResFile;
|
||
|
vgui::EditablePanel *m_pItemDetailsButtonPanel;
|
||
|
vgui::EditablePanel *m_pItemPreviewButtonPanel;
|
||
|
|
||
|
// Filtering
|
||
|
CUtlVector< const econ_store_entry_t* > m_FilteredEntries;
|
||
|
vgui::ComboBox *m_pFilterComboBox;
|
||
|
int m_iCurrentFilter;
|
||
|
|
||
|
// Selection info panel
|
||
|
int m_iSelectedItemDef;
|
||
|
int m_iOldSelectedItemDef;
|
||
|
int m_iSelectDefOnPageShow;
|
||
|
int m_iSelectPageOnPageShow;
|
||
|
CItemModelPanel *m_pSelectedPanel;
|
||
|
CItemModelPanel *m_pFeaturedItemPanel;
|
||
|
Color m_colBackpackOrg;
|
||
|
|
||
|
// Item model panels
|
||
|
struct item_panel
|
||
|
{
|
||
|
CItemModelPanel* m_pItemModelPanel;
|
||
|
CStorePricePanel* m_pStorePricePanel;
|
||
|
CStoreItemControlsPanel* m_pItemControlsPanel;
|
||
|
};
|
||
|
CUtlVector<item_panel> m_vecItemPanels;
|
||
|
CUtlVector<int> m_EntryIndices; // Easy lookup for which model panel is mapped to which entry index
|
||
|
CItemModelPanel *m_pMouseOverItemPanel;
|
||
|
CItemModelPanelToolTip *m_pMouseOverTooltip;
|
||
|
KeyValues *m_pItemModelPanelKVs;
|
||
|
KeyValues *m_pModelPanelLabelsKVs;
|
||
|
bool m_bReapplyItemKVs;
|
||
|
|
||
|
// Cart display
|
||
|
CExButton *m_pCartButton;
|
||
|
CUtlVector<CItemModelPanel*> m_pCartModelPanels;
|
||
|
KeyValues *m_pCartModelPanelKVs;
|
||
|
CUtlVector<CExLabel*> m_pCartQuantityLabels;
|
||
|
KeyValues *m_pCartQuantityLabelKVs;
|
||
|
vgui::ImagePanel *m_pCartFeaturedItemImage;
|
||
|
|
||
|
// Pages
|
||
|
int m_iCurrentPage;
|
||
|
vgui::Label *m_pCurPageLabel;
|
||
|
CExButton *m_pNextPageButton;
|
||
|
CExButton *m_pPrevPageButton;
|
||
|
|
||
|
CExButton *m_pCheckoutButton;
|
||
|
CExButton *m_pPreviewItemButton;
|
||
|
vgui::EditablePanel *m_pAddToCartButtonPanel;
|
||
|
vgui::Label *m_pBackpackLabel;
|
||
|
vgui::EditablePanel *m_pItemBackdropPanel;
|
||
|
|
||
|
bool m_bShouldDeletePreviewPanel; // Set to true by derived classes if the preview panel's panel should be deleted, which is necessary if its parent is NULL
|
||
|
|
||
|
CPanelAnimationVarAliasType( int, m_iItemOffcenterX, "item_offcenter_x", "0", "proportional_int" );
|
||
|
CPanelAnimationVarAliasType( int, m_iItemXDelta, "item_xdelta", "0", "proportional_int" );
|
||
|
CPanelAnimationVarAliasType( int, m_iItemYDelta, "item_ydelta", "0", "proportional_int" );
|
||
|
CPanelAnimationVarAliasType( int, m_iItemXPos, "item_xpos", "0", "proportional_int" );
|
||
|
CPanelAnimationVarAliasType( int, m_iItemYPos, "item_ypos", "0", "proportional_int" );
|
||
|
CPanelAnimationVar( int, m_iItemPanels, "item_panels", "35" );
|
||
|
CPanelAnimationVar( int, m_iItemColumns, "item_columns", "7" );
|
||
|
CPanelAnimationVar( bool, m_bShowItemBgPanel, "show_item_backdrop", "0" );
|
||
|
CPanelAnimationVarAliasType( int, m_iItemBackdropLeftMargin, "item_backdrop_left_margin", "20", "proportional_xpos" );
|
||
|
CPanelAnimationVarAliasType( int, m_iItemBackdropRightMargin, "item_backdrop_right_margin", "20", "proportional_xpos" );
|
||
|
CPanelAnimationVarAliasType( int, m_iItemBackdropTopMargin, "item_backdrop_top_margin", "20", "proportional_ypos" );
|
||
|
CPanelAnimationVarAliasType( int, m_iItemBackdropBottomMargin, "item_backdrop_bottom_margin", "20", "proportional_ypos" );
|
||
|
CPanelAnimationVar( int, m_iItemBackdropPaintBackgroundType, "item_backdrop_paintbackgroundtype", "50" );
|
||
|
CPanelAnimationVar( int, m_iItemBackdropZPos, "item_backdrop_zpos", "0" );
|
||
|
CPanelAnimationVarAliasType( int, m_iItemControlsXOffset, "item_controls_xoffset", "5", "proportional_xpos" );
|
||
|
CPanelAnimationVarAliasType( int, m_iItemControlsYOffset, "item_controls_yoffset", "5", "proportional_xpos" );
|
||
|
CPanelAnimationVar( int, m_iMaxCartModelPanels, "max_cart_model_panels", "10" );
|
||
|
|
||
|
Color m_colItemPanelBG;
|
||
|
Color m_colItemPanelBGMouseover;
|
||
|
Color m_colItemPanelBGSelected;
|
||
|
Color m_colItemBackdropPanel;
|
||
|
|
||
|
// The number of items in each filter options
|
||
|
CUtlVector<int> m_vecFilterCounts;
|
||
|
|
||
|
bool m_bFilterDirty;
|
||
|
};
|
||
|
|
||
|
void AddItemToCartHelper( const char *pszContext, const econ_store_entry_t *pEntry, ECartItemType eSelectedCartItemType );
|
||
|
void AddItemToCartHelper( const char *pszContext, item_definition_index_t unItemDef, ECartItemType eSelectedCartItemType );
|
||
|
|
||
|
#endif // STORE_PAGE_H
|