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;
|
|
}
|