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.
197 lines
3.6 KiB
197 lines
3.6 KiB
//========= Copyright © 1996-2002, Valve LLC, All rights reserved. ============ |
|
// |
|
// Purpose: |
|
// |
|
// $NoKeywords: $ |
|
//============================================================================= |
|
|
|
#include <stdarg.h> |
|
#include <stdio.h> |
|
#include "vgui_checkbutton2.h" |
|
#include "vgui_loadtga.h" |
|
|
|
|
|
#define EXTRA_X 5 |
|
|
|
|
|
using namespace vgui; |
|
|
|
|
|
|
|
CCheckButton2::CCheckButton2() : |
|
m_Label(""), |
|
m_pChecked(NULL), |
|
m_pUnchecked(NULL), |
|
m_pHandler(NULL), |
|
m_CheckboxPanel(NULL) |
|
{ |
|
m_bOwnImages = false; |
|
m_bChecked = false; |
|
m_pChecked = m_pUnchecked = NULL; |
|
m_bCheckboxLeft = true; |
|
|
|
m_Label.setParent(this); |
|
m_Label.setFgColor(255,255,255,0); |
|
m_Label.setBgColor(0,0,0,255); // background is not drawn and foreground is white |
|
m_Label.addInputSignal(this); |
|
|
|
m_CheckboxPanel.setParent(this); |
|
m_CheckboxPanel.addInputSignal(this); |
|
|
|
setPaintBackgroundEnabled(false); |
|
} |
|
|
|
|
|
CCheckButton2::~CCheckButton2() |
|
{ |
|
DeleteImages(); |
|
} |
|
|
|
|
|
void CCheckButton2::SetImages(char const *pChecked, char const *pUnchecked) |
|
{ |
|
DeleteImages(); |
|
|
|
m_pChecked = vgui_LoadTGA(pChecked); |
|
m_pUnchecked = vgui_LoadTGA(pUnchecked); |
|
m_bOwnImages = true; |
|
|
|
SetupControls(); |
|
} |
|
|
|
|
|
void CCheckButton2::SetImages(Image *pChecked, Image *pUnchecked) |
|
{ |
|
DeleteImages(); |
|
|
|
m_pChecked = pChecked; |
|
m_pUnchecked = pUnchecked; |
|
m_bOwnImages = false; |
|
|
|
SetupControls(); |
|
} |
|
|
|
|
|
void CCheckButton2::DeleteImages() |
|
{ |
|
if(m_bOwnImages) |
|
{ |
|
delete m_pChecked; |
|
delete m_pUnchecked; |
|
} |
|
|
|
m_pChecked = NULL; |
|
m_pUnchecked = NULL; |
|
m_bOwnImages = false; |
|
|
|
SetupControls(); |
|
} |
|
|
|
|
|
void CCheckButton2::SetCheckboxLeft(bool bLeftAlign) |
|
{ |
|
m_bCheckboxLeft = bLeftAlign; |
|
SetupControls(); |
|
} |
|
|
|
|
|
bool CCheckButton2::GetCheckboxLeft() |
|
{ |
|
return m_bCheckboxLeft; |
|
} |
|
|
|
|
|
void CCheckButton2::SetText(char const *pText, ...) |
|
{ |
|
char str[512]; |
|
|
|
va_list marker; |
|
va_start(marker, pText); |
|
_vsnprintf(str, sizeof(str), pText, marker); |
|
va_end(marker); |
|
|
|
m_Label.setText(str); |
|
SetupControls(); |
|
} |
|
|
|
|
|
void CCheckButton2::SetTextColor(int r, int g, int b, int a) |
|
{ |
|
m_Label.setFgColor(r, g, b, a); |
|
repaint(); |
|
} |
|
|
|
|
|
void CCheckButton2::SetHandler(ICheckButton2Handler *pHandler) |
|
{ |
|
m_pHandler = pHandler; |
|
} |
|
|
|
|
|
bool CCheckButton2::IsChecked() |
|
{ |
|
return m_bChecked; |
|
} |
|
|
|
|
|
void CCheckButton2::SetChecked(bool bChecked) |
|
{ |
|
m_bChecked = bChecked; |
|
SetupControls(); |
|
} |
|
|
|
|
|
void CCheckButton2::internalMousePressed(MouseCode code) |
|
{ |
|
m_bChecked = !m_bChecked; |
|
|
|
if(m_pHandler) |
|
m_pHandler->StateChanged(this); |
|
|
|
SetupControls(); |
|
} |
|
|
|
|
|
void CCheckButton2::SetupControls() |
|
{ |
|
// Initialize the checkbutton bitmap. |
|
Image *pBitmap = m_bChecked ? m_pChecked : m_pUnchecked; |
|
|
|
Panel *controls[2] = {&m_CheckboxPanel, &m_Label}; |
|
int controlSizes[2][2]; |
|
|
|
controlSizes[0][0] = controlSizes[0][1] = 0; |
|
if(pBitmap) |
|
pBitmap->getSize(controlSizes[0][0], controlSizes[0][1]); |
|
|
|
m_CheckboxPanel.setImage(pBitmap); |
|
m_CheckboxPanel.setSize(controlSizes[0][0], controlSizes[0][1]); |
|
|
|
|
|
// Get the label's size. |
|
m_Label.getSize(controlSizes[1][0], controlSizes[1][1]); |
|
m_Label.setContentAlignment(Label::a_west); |
|
|
|
|
|
// Position the controls. |
|
int iLeftControl = !m_bCheckboxLeft; |
|
int iBiggestY = controlSizes[0][1] > controlSizes[1][0] ? 0 : 1; |
|
controls[iLeftControl]->setPos(0, (controlSizes[iBiggestY][1] - controlSizes[iLeftControl][1]) / 2); |
|
controls[!iLeftControl]->setPos(controlSizes[iLeftControl][0] + EXTRA_X, (controlSizes[iBiggestY][1] - controlSizes[!iLeftControl][1]) / 2); |
|
|
|
|
|
// Fit this control to the sizes of the subcontrols. |
|
setSize(controlSizes[0][0] + controlSizes[1][0] + EXTRA_X, (controlSizes[0][1] > controlSizes[1][1]) ? controlSizes[0][1] : controlSizes[1][1]); |
|
repaint(); |
|
} |
|
|
|
|
|
void CCheckButton2::mousePressed(MouseCode code, Panel *panel) |
|
{ |
|
internalMousePressed(code); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|