//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // // $NoKeywords: $ //=============================================================================// #ifndef TF_CONTROLS_H #define TF_CONTROLS_H #ifdef _WIN32 #pragma once #endif #include #include #include #include #include #include #include #include #include #include "utlvector.h" #include "vgui_controls/PHandle.h" #include #include "econ_controls.h" #include "sc_hinticon.h" #if defined( TF_CLIENT_DLL ) #include "tf_shareddefs.h" #include "tf_imagepanel.h" #endif #include #include <../common/GameUI/scriptobject.h> #include #include #include wchar_t* LocalizeNumberWithToken( const char* pszLocToken, int nValue ); //----------------------------------------------------------------------------- // Purpose: Xbox-specific panel that displays button icons text labels //----------------------------------------------------------------------------- class CTFFooter : public vgui::EditablePanel { DECLARE_CLASS_SIMPLE( CTFFooter, vgui::EditablePanel ); public: CTFFooter( Panel *parent, const char *panelName ); virtual ~CTFFooter(); virtual void ApplySchemeSettings( vgui::IScheme *pScheme ); virtual void ApplySettings( KeyValues *pResourceData ); virtual void Paint( void ); virtual void PaintBackground( void ); void ShowButtonLabel( const char *name, bool show = true ); void AddNewButtonLabel( const char *name, const char *text, const char *icon ); void ClearButtons(); private: struct FooterButton_t { bool bVisible; char name[MAX_PATH]; wchar_t text[MAX_PATH]; wchar_t icon[3]; // icon can be one or two characters }; CUtlVector< FooterButton_t* > m_Buttons; bool m_bPaintBackground; // fill the background? int m_nButtonGap; // space between buttons int m_FooterTall; // height of the footer int m_ButtonOffsetFromTop; // how far below the top the buttons should be drawn int m_ButtonSeparator; // space between the button icon and text int m_TextAdjust; // extra adjustment for the text (vertically)...text is centered on the button icon and then this value is applied bool m_bCenterHorizontal; // center buttons horizontally? int m_ButtonPinRight; // if not centered, this is the distance from the right margin that we use to start drawing buttons (right to left) char m_szTextFont[64]; // font for the button text char m_szButtonFont[64]; // font for the button icon char m_szFGColor[64]; // foreground color (text) char m_szBGColor[64]; // background color (fill color) vgui::HFont m_hButtonFont; vgui::HFont m_hTextFont; }; //----------------------------------------------------------------------------- // Purpose: Tooltip for the main menu. Isn't a panel, it just wraps the // show/hide/position handling for the embedded panel. //----------------------------------------------------------------------------- class CMainMenuToolTip : public vgui::BaseTooltip { DECLARE_CLASS_SIMPLE( CMainMenuToolTip, vgui::BaseTooltip ); public: CMainMenuToolTip(vgui::Panel *parent, const char *text = NULL) : vgui::BaseTooltip( parent, text ) { m_pEmbeddedPanel = NULL; } virtual ~CMainMenuToolTip() {} virtual void SetText(const char *text); const char *GetText() { return NULL; } virtual void HideTooltip(); virtual void PerformLayout(); void SetEmbeddedPanel( vgui::EditablePanel *pPanel ) { m_pEmbeddedPanel = pPanel; } protected: vgui::EditablePanel *m_pEmbeddedPanel; }; //----------------------------------------------------------------------------- // Purpose: Simple TF-styled text tooltip //----------------------------------------------------------------------------- class CTFTextToolTip : public CMainMenuToolTip { DECLARE_CLASS_SIMPLE( CTFTextToolTip, CMainMenuToolTip ); public: CTFTextToolTip(vgui::Panel *parent, const char *text = NULL) : CMainMenuToolTip( parent, text ) { } virtual void PerformLayout(); virtual void PositionWindow( vgui::Panel *pTipPanel ); virtual void SetText(const char *text) { _isDirty = true; BaseClass::SetText( text ); } }; //----------------------------------------------------------------------------- // Purpose: Displays a TF specific list of options // This is essentially a TF-styled version of the GameUI Advanced Multiplayer Options Dialog //----------------------------------------------------------------------------- class CTFAdvancedOptionsDialog : public vgui::EditablePanel { DECLARE_CLASS_SIMPLE( CTFAdvancedOptionsDialog, vgui::EditablePanel ); public: CTFAdvancedOptionsDialog(vgui::Panel *parent); ~CTFAdvancedOptionsDialog(); virtual void ApplySchemeSettings( vgui::IScheme *pScheme ); virtual void ApplySettings( KeyValues *pResourceData ); void Deploy( void ); private: void CreateControls(); void DestroyControls(); void GatherCurrentValues(); void SaveValues(); virtual void OnCommand( const char *command ); virtual void OnClose(); virtual void OnKeyCodeTyped(vgui::KeyCode code); virtual void OnKeyCodePressed(vgui::KeyCode code); private: CInfoDescription *m_pDescription; mpcontrol_t *m_pList; vgui::PanelListPanel *m_pListPanel; CTFTextToolTip *m_pToolTip; vgui::EditablePanel *m_pToolTipEmbeddedPanel; CPanelAnimationVarAliasType( int, m_iControlW, "control_w", "0", "proportional_int" ); CPanelAnimationVarAliasType( int, m_iControlH, "control_h", "0", "proportional_int" ); CPanelAnimationVarAliasType( int, m_iSliderW, "slider_w", "0", "proportional_int" ); CPanelAnimationVarAliasType( int, m_iSliderH, "slider_h", "0", "proportional_int" ); }; //----------------------------------------------------------------------------- // Purpose: Scrollable panel where you can define children within the .res file //----------------------------------------------------------------------------- class CExScrollingEditablePanel : public vgui::EditablePanel { DECLARE_CLASS_SIMPLE( CExScrollingEditablePanel, vgui::EditablePanel ); public: CExScrollingEditablePanel( Panel *pParent, const char *pszName ); virtual ~CExScrollingEditablePanel(); virtual void ApplySettings( KeyValues *inResourceData ) OVERRIDE; virtual void PerformLayout() OVERRIDE; virtual void OnSizeChanged( int newWide, int newTall ) OVERRIDE; MESSAGE_FUNC( OnScrollBarSliderMoved, "ScrollBarSliderMoved" ); virtual void OnMouseWheeled( int delta ) OVERRIDE; // respond to mouse wheel events void ResetScrollAmount() { m_nLastScrollValue = 0; m_pScrollBar->SetValue(0); } protected: void ShiftChildren( int nDistance ); vgui::ScrollBar *m_pScrollBar; int m_nLastScrollValue; bool m_bUseMouseWheelToScroll; CPanelAnimationVarAliasType( int, m_iScrollStep, "scroll_step", "10", "proportional_xpos" ); CPanelAnimationVarAliasType( int, m_iBottomBuffer, "bottom_buffer", "0", "proportional_int" ); CPanelAnimationVarAliasType( int, m_bRestrictWidth, "restrict_width", "1", "proportional_int" ); }; //----------------------------------------------------------------------------- // An extension of CExScrollingEditablePanel where panels can be added to form // a list. //----------------------------------------------------------------------------- class CScrollableList : public CExScrollingEditablePanel { DECLARE_CLASS_SIMPLE( CScrollableList, CExScrollingEditablePanel ); public: CScrollableList( Panel* pParent, const char* pszName ) : CExScrollingEditablePanel( pParent, pszName ) {} virtual ~CScrollableList(); virtual void PerformLayout() OVERRIDE; void AddPanel( Panel* pPanel, int nGap ); void ClearAutoLayoutPanels(); private: struct LayoutInfo_t { Panel* m_pPanel; int m_nGap; }; CUtlVector< LayoutInfo_t > m_vecAutoLayoutPanels; }; //----------------------------------------------------------------------------- // A checkbox where keyvalue data can be stored and retrieved (typically in OnCheckButtonChecked) // so that you don't need a pointer to the checkbox in order to determine WHICH // checkbox got checked. //----------------------------------------------------------------------------- class CExCheckButton : public vgui::CheckButton { DECLARE_CLASS_SIMPLE( CExCheckButton, vgui::CheckButton ); public: CExCheckButton( Panel* pParent, const char* pszName ) : BaseClass( pParent, pszName, NULL ) , m_pKVData( NULL ) {} virtual ~CExCheckButton() { if ( m_pKVData ) m_pKVData->deleteThis(); } void SetData( KeyValues* pKVData ) { if ( m_pKVData ) { m_pKVData->deleteThis(); m_pKVData = NULL; } m_pKVData = pKVData; } KeyValues* GetData() const { return m_pKVData; } private: KeyValues *m_pKVData; }; class CExpandablePanel : public vgui::EditablePanel { DECLARE_CLASS_SIMPLE( CExpandablePanel, vgui::EditablePanel ); public: CExpandablePanel( Panel* pParent, const char* pszName ); virtual void OnCommand( const char *command ) OVERRIDE; virtual void OnThink() OVERRIDE; virtual void OnToggleCollapse( bool bIsExpanded ) {} void SetCollapsed( bool bCollapsed ); void ToggleCollapse(); bool BIsExpanded() const { return m_bExpanded; } void SetExpandedHeight( int nNewHeight ); float GetPercentAnimated() const; protected: CPanelAnimationVarAliasType( float, m_flResizeTime, "resize_time", "0.4", "float" ); CPanelAnimationVarAliasType( int, m_nCollapsedHeight, "collapsed_height", "17", "proportional_int" ); CPanelAnimationVarAliasType( int, m_nExpandedHeight, "expanded_height", "50", "proportional_int" ); private: bool m_bExpanded; float m_flAnimEndTime; }; #endif // TF_CONTROLS_H