//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // //=============================================================================// #include #include #include #include #include "tier1/KeyValues.h" #include "vgui/IInput.h" // memdbgon must be the last include file in a .cpp file!!! #include using namespace vgui; //----------------------------------------------------------------------------- // Purpose: Constructor //----------------------------------------------------------------------------- BaseInputDialog::BaseInputDialog( vgui::Panel *parent, const char *title ) : BaseClass( parent, NULL ) { m_pContextKeyValues = NULL; SetDeleteSelfOnClose( true ); SetTitle(title, true); SetSize(320, 180); SetSizeable( false ); m_pCancelButton = new Button(this, "CancelButton", "#VGui_Cancel"); m_pOKButton = new Button(this, "OKButton", "#VGui_OK"); m_pCancelButton->SetCommand("Cancel"); m_pOKButton->SetCommand("OK"); m_pOKButton->SetAsDefaultButton( true ); if ( parent ) { AddActionSignalTarget( parent ); } } BaseInputDialog::~BaseInputDialog() { CleanUpContextKeyValues(); } //----------------------------------------------------------------------------- // Purpose: Cleans up the keyvalues //----------------------------------------------------------------------------- void BaseInputDialog::CleanUpContextKeyValues() { if ( m_pContextKeyValues ) { m_pContextKeyValues->deleteThis(); m_pContextKeyValues = NULL; } } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void BaseInputDialog::DoModal( KeyValues *pContextKeyValues ) { CleanUpContextKeyValues(); m_pContextKeyValues = pContextKeyValues; BaseClass::DoModal(); } //----------------------------------------------------------------------------- // Purpose: lays out controls //----------------------------------------------------------------------------- void BaseInputDialog::PerformLayout() { BaseClass::PerformLayout(); int w, h; GetSize( w, h ); // lay out all the controls int topy = IsSmallCaption() ? 15 : 30; int halfw = w / 2; PerformLayout( 12, topy, w - 24, h - 100 ); m_pOKButton->SetBounds( halfw - 84, h - 30, 72, 24 ); m_pCancelButton->SetBounds( halfw + 12, h - 30, 72, 24 ); } //----------------------------------------------------------------------------- // Purpose: handles button commands //----------------------------------------------------------------------------- void BaseInputDialog::OnCommand(const char *command) { KeyValues *kv = NULL; if ( !stricmp( command, "OK" ) ) { kv = new KeyValues( "InputCompleted" ); kv->SetPtr( "dialog", this ); } else if ( !stricmp( command, "Cancel" ) ) { kv = new KeyValues( "InputCanceled" ); } else { BaseClass::OnCommand( command ); return; } if ( m_pContextKeyValues ) { kv->AddSubKey( m_pContextKeyValues ); m_pContextKeyValues = NULL; } PostActionSignal( kv ); CloseModal(); } //----------------------------------------------------------------------------- // Purpose: Utility dialog, used to ask yes/no questions of the user //----------------------------------------------------------------------------- InputMessageBox::InputMessageBox( vgui::Panel *parent, const char *title, char const *prompt ) : BaseClass( parent, title ) { SetSize( 320, 120 ); m_pPrompt = new Label( this, "Prompt", prompt ); } InputMessageBox::~InputMessageBox() { } void InputMessageBox::PerformLayout( int x, int y, int w, int h ) { m_pPrompt->SetBounds( x, y, w, 24 ); } //----------------------------------------------------------------------------- // Purpose: Constructor //----------------------------------------------------------------------------- InputDialog::InputDialog(vgui::Panel *parent, const char *title, char const *prompt, char const *defaultValue /*=""*/ ) : BaseClass(parent, title) { SetSize( 320, 120 ); m_pPrompt = new Label( this, "Prompt", prompt ); m_pInput = new TextEntry( this, "Text" ); m_pInput->SetText( defaultValue ); m_pInput->SelectAllText( true ); m_pInput->RequestFocus(); } InputDialog::~InputDialog() { } //----------------------------------------------------------------------------- // Sets the dialog to be multiline //----------------------------------------------------------------------------- void InputDialog::SetMultiline( bool state ) { m_pInput->SetMultiline( state ); m_pInput->SetCatchEnterKey( state ); } //----------------------------------------------------------------------------- // Allow numeric input only //----------------------------------------------------------------------------- void InputDialog::AllowNumericInputOnly( bool bOnlyNumeric ) { if ( m_pInput ) { m_pInput->SetAllowNumericInputOnly( bOnlyNumeric ); } } //----------------------------------------------------------------------------- // Purpose: lays out controls //----------------------------------------------------------------------------- void InputDialog::PerformLayout( int x, int y, int w, int h ) { m_pPrompt->SetBounds( x, y, w, 24 ); m_pInput ->SetBounds( x, y + 30, w, m_pInput->IsMultiline() ? h - 30 : 24 ); } //----------------------------------------------------------------------------- // Purpose: handles button commands //----------------------------------------------------------------------------- void InputDialog::OnCommand(const char *command) { // overriding OnCommand for backwards compatability // it'd be nice at some point to find all uses of InputDialog and just use BaseInputDialog's OnCommand if (!stricmp(command, "OK")) { int nTextLength = m_pInput->GetTextLength() + 1; char* txt = (char*)_alloca( nTextLength * sizeof(char) ); m_pInput->GetText( txt, nTextLength ); KeyValues *kv = new KeyValues( "InputCompleted", "text", txt ); if ( m_pContextKeyValues ) { kv->AddSubKey( m_pContextKeyValues ); m_pContextKeyValues = NULL; } PostActionSignal( kv ); CloseModal(); } else if (!stricmp(command, "Cancel")) { KeyValues *kv = new KeyValues( "InputCanceled" ); if ( m_pContextKeyValues ) { kv->AddSubKey( m_pContextKeyValues ); m_pContextKeyValues = NULL; } PostActionSignal( kv ); CloseModal(); } else { BaseClass::OnCommand(command); } }