//========= Copyright © 1996-2002, Valve LLC, All rights reserved. ============ // // Purpose: // // $NoKeywords: $ //============================================================================= #include #include #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); }