summaryrefslogtreecommitdiff
path: root/gameui/PanelListPanel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'gameui/PanelListPanel.cpp')
-rw-r--r--gameui/PanelListPanel.cpp306
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;
+}