source-engine/vgui2/vgui_controls/QueryBox.cpp

237 lines
6.3 KiB
C++
Raw Normal View History

2020-04-22 16:56:21 +00:00
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
// This class is a message box that has two buttons, ok and cancel instead of
// just the ok button of a message box. We use a message box class for the ok button
// and implement another button here.
//
// $NoKeywords: $
//=============================================================================//
#include <vgui/KeyCode.h>
#include <vgui/ISurface.h>
2020-04-22 16:56:21 +00:00
#include <vgui_controls/QueryBox.h>
#include <vgui_controls/TextImage.h>
// memdbgon must be the last include file in a .cpp file!!!
#include <tier0/memdbgon.h>
#ifndef max
#define max(a,b) (((a) > (b)) ? (a) : (b))
#endif
using namespace vgui;
//-----------------------------------------------------------------------------
// Purpose: Constructor
//-----------------------------------------------------------------------------
QueryBox::QueryBox(const char *title, const char *queryText, vgui::Panel *parent) : MessageBox(title, queryText,parent)
{
SetDeleteSelfOnClose(true);
m_pCancelButton = new Button(this, "CancelButton", "#QueryBox_Cancel");
m_pCancelButton->SetCommand("Cancel");
m_pOkButton->SetCommand("OK");
m_pCancelCommand = NULL;
m_pOkCommand = NULL;
m_pOkButton->SetTabPosition(1);
m_pCancelButton->SetTabPosition(2);
}
//-----------------------------------------------------------------------------
// Purpose: Constructor
//-----------------------------------------------------------------------------
QueryBox::QueryBox(const wchar_t *wszTitle, const wchar_t *wszQueryText,vgui::Panel *parent) : MessageBox(wszTitle, wszQueryText,parent)
{
SetDeleteSelfOnClose(true);
m_pCancelButton = new Button(this, "CancelButton", "#QueryBox_Cancel");
m_pCancelButton->SetCommand("Cancel");
m_pOkButton->SetCommand("OK");
m_pCancelCommand = NULL;
m_pOkCommand = NULL;
m_pOkButton->SetTabPosition(1);
m_pCancelButton->SetTabPosition(2);
}
//-----------------------------------------------------------------------------
// Purpose: Destructor
//-----------------------------------------------------------------------------
QueryBox::~QueryBox()
{
delete m_pCancelButton;
if ( m_pOkCommand )
{
m_pOkCommand->deleteThis();
}
if ( m_pCancelCommand )
{
m_pCancelCommand->deleteThis();
}
}
//-----------------------------------------------------------------------------
// Purpose: Layout the window for drawing
//-----------------------------------------------------------------------------
void QueryBox::PerformLayout()
{
BaseClass::PerformLayout();
int boxWidth, boxTall;
GetSize(boxWidth, boxTall);
int x, y, wide, tall;
GetClientArea(x, y, wide, tall);
wide += x;
tall += y;
int oldWide, oldTall;
m_pCancelButton->GetSize(oldWide, oldTall);
// calc proportionality scale
float scale = 1;
if (IsProportional())
{
int screenW, screenH;
surface()->GetScreenSize(screenW, screenH);
int proW, proH;
surface()->GetProportionalBase(proW, proH);
scale = ((float)(screenH) / (float)(proH));
}
2020-04-22 16:56:21 +00:00
int btnWide, btnTall;
m_pCancelButton->GetContentSize(btnWide, btnTall);
btnWide = max(oldWide, btnWide + 10 * scale);
btnTall = max(oldTall, btnTall + 10 * scale);
2020-04-22 16:56:21 +00:00
m_pCancelButton->SetSize(btnWide, btnTall);
//nt boxWidth, boxTall;
GetSize(boxWidth, boxTall);
// wide = max(wide, btnWide * 2 + 100);
// SetSize(wide, tall);
m_pOkButton->SetPos((wide/2)-(m_pOkButton->GetWide())-1 + x, tall - m_pOkButton->GetTall() - 15 * scale);
m_pCancelButton->SetPos((wide/2) + x+16*scale, tall - m_pCancelButton->GetTall() - 15 * scale);
2020-04-22 16:56:21 +00:00
}
//-----------------------------------------------------------------------------
// Purpose: Handles command text from the buttons
// Deletes self when closed
//-----------------------------------------------------------------------------
void QueryBox::OnCommand(const char *command)
{
if (!stricmp(command, "OK"))
{
OnCommand("Close");
if ( m_pOkCommand )
{
PostActionSignal(m_pOkCommand->MakeCopy());
}
}
else if (!stricmp(command, "Cancel"))
{
OnCommand("Close");
if (m_pCancelCommand)
{
PostActionSignal(m_pCancelCommand->MakeCopy());
}
}
BaseClass::OnCommand(command);
}
//-----------------------------------------------------------------------------
// Purpose: Set the keyvalues to send when ok button is hit
//-----------------------------------------------------------------------------
void QueryBox::SetOKCommand(KeyValues *keyValues)
{
if ( m_pOkCommand )
{
m_pOkCommand->deleteThis();
}
m_pOkCommand = keyValues;
}
//-----------------------------------------------------------------------------
// Purpose: Set a value of the ok command
//-----------------------------------------------------------------------------
void QueryBox::SetOKCommandValue(const char *keyName, int value)
{
if ( !m_pOkCommand )
{
m_pOkCommand = new KeyValues("Command");
}
m_pOkCommand->SetInt(keyName, value);
}
//-----------------------------------------------------------------------------
// Purpose: Set the keyvalues to send when the cancel button is hit
//-----------------------------------------------------------------------------
void QueryBox::SetCancelCommand(KeyValues *keyValues)
{
if ( m_pCancelCommand )
{
m_pCancelCommand->deleteThis();
}
m_pCancelCommand = keyValues;
}
//-----------------------------------------------------------------------------
// Purpose: Sets the cancel button text
//-----------------------------------------------------------------------------
void QueryBox::SetCancelButtonText(const char* buttonText)
{
m_pCancelButton->SetText(buttonText);
InvalidateLayout();
}
//-----------------------------------------------------------------------------
// Purpose: Sets the cancel button text
//-----------------------------------------------------------------------------
void QueryBox::SetCancelButtonText(const wchar_t* wszButtonText)
{
m_pCancelButton->SetText(wszButtonText);
InvalidateLayout();
}
void QueryBox::OnKeyCodeTyped( KeyCode code )
{
if ( code == KEY_ESCAPE )
{
OnCommand("Cancel");
}
else
{
Frame::OnKeyCodeTyped(code);
}
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void QueryBox::OnKeyCodePressed( KeyCode code )
{
if ( code == KEY_XBUTTON_B )
{
OnCommand("Cancel");
}
else
{
Frame::OnKeyCodePressed(code);
}
}