//========= Copyright (c) 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 ); }