//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // // $NoKeywords: $ //===========================================================================// #include "client_pch.h" #include "ivideomode.h" #include "vgui_DebugSystemPanel.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "tier1/CommandBuffer.h" #include "tier1/tier1.h" // memdbgon must be the last include file in a .cpp file!!! #include "tier0/memdbgon.h" using namespace vgui; //----------------------------------------------------------------------------- // Purpose: A menu button that knows how to parse cvar/command menu data from gamedir\scripts\debugmenu.txt //----------------------------------------------------------------------------- class CDebugMenuButton : public MenuButton { typedef MenuButton BaseClass; public: // Construction CDebugMenuButton( Panel *parent, const char *panelName, const char *text ); private: // Menu associated with this button Menu *m_pMenu; }; class CDebugCommandButton : public vgui::Button { typedef vgui::Button BaseClass; public: CDebugCommandButton( vgui::Panel *parent, const char *panelName, const char *labelText, const char *command ) : BaseClass( parent, panelName, labelText ) { AddActionSignalTarget( this ); SetCommand( command ); } virtual void OnCommand( const char *command ) { Cbuf_AddText( va( "%s\n", (char *)command ) ); } virtual void OnTick( void ) { } }; class CDebugCommandCheckbox : public vgui::CheckButton { typedef vgui::CheckButton BaseClass; public: CDebugCommandCheckbox( vgui::Panel *parent, const char *panelName, const char *labelText, const char *command ) : BaseClass( parent, panelName, labelText ) { m_pVar = ( ConVar * )g_pCVar->FindVar( command ); SetCommand( command ); AddActionSignalTarget( this ); } virtual void OnCommand( const char *command ) { if ( m_pVar ) { Cbuf_AddText( va( "%s %d\n", m_pVar->GetName(), !m_pVar->GetInt() ) ); } } private: ConVar *m_pVar; }; class CDebugIncrementCVarButton : public vgui::Button { typedef vgui::Button BaseClass; public: CDebugIncrementCVarButton( vgui::Panel *pParent, const char *pPanelName, const char *pLabelText, const char *pCommand ) : BaseClass( pParent, pPanelName, pLabelText ) { CCommand args; args.Tokenize( pCommand ); m_pVar = NULL; if ( args.ArgC() >= 4 ) { m_pVar = ( ConVar * )g_pCVar->FindVar( args[0] ); m_flMinvalue = (float)atof( args[1] ); m_flMaxvalue = (float)atof( args[2] ); m_flIncrement = (float)atof( args[3] ); } SetCommand( "increment" ); AddActionSignalTarget( this ); m_flPreviousValue = -9999.0f; OnTick(); } virtual void OnCommand( const char *command ) { // if ( !m_pVar ) return; float curValue = m_pVar->GetFloat(); curValue += m_flIncrement; if ( curValue > m_flMaxvalue ) { curValue = m_flMinvalue; } else if ( curValue < m_flMinvalue ) { curValue = m_flMaxvalue; } m_pVar->SetValue( curValue ); } virtual void OnTick( void ) { if ( !m_pVar ) return; if ( m_pVar->GetFloat() == m_flPreviousValue ) return; char sz[ 512 ]; Q_snprintf( sz, sizeof( sz ), "%s %.2f", m_pVar->GetName(), m_pVar->GetFloat() ); SetText( sz ); SizeToContents(); m_flPreviousValue = m_pVar->GetFloat(); } private: ConVar *m_pVar; float m_flMinvalue; float m_flMaxvalue; float m_flIncrement; float m_flPreviousValue; }; class CDebugOptionsPage : public vgui::PropertyPage { typedef vgui::PropertyPage BaseClass; public: CDebugOptionsPage ( vgui::Panel *parent, const char *panelName ) : BaseClass( parent, panelName ) { vgui::ivgui()->AddTickSignal( GetVPanel(), 250 ); } virtual void OnTick( void ) { BaseClass::OnTick(); if ( !IsVisible() ) return; int c = m_LayoutItems.Count(); for ( int i = 0; i < c; i++ ) { vgui::Panel *p = m_LayoutItems[ i ]; p->OnTick(); } } virtual void PerformLayout( void ) { BaseClass::PerformLayout(); int c = m_LayoutItems.Count(); int x = 5; int y = 5; int w = 150; int h = 18; int gap = 2; int tall = GetTall(); // LoadControlSettings( va( "resource\\%s.res", kv->GetName() ) ); for ( int i = 0; i < c; i++ ) { vgui::Panel *p = m_LayoutItems[ i ]; p->SetBounds( x, y, w, h ); y += ( h + gap ); if ( y >= tall - h ) { x += ( w + gap ); y = 5; } } } void Init( KeyValues *kv ) { // LoadControlSettings( va( "resource\\%s.res", kv->GetName() ) ); for (KeyValues *control = kv->GetFirstSubKey(); control != NULL; control = control->GetNextKey()) { const char *t; t = control->GetString( "command", "" ); if ( t && t[0] ) { CDebugCommandButton *btn = new CDebugCommandButton( this, "CommandButton", control->GetName(), t ); m_LayoutItems.AddToTail( btn ); continue; } t = control->GetString( "togglecvar", "" ); if ( t && t[0] ) { CDebugCommandCheckbox *checkbox = new CDebugCommandCheckbox( this, "CommandCheck", control->GetName(), t ); m_LayoutItems.AddToTail( checkbox ); continue; } t = control->GetString( "incrementcvar", "" ); if ( t && t[0] ) { CDebugIncrementCVarButton *increment = new CDebugIncrementCVarButton( this, "IncrementCVar", control->GetName(), t ); m_LayoutItems.AddToTail( increment ); continue; } } } private: CUtlVector< vgui::Panel * > m_LayoutItems; }; class CDebugOptionsPanel : public vgui::PropertyDialog { typedef vgui::PropertyDialog BaseClass; public: CDebugOptionsPanel( vgui::Panel *parent, const char *panelName ) : BaseClass( parent, panelName ) { SetTitle( "Debug Options", true ); KeyValues *kv = new KeyValues( "DebugOptions" ); if ( kv ) { if ( kv->LoadFromFile(g_pFullFileSystem, "scripts/DebugOptions.txt") ) { for (KeyValues *dat = kv->GetFirstSubKey(); dat != NULL; dat = dat->GetNextKey()) { if ( !Q_strcasecmp( dat->GetName(), "width" ) ) { SetWide( dat->GetInt() ); continue; } else if ( !Q_strcasecmp( dat->GetName(), "height" ) ) { SetTall( dat->GetInt() ); continue; } CDebugOptionsPage *page = new CDebugOptionsPage( this, dat->GetName() ); page->Init( dat ); AddPage( page, dat->GetName() ); } } kv->deleteThis(); } GetPropertySheet()->SetTabWidth(72); SetPos( videomode->GetModeStereoWidth() - GetWide() - 10 , 10 ); SetVisible( true ); if ( g_pFullFileSystem->FileExists( "resource/DebugOptionsPanel.res" ) ) { LoadControlSettings( "resource/DebugOptionsPanel.res" ); } } void Init( KeyValues *kv ); }; void CDebugOptionsPanel::Init( KeyValues *kv ) { } //----------------------------------------------------------------------------- // Purpose: Constructor //----------------------------------------------------------------------------- CDebugMenuButton::CDebugMenuButton(Panel *parent, const char *panelName, const char *text) : BaseClass( parent, panelName, text ) { MakePopup(); // Assume no menu m_pMenu = new Menu( this, "DebugMenu" ); m_pMenu->AddMenuItem( "Debug Panel", "toggledebugpanel", parent ); m_pMenu->AddMenuItem( "Quit", "Quit", parent ); MenuButton::SetMenu(m_pMenu); SetOpenDirection(Menu::DOWN); } //----------------------------------------------------------------------------- // Purpose: Container for menu button // Input : *parent - // *panelName - //----------------------------------------------------------------------------- CDebugSystemPanel::CDebugSystemPanel( Panel *parent, const char *panelName ) : BaseClass( parent, panelName ) { SetBounds( 0, 0, videomode->GetModeStereoWidth(), videomode->GetModeStereoHeight() ); // Show arrow cursor while in this mode SetCursor( vgui::dc_arrow ); SetVisible( false ); SetPaintEnabled( false ); SetPaintBackgroundEnabled( false ); m_pDebugMenu = new CDebugMenuButton( this, "Debug Menu", "Debug Menu" ); int h = 24; // Locate it at top left m_pDebugMenu->SetPos( 0, 0 ); m_pDebugMenu->SetSize( 110, h ); m_hDebugOptions = new CDebugOptionsPanel( this, "DebugOptions" ); } //----------------------------------------------------------------------------- // Purpose: Hook so we can force cursor visible // Input : state - //----------------------------------------------------------------------------- void CDebugSystemPanel::SetVisible( bool state ) { BaseClass::SetVisible( state ); if ( state ) { surface()->SetCursor( GetCursor() ); } } void CDebugSystemPanel::OnCommand( const char *command ) { if ( !Q_strcasecmp( command, "toggledebugpanel" ) ) { if ( m_hDebugOptions ) { m_hDebugOptions->SetVisible( !m_hDebugOptions->IsVisible() ); } return; } else if ( !Q_strcasecmp( command, "quit" ) ) { Cbuf_AddText( "quit\n" ); } BaseClass::OnCommand( command ); }