// RadialMenu.h // Copyright (c) 2006 Turtle Rock Studios, Inc. #ifndef RADIALMENU_H #define RADIALMENU_H #ifdef _WIN32 #pragma once #endif #include "viewport_panel_names.h" #include #include #include #include "hudelement.h" class CRadialButton; class C_Portal_Player; enum RadialMenuTypes_t { MENU_PING = 0, MENU_TAUNT, MENU_PLAYTEST, MENU_COUNT }; //-------------------------------------------------------------------------------------------------------- /** * Helper class for managing our list of possible menus. This means we can load RadialMenu.txt, * and add in additional menus from other text files (UserRadialMenu.txt?) */ class ClientMenuManager { public: ClientMenuManager() { m_menuKeys = NULL; } virtual ~ClientMenuManager() { Reset(); } void AddMenuFile( const char *filename ); virtual KeyValues *FindMenu( const char *menuName ); virtual void Flush( void ); void PrintStats( void ) { DevMsg( "Client menus:\n" ); for ( KeyValues *pKey = m_menuKeys->GetFirstTrueSubKey(); pKey; pKey = pKey->GetNextTrueSubKey() ) { DevMsg( "\t%s\n", pKey->GetName() ); } } protected: void Reset( void ) { if ( m_menuKeys ) { m_menuKeys->deleteThis(); } m_menuKeys = NULL; } KeyValues *m_menuKeys; }; class ClientMenuManagerPlaytest : public ClientMenuManager { public: ClientMenuManagerPlaytest() {} virtual ~ClientMenuManagerPlaytest() {} virtual KeyValues *FindMenu( const char *menuName ); virtual void Flush( void ); }; class CRadialMenuPanel : public vgui::Frame, public IViewPortPanel { private: DECLARE_CLASS_SIMPLE( CRadialMenuPanel, vgui::Frame ); public: CRadialMenuPanel(IViewPort *pViewPort); virtual ~CRadialMenuPanel() {} virtual const char *GetName( void ) { return PANEL_RADIAL_MENU; } virtual void SetData(KeyValues *data) {}; virtual void Reset() {} virtual void Update() {} virtual bool NeedsUpdate( void ) { return false; } virtual bool HasInputElements( void ) { return true; } virtual void ShowPanel( bool bShow ); virtual bool WantsBackgroundBlurred( void ) { return false; } // both vgui::Frame and IViewPortPanel define these, so explicitly define them here as passthroughs to vgui vgui::VPANEL GetVPanel( void ) { return BaseClass::GetVPanel(); } virtual bool IsVisible() { return BaseClass::IsVisible(); } virtual void SetParent( vgui::VPANEL parent ) { BaseClass::SetParent( parent ); } protected: IViewPort *m_pViewPort; }; //-------------------------------------------------------------------------------------------------------- /** * Viewport panel that gives us a simple rosetta menu */ class CRadialMenu : public CHudElement, public vgui::EditablePanel { public: DECLARE_CLASS_SIMPLE( CRadialMenu, vgui::EditablePanel ); CRadialMenu( const char *pElementName ); virtual ~CRadialMenu(); enum ButtonDir { CENTER = 0, NORTH, NORTH_EAST, EAST, SOUTH_EAST, SOUTH, SOUTH_WEST, WEST, NORTH_WEST, NUM_BUTTON_DIRS }; virtual void SetData( KeyValues *data ); //virtual KeyValues *GetData( void ) { return NULL; } bool IsFading( void ) { return IsVisible() && m_fading; } void StartFade( void ); void ChooseArmedButton(); void SetArmedButtonDir( ButtonDir dir ); void OnRadialMenuOpen( void ); virtual bool ShouldDraw() { return m_bEnabled; } virtual void ShowPanel( bool bShow ); virtual void OnMousePressed( vgui::MouseCode code ); virtual void OnMouseReleased( vgui::MouseCode code ); virtual void ApplySchemeSettings( vgui::IScheme *pScheme ); virtual void PerformLayout( void ); virtual void PaintBackground( void ); virtual void Paint( void ); virtual void OnCommand( const char *command ); virtual vgui::Panel *CreateControlByName( const char *controlName ); virtual void OnThink( void ); virtual void OnTick( void ); virtual int KeyInput( int down, ButtonCode_t keynum, const char *pszCurrentBinding ); void OnCursorEnteredButton( int x, int y, CRadialButton *button ); // For loading our internal data while using this menu void SetTargetEntity( EHANDLE hTargetEntity ) { m_hTargetEntity = hTargetEntity; } void SetTraceData( const Vector &vPosition, const Vector &vNormal ) { m_vPosition = vPosition; m_vNormal = vNormal; } void SetRadialType( RadialMenuTypes_t menuType ) { m_menuType = menuType; } void SetFadeInTime( float fFadeInTime ) { m_fFadeInTime = fFadeInTime; } void ClearLockInTime( void ) { m_fSelectionLockInTime = 0.0f; } void SetDemoCursorPos( int cursorX, int cursorY ) { m_demoCursorX = cursorX; m_demoCursorY = cursorY; } ButtonDir GetArmedDir( void ) const { return m_armedButtonDir; } bool m_bFirstCentering; static float m_fLastPingTime[ MAX_SPLITSCREEN_PLAYERS ][ 2 ]; static int m_nNumPings[ MAX_SPLITSCREEN_PLAYERS ][ 2 ]; void SetRadialMenuEnabled( bool bEnable ) { m_bEnabled = bEnable; } void SetQuickPingForceClose( bool bEnable ) { m_bQuickPingForceClose = bEnable; } protected: void ClearGlowEntity( void ); void SendCommand( const char *commandStr ); const char *ButtonNameFromDir( ButtonDir dir ); ButtonDir DirFromButtonName( const char * name ); CRadialButton *m_buttons[NUM_BUTTON_DIRS]; // same order as vgui::Label::Alignment ButtonDir m_armedButtonDir; void UpdateButtonBounds( void ); void HandleControlSettings(); void StartDrag( void ); void EndDrag( void ); CPanelAnimationVar( vgui::HFont, m_hCustomizeFont, "CustomizeFont", "Default" ); bool m_fading; float m_fadeStart; Color m_lineColor; KeyValues *m_resource; KeyValues *m_menuData; int m_nArrowTexture; int m_minButtonX; int m_minButtonY; int m_maxButtonX; int m_maxButtonY; // Internal data for holding our polling information Vector m_vPosition; Vector m_vNormal; EHANDLE m_hTargetEntity; int m_nEntityGlowIndex; RadialMenuTypes_t m_menuType; bool m_bEditing; bool m_bDragging; int m_nDraggingTaunt; float m_fFadeInTime; float m_fSelectionLockInTime; bool m_bEnabled; int m_cursorX; int m_cursorY; int m_demoCursorX; int m_demoCursorY; bool m_bQuickPingForceClose; }; bool IsRadialMenuOpen( void ); #endif // RADIALMENU_H