You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
306 lines
8.7 KiB
306 lines
8.7 KiB
//========= 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; |
|
}
|
|
|