//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // // $NoKeywords: $ //=============================================================================// #include #include #include #include #include #include #include #include #include #include #include "PanelListPanel.h" // memdbgon must be the last include file in a .cpp file!!! #include "tier0/memdbgon.h" using namespace vgui; class VScrollBarReversedButtons : public ScrollBar { public: VScrollBarReversedButtons( Panel *parent, const char *panelName, bool vertical ); virtual void ApplySchemeSettings( IScheme *pScheme ); }; VScrollBarReversedButtons::VScrollBarReversedButtons( Panel *parent, const char *panelName, bool vertical ) : ScrollBar( parent, panelName, vertical ) { } void VScrollBarReversedButtons::ApplySchemeSettings( IScheme *pScheme ) { ScrollBar::ApplySchemeSettings( pScheme ); Button *pButton; pButton = GetButton( 0 ); pButton->SetArmedColor( pButton->GetSchemeColor("DimBaseText", pScheme), pButton->GetBgColor()); pButton->SetDepressedColor( pButton->GetSchemeColor("DimBaseText", pScheme), pButton->GetBgColor()); pButton->SetDefaultColor( pButton->GetFgColor(), pButton->GetBgColor()); pButton = GetButton( 1 ); pButton->SetArmedColor( pButton->GetSchemeColor("DimBaseText", pScheme), pButton->GetBgColor()); pButton->SetDepressedColor( pButton->GetSchemeColor("DimBaseText", pScheme), pButton->GetBgColor()); pButton->SetDefaultColor( pButton->GetFgColor(), pButton->GetBgColor()); } //----------------------------------------------------------------------------- // Purpose: // Input : x - // y - // wide - // tall - // Output : //----------------------------------------------------------------------------- CPanelListPanel::CPanelListPanel( vgui::Panel *parent, char const *panelName, bool inverseButtons ) : Panel( parent, panelName ) { SetBounds( 0, 0, 100, 100 ); _sliderYOffset = 0; if (inverseButtons) { _vbar = new VScrollBarReversedButtons(this, "CPanelListPanelVScroll", true ); } else { _vbar = new ScrollBar(this, "CPanelListPanelVScroll", true ); } _vbar->SetBounds( 0, 0, 20, 20 ); _vbar->SetVisible(false); _vbar->AddActionSignalTarget( this ); _embedded = new Panel( this, "PanelListEmbedded" ); _embedded->SetBounds( 0, 0, 20, 20 ); _embedded->SetPaintBackgroundEnabled( false ); _embedded->SetPaintBorderEnabled( false ); } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- CPanelListPanel::~CPanelListPanel() { // free data from table DeleteAllItems(); } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- int CPanelListPanel::computeVPixelsNeeded( void ) { int pixels =0; DATAITEM *item; Panel *panel; for ( int i = 0; i < _dataItems.GetCount(); i++ ) { item = _dataItems[ i ]; if ( !item ) continue; panel = item->panel; if ( !panel ) continue; int w, h; panel->GetSize( w, h ); pixels += h; } pixels+=5; // add a buffer after the last item return pixels; } //----------------------------------------------------------------------------- // Purpose: Returns the panel to use to render a cell // Input : column - // row - // Output : Panel //----------------------------------------------------------------------------- Panel *CPanelListPanel::GetCellRenderer( int row ) { DATAITEM *item = _dataItems[ row ]; if ( item ) { Panel *panel = item->panel; return panel; } return NULL; } //----------------------------------------------------------------------------- // Purpose: adds an item to the view // data->GetName() is used to uniquely identify an item // data sub items are matched against column header name to be used in the table // Input : *item - //----------------------------------------------------------------------------- int CPanelListPanel::AddItem( Panel *panel ) { InvalidateLayout(); DATAITEM *newitem = new DATAITEM; newitem->panel = panel; panel->SetParent( _embedded ); return _dataItems.PutElement( newitem ); } //----------------------------------------------------------------------------- // Purpose: // Output : //----------------------------------------------------------------------------- int CPanelListPanel::GetItemCount( void ) { return _dataItems.GetCount(); } //----------------------------------------------------------------------------- // Purpose: returns pointer to data the row holds // Input : itemIndex - // Output : KeyValues //----------------------------------------------------------------------------- Panel *CPanelListPanel::GetItem(int itemIndex) { if ( itemIndex < 0 || itemIndex >= _dataItems.GetCount() ) return NULL; return _dataItems[itemIndex]->panel; } //----------------------------------------------------------------------------- // Purpose: // Input : itemIndex - // Output : DATAITEM //----------------------------------------------------------------------------- CPanelListPanel::DATAITEM *CPanelListPanel::GetDataItem( int itemIndex ) { if ( itemIndex < 0 || itemIndex >= _dataItems.GetCount() ) return NULL; return _dataItems[ itemIndex ]; } //----------------------------------------------------------------------------- // Purpose: // Input : index - //----------------------------------------------------------------------------- void CPanelListPanel::RemoveItem(int itemIndex) { DATAITEM *item = _dataItems[ itemIndex ]; delete item->panel; delete item; _dataItems.RemoveElementAt(itemIndex); InvalidateLayout(); } //----------------------------------------------------------------------------- // Purpose: clears and deletes all the memory used by the data items //----------------------------------------------------------------------------- void CPanelListPanel::DeleteAllItems() { for (int i = 0; i < _dataItems.GetCount(); i++) { if ( _dataItems[i] ) { delete _dataItems[i]->panel; } delete _dataItems[i]; } _dataItems.RemoveAll(); InvalidateLayout(); } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CPanelListPanel::OnMouseWheeled(int delta) { int val = _vbar->GetValue(); val -= (delta * 3 * 5); _vbar->SetValue(val); } //----------------------------------------------------------------------------- // Purpose: relayouts out the panel after any internal changes //----------------------------------------------------------------------------- void CPanelListPanel::PerformLayout() { int wide, tall; GetSize( wide, tall ); int vpixels = computeVPixelsNeeded(); //!! need to make it recalculate scroll positions _vbar->SetVisible(true); _vbar->SetEnabled(false); _vbar->SetRange( 0, vpixels - tall + 24); _vbar->SetRangeWindow( 24 /*vpixels / 10*/ ); _vbar->SetButtonPressedScrollValue( 24 ); _vbar->SetPos(wide - 20, _sliderYOffset); _vbar->SetSize(18, tall - 2 - _sliderYOffset); _vbar->InvalidateLayout(); int top = _vbar->GetValue(); _embedded->SetPos( 0, -top ); _embedded->SetSize( wide-20, vpixels ); // Now lay out the controls on the embedded panel int y = 0; int h = 0; for ( int i = 0; i < _dataItems.GetCount(); i++, y += h ) { DATAITEM *item = _dataItems[ i ]; if ( !item || !item->panel ) continue; h = item->panel->GetTall(); item->panel->SetBounds( 8, y, wide-36, h ); } } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CPanelListPanel::PaintBackground() { Panel::PaintBackground(); } //----------------------------------------------------------------------------- // Purpose: // Input : *inResourceData - //----------------------------------------------------------------------------- void CPanelListPanel::ApplySchemeSettings(IScheme *pScheme) { Panel::ApplySchemeSettings(pScheme); SetBorder(pScheme->GetBorder("ButtonDepressedBorder")); SetBgColor(GetSchemeColor("Label.BgColor", GetBgColor(), pScheme)); // _labelFgColor = GetSchemeColor("WindowFgColor"); // _selectionFgColor = GetSchemeColor("ListSelectionFgColor", _labelFgColor); } void CPanelListPanel::OnSliderMoved( int position ) { InvalidateLayout(); Repaint(); } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- void CPanelListPanel::SetSliderYOffset( int pixels ) { _sliderYOffset = pixels; }