//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // //=============================================================================// #include #include #include #include // memdbgon must be the last include file in a .cpp file!!! #include using namespace vgui; //----------------------------------------------------------------------------- // Purpose: Constructor //----------------------------------------------------------------------------- CheckButtonList::CheckButtonList(Panel *parent, const char *name) : BaseClass(parent, name) { m_pScrollBar = new ScrollBar(this, NULL, true); } //----------------------------------------------------------------------------- // Purpose: Destructor //----------------------------------------------------------------------------- CheckButtonList::~CheckButtonList() { RemoveAll(); } //----------------------------------------------------------------------------- // Purpose: adds a check button to the list //----------------------------------------------------------------------------- int CheckButtonList::AddItem(const char *itemText, bool startsSelected, KeyValues *userData) { CheckItem_t newItem; newItem.checkButton = new vgui::CheckButton(this, NULL, itemText); newItem.checkButton->SetSilentMode( true ); newItem.checkButton->SetSelected(startsSelected); newItem.checkButton->SetSilentMode( false ); newItem.checkButton->AddActionSignalTarget(this); newItem.userData = userData; InvalidateLayout(); return m_CheckItems.AddToTail(newItem); } //----------------------------------------------------------------------------- // Purpose: clears the list //----------------------------------------------------------------------------- void CheckButtonList::RemoveAll() { for (int i = 0; i < m_CheckItems.Count(); i++) { m_CheckItems[i].checkButton->MarkForDeletion(); if (m_CheckItems[i].userData) { m_CheckItems[i].userData->deleteThis(); } } m_CheckItems.RemoveAll(); } //----------------------------------------------------------------------------- // Purpose: returns the number of items in list that are checked //----------------------------------------------------------------------------- int CheckButtonList::GetCheckedItemCount() { int count = 0; for (int i = 0; i < m_CheckItems.Count(); i++) { if (m_CheckItems[i].checkButton->IsSelected()) { count++; } } return count; } //----------------------------------------------------------------------------- // Purpose: lays out buttons //----------------------------------------------------------------------------- void CheckButtonList::PerformLayout() { BaseClass::PerformLayout(); // get sizes int x = 4, y = 4, wide = GetWide() - ((x * 2) + m_pScrollBar->GetWide()), tall = 22; // set scrollbar int totalHeight = y + (m_CheckItems.Count() * tall); if (totalHeight > GetTall()) { m_pScrollBar->SetRange(0, totalHeight + 1); m_pScrollBar->SetRangeWindow(GetTall()); m_pScrollBar->SetVisible(true); m_pScrollBar->SetBounds(GetWide() - 21, 0, 19, GetTall() - 2); SetPaintBorderEnabled(true); y -= m_pScrollBar->GetValue(); } else { m_pScrollBar->SetVisible(false); SetPaintBorderEnabled(false); } // position the items for (int i = 0; i < m_CheckItems.Count(); i++) { CheckButton *btn = m_CheckItems[i].checkButton; btn->SetBounds(x, y, wide, tall); y += tall; } } //----------------------------------------------------------------------------- // Purpose: Sets the border on the window //----------------------------------------------------------------------------- void CheckButtonList::ApplySchemeSettings(IScheme *pScheme) { BaseClass::ApplySchemeSettings(pScheme); SetBorder(pScheme->GetBorder("ButtonDepressedBorder")); } //----------------------------------------------------------------------------- // Purpose: iteration //----------------------------------------------------------------------------- bool CheckButtonList::IsItemIDValid(int itemID) { return m_CheckItems.IsValidIndex(itemID); } //----------------------------------------------------------------------------- // Purpose: iteration //----------------------------------------------------------------------------- int CheckButtonList::GetHighestItemID() { return m_CheckItems.Count() - 1; } //----------------------------------------------------------------------------- // Purpose: iteration //----------------------------------------------------------------------------- KeyValues *CheckButtonList::GetItemData(int itemID) { return m_CheckItems[itemID].userData; } //----------------------------------------------------------------------------- // Purpose: data accessor //----------------------------------------------------------------------------- int CheckButtonList::GetItemCount() { return m_CheckItems.Count(); } //----------------------------------------------------------------------------- // Purpose: data accessor //----------------------------------------------------------------------------- bool CheckButtonList::IsItemChecked(int itemID) { return m_CheckItems[itemID].checkButton->IsSelected(); } //----------------------------------------------------------------------------- // Purpose: Sets the state of the check button //----------------------------------------------------------------------------- void CheckButtonList::SetItemCheckable(int itemID, bool state) { m_CheckItems[itemID].checkButton->SetCheckButtonCheckable(state); } //----------------------------------------------------------------------------- // Purpose: Forwards up check button selected message //----------------------------------------------------------------------------- void CheckButtonList::OnCheckButtonChecked( KeyValues *pParams ) { vgui::Panel *pPanel = (vgui::Panel *)pParams->GetPtr( "panel" ); int c = m_CheckItems.Count(); for ( int i = 0; i < c; ++i ) { if ( pPanel == m_CheckItems[i].checkButton ) { KeyValues *kv = new KeyValues( "CheckButtonChecked", "itemid", i ); kv->SetInt( "state", pParams->GetInt( "state" ) ); PostActionSignal( kv ); break; } } } //----------------------------------------------------------------------------- // Purpose: updates from scrollbar movement //----------------------------------------------------------------------------- void CheckButtonList::OnScrollBarSliderMoved() { InvalidateLayout(); Repaint(); } //----------------------------------------------------------------------------- // Purpose: Mouse wheeled //----------------------------------------------------------------------------- void CheckButtonList::OnMouseWheeled(int delta) { int val = m_pScrollBar->GetValue(); val -= (delta * 15); m_pScrollBar->SetValue(val); }