mirror of
https://github.com/nillerusr/source-engine.git
synced 2024-12-22 14:16:50 +00:00
272 lines
7.2 KiB
C++
272 lines
7.2 KiB
C++
|
//========= Copyright Valve Corporation, All rights reserved. ============//
|
||
|
//
|
||
|
// Purpose: Dialog for selecting game configurations
|
||
|
//
|
||
|
//=====================================================================================//
|
||
|
|
||
|
#include <windows.h>
|
||
|
|
||
|
#include <vgui/IVGui.h>
|
||
|
#include <vgui/IInput.h>
|
||
|
#include <vgui/ISystem.h>
|
||
|
#include <vgui_controls/ComboBox.h>
|
||
|
#include <vgui_controls/MessageBox.h>
|
||
|
#include <vgui_controls/FileOpenDialog.h>
|
||
|
#include <KeyValues.h>
|
||
|
#include "CMDErrorPanel.h"
|
||
|
#include "CMDModulePanel.h"
|
||
|
#include "isqlwrapper.h"
|
||
|
#include "CMDRipperMain.h"
|
||
|
|
||
|
// memdbgon must be the last include file in a .cpp file!!!
|
||
|
#include <tier0/memdbgon.h>
|
||
|
|
||
|
using namespace vgui;
|
||
|
|
||
|
CMDRipperMain *g_pCMDRipperMain = NULL;
|
||
|
extern ISQLWrapper *g_pSqlWrapper;
|
||
|
|
||
|
class CModalPreserveMessageBox : public vgui::MessageBox
|
||
|
{
|
||
|
public:
|
||
|
CModalPreserveMessageBox(const char *title, const char *text, vgui::Panel *parent)
|
||
|
: vgui::MessageBox( title, text, parent )
|
||
|
{
|
||
|
m_PrevAppFocusPanel = vgui::input()->GetAppModalSurface();
|
||
|
}
|
||
|
|
||
|
~CModalPreserveMessageBox()
|
||
|
{
|
||
|
vgui::input()->SetAppModalSurface( m_PrevAppFocusPanel );
|
||
|
}
|
||
|
|
||
|
public:
|
||
|
vgui::VPANEL m_PrevAppFocusPanel;
|
||
|
};
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose: Utility function to pop up a VGUI message box
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void VGUIMessageBox( vgui::Panel *pParent, const char *pTitle, const char *pMsg, ... )
|
||
|
{
|
||
|
char msg[4096];
|
||
|
va_list marker;
|
||
|
va_start( marker, pMsg );
|
||
|
Q_vsnprintf( msg, sizeof( msg ), pMsg, marker );
|
||
|
va_end( marker );
|
||
|
|
||
|
vgui::MessageBox *dlg = new CModalPreserveMessageBox( pTitle, msg, pParent );
|
||
|
dlg->DoModal();
|
||
|
dlg->Activate();
|
||
|
dlg->RequestFocus();
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Constructor
|
||
|
//-----------------------------------------------------------------------------
|
||
|
CMDRipperMain::CMDRipperMain( Panel *parent, const char *name ) : BaseClass( parent, name ), m_bChanged( false )
|
||
|
{
|
||
|
Assert( !g_pCMDRipperMain );
|
||
|
g_pCMDRipperMain = this;
|
||
|
|
||
|
Sys_LoadInterface( "sqlwrapper", INTERFACEVERSION_ISQLWRAPPER, &hSQLWrapper, (void **)&sqlWrapperFactory );
|
||
|
Assert( hSQLWrapper != NULL );
|
||
|
Assert( sqlWrapperFactory != NULL );
|
||
|
|
||
|
sqlWrapper = sqlWrapperFactory->Create( "cserr", "steamweb-sql", "root", "" );
|
||
|
if ( !sqlWrapper )
|
||
|
{
|
||
|
ivgui()->DPrintf( "SQLWrapper is NULL" );
|
||
|
}
|
||
|
Assert( sqlWrapper != NULL );
|
||
|
g_pSqlWrapper = sqlWrapper;
|
||
|
|
||
|
SetSize(800, 600);
|
||
|
SetMinimumSize(500, 200);
|
||
|
|
||
|
SetMinimizeButtonVisible( true );
|
||
|
|
||
|
m_pMenuBar = new vgui::MenuBar( this, "Main Menu Bar" );
|
||
|
m_pMenuBar->SetPos( 5, 26 );
|
||
|
m_pMenuBar->SetSize( 690, 28 );
|
||
|
|
||
|
Menu *pFileMenu = new Menu(NULL, "File");
|
||
|
pFileMenu->AddMenuItem( "&Open", new KeyValues( "Open" ), this );
|
||
|
m_pMenuBar->AddMenu( "&File", pFileMenu );
|
||
|
|
||
|
Menu *pErrorMenu = new Menu(NULL, "Error");
|
||
|
pErrorMenu->AddMenuItem( "&Error", new KeyValues("Error"), this);
|
||
|
m_pMenuBar->AddMenu( "&Error", pErrorMenu );
|
||
|
|
||
|
m_pErrorPanel = new CMDErrorPanel( this, "MDError Panel" );
|
||
|
m_pErrorPanel->AddActionSignalTarget( this );
|
||
|
|
||
|
m_pModulePanel = new CMDModulePanel( this, "MDModule Panel" );
|
||
|
m_pModulePanel->AddActionSignalTarget( this );
|
||
|
|
||
|
m_pErrorPanel->AddActionSignalTarget( m_pModulePanel );
|
||
|
|
||
|
m_pDetailPanel = new CMDDetailPanel( this, "MDDetail Panel" );
|
||
|
m_pErrorPanel->AddActionSignalTarget( this );
|
||
|
|
||
|
LoadControlSettings( "MDRipperMain.res" );
|
||
|
|
||
|
m_pErrorPanel->SetVisible( false );
|
||
|
m_pModulePanel->SetVisible( false );
|
||
|
m_pDetailPanel->SetVisible( false );
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Destructor
|
||
|
//-----------------------------------------------------------------------------
|
||
|
CMDRipperMain::~CMDRipperMain()
|
||
|
{
|
||
|
g_pCMDRipperMain = NULL;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose: Kills the whole app on close
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CMDRipperMain::OnClose( void )
|
||
|
{
|
||
|
BaseClass::OnClose();
|
||
|
ivgui()->Stop();
|
||
|
|
||
|
sqlWrapper->FreeResult();
|
||
|
sqlWrapperFactory->Free( sqlWrapper );
|
||
|
Sys_UnloadModule( hSQLWrapper );
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose: Select the item from the list (updating the environment variable as well)
|
||
|
// Input : index - item to select
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CMDRipperMain::SetGlobalConfig( const char *modDir )
|
||
|
{
|
||
|
// Set our environment variable
|
||
|
SetVConfigRegistrySetting( GAMEDIR_TOKEN, modDir );
|
||
|
}
|
||
|
*/
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose: Parse commands coming in from the VGUI dialog
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CMDRipperMain::OnCommand( const char *command )
|
||
|
{
|
||
|
if ( Q_stricmp( command, "Open" ) == 0 )
|
||
|
{
|
||
|
OnOpen();
|
||
|
}
|
||
|
else if ( Q_stricmp( command, "Error" ) == 0 )
|
||
|
{
|
||
|
OnError();
|
||
|
}
|
||
|
BaseClass::OnCommand( command );
|
||
|
}
|
||
|
|
||
|
|
||
|
bool CMDRipperMain::RequestInfo( KeyValues *outputData )
|
||
|
{
|
||
|
const char * szName = outputData->GetName();
|
||
|
if ( !Q_stricmp( szName, "DragDrop" ))
|
||
|
{
|
||
|
bool bAccept = false;
|
||
|
|
||
|
if ( !Q_stricmp( outputData->GetString( "type" ), "Files" ) )
|
||
|
{
|
||
|
// Make sure we only get .mdmp files
|
||
|
KeyValues *pFiles = outputData->FindKey( "list", false );
|
||
|
if ( pFiles )
|
||
|
{
|
||
|
const char *pszFile = pFiles->GetString( "0" );
|
||
|
const char *pszExtension = Q_strrchr( pszFile, '.' );
|
||
|
if ( pszExtension )
|
||
|
{
|
||
|
if ( !Q_stricmp( pszExtension, ".mdmp" ) )
|
||
|
{
|
||
|
outputData->SetPtr( "AcceptPanel", ( Panel * )this );
|
||
|
bAccept = true;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return ( bAccept );
|
||
|
}
|
||
|
|
||
|
return ( BaseClass::RequestInfo( outputData ) );
|
||
|
}
|
||
|
|
||
|
|
||
|
void CMDRipperMain::OnOpen()
|
||
|
{
|
||
|
FileOpenDialog *pFileDialog = new FileOpenDialog ( this, "File Open", true);
|
||
|
pFileDialog->AddActionSignalTarget(this);
|
||
|
pFileDialog->AddFilter( "*.mdmp", "MiniDumps", true );
|
||
|
pFileDialog->DoModal( true );
|
||
|
}
|
||
|
|
||
|
void CMDRipperMain::OnError()
|
||
|
{
|
||
|
m_pErrorPanel->NewQuery();
|
||
|
m_pErrorPanel->SetVisible( true );
|
||
|
m_pErrorPanel->MoveToFront();
|
||
|
Repaint();
|
||
|
}
|
||
|
|
||
|
void CMDRipperMain::OnFileSelected( const char *filename )
|
||
|
{
|
||
|
m_pModulePanel->Create( filename );
|
||
|
m_pModulePanel->SetVisible( true );
|
||
|
Repaint();
|
||
|
}
|
||
|
|
||
|
void CMDRipperMain::OnDetail( KeyValues *data )
|
||
|
{
|
||
|
char URL[1024] = "";
|
||
|
strcat( URL, "http://steamweb/cserr_detailsnograph.php?errorid=" );
|
||
|
strcat( URL, data->GetString( "errorID" ) );
|
||
|
m_pDetailPanel->OpenURL( URL );
|
||
|
m_pDetailPanel->SetVisible( true );
|
||
|
m_pDetailPanel->MoveToFront();
|
||
|
Repaint();
|
||
|
}
|
||
|
|
||
|
void CMDRipperMain::OnRefresh()
|
||
|
{
|
||
|
Repaint();
|
||
|
}
|
||
|
|
||
|
void CMDRipperMain::OnLookUp( KeyValues *data )
|
||
|
{
|
||
|
m_pDetailPanel->OpenURL( data->GetString( "url" ) );
|
||
|
m_pDetailPanel->SetVisible( true );
|
||
|
m_pDetailPanel->MoveToFront();
|
||
|
Repaint();
|
||
|
}
|
||
|
|
||
|
|
||
|
void CMDRipperMain::OnDragDrop( KeyValues *pData )
|
||
|
{
|
||
|
KeyValues *pFiles = pData->FindKey( "list", false );
|
||
|
if ( pFiles )
|
||
|
{
|
||
|
DWORD dwIndex = 0;
|
||
|
const char *pszFile = NULL;
|
||
|
char szIndex[ 64 ] = { 0 };
|
||
|
|
||
|
do
|
||
|
{
|
||
|
Q_snprintf( szIndex, sizeof ( szIndex ), "%d", dwIndex );
|
||
|
pszFile = pFiles->GetString( szIndex );
|
||
|
ivgui()->DPrintf( "Got file [%s]", pszFile );
|
||
|
OnFileSelected( pszFile );
|
||
|
dwIndex++;
|
||
|
}
|
||
|
while ( g_pFullFileSystem->FileExists( pszFile ) );
|
||
|
}
|
||
|
|
||
|
}
|