diff options
Diffstat (limited to 'gameui/PanelListPanel.cpp')
| -rw-r--r-- | gameui/PanelListPanel.cpp | 306 |
1 files changed, 306 insertions, 0 deletions
diff --git a/gameui/PanelListPanel.cpp b/gameui/PanelListPanel.cpp new file mode 100644 index 0000000..8ea327f --- /dev/null +++ b/gameui/PanelListPanel.cpp @@ -0,0 +1,306 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// +#include <assert.h> +#include <vgui_controls/ScrollBar.h> +#include <vgui_controls/Label.h> +#include <vgui_controls/Button.h> + +#include <KeyValues.h> +#include <vgui/MouseCode.h> +#include <vgui/KeyCode.h> +#include <vgui/IInput.h> +#include <vgui/IScheme.h> +#include <vgui/ISurface.h> +#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; +} |