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.
424 lines
14 KiB
424 lines
14 KiB
//========= 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
|
|
|