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.
386 lines
9.1 KiB
386 lines
9.1 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
// $NoKeywords: $ |
|
//===========================================================================// |
|
#include "client_pch.h" |
|
#include "ivideomode.h" |
|
#include "vgui_DebugSystemPanel.h" |
|
#include <vgui/ISurface.h> |
|
#include <vgui_controls/Controls.h> |
|
#include <vgui_controls/MenuButton.h> |
|
#include <vgui_controls/Menu.h> |
|
#include <vgui_controls/MenuItem.h> |
|
#include <vgui/Cursor.h> |
|
#include <vgui_controls/TreeView.h> |
|
#include <vgui_controls/ImageList.h> |
|
#include <vgui/IScheme.h> |
|
#include <vgui/IVGui.h> |
|
#include <vgui_controls/Frame.h> |
|
#include <vgui_controls/CheckButton.h> |
|
#include <vgui_controls/PropertyPage.h> |
|
#include <vgui_controls/PropertyDialog.h> |
|
#include <vgui_controls/PropertySheet.h> |
|
#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 ); |
|
} |