|
|
//========= Copyright <EFBFBD> 1996-2002, Valve LLC, All rights reserved. ============ |
|
|
// |
|
|
// Purpose: |
|
|
// |
|
|
// $NoKeywords: $ |
|
|
//============================================================================= |
|
|
|
|
|
#include "vgui_scrollbar2.h" |
|
|
#include "vgui_slider2.h" |
|
|
#include "vgui_loadtga.h" |
|
|
|
|
|
#include <VGUI_IntChangeSignal.h> |
|
|
#include <VGUI_Button.h> |
|
|
#include <VGUI_ActionSignal.h> |
|
|
#include <VGUI_LineBorder.h> |
|
|
|
|
|
using namespace vgui; |
|
|
|
|
|
namespace |
|
|
{ |
|
|
class FooDefaultScrollBarIntChangeSignal : public IntChangeSignal |
|
|
{ |
|
|
public: |
|
|
FooDefaultScrollBarIntChangeSignal( ScrollBar2 *scrollBar ) |
|
|
{ |
|
|
_scrollBar = scrollBar; |
|
|
} |
|
|
|
|
|
virtual void intChanged( int value, Panel *panel ) |
|
|
{ |
|
|
_scrollBar->fireIntChangeSignal(); |
|
|
} |
|
|
protected: |
|
|
ScrollBar2 *_scrollBar; |
|
|
}; |
|
|
|
|
|
class FooDefaultButtonSignal : public ActionSignal |
|
|
{ |
|
|
public: |
|
|
ScrollBar2 *_scrollBar; |
|
|
int _buttonIndex; |
|
|
|
|
|
FooDefaultButtonSignal( ScrollBar2 *scrollBar, int buttonIndex ) |
|
|
{ |
|
|
_scrollBar = scrollBar; |
|
|
_buttonIndex = buttonIndex; |
|
|
} |
|
|
|
|
|
virtual void actionPerformed( Panel *panel ) |
|
|
{ |
|
|
_scrollBar->doButtonPressed( _buttonIndex ); |
|
|
} |
|
|
}; |
|
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
|
// Purpose: Default scrollbar button |
|
|
// Draws in new scoreboard style |
|
|
//----------------------------------------------------------------------------- |
|
|
class ScrollBarButton : public Button |
|
|
{ |
|
|
private: |
|
|
LineBorder m_Border; |
|
|
|
|
|
public: |
|
|
ScrollBarButton( const char *filename, int x, int y, int wide, int tall ) : m_Border( Color( 60, 60, 60, 0 ) ), Button( "", x, y, wide, tall ) |
|
|
{ |
|
|
Image *image = vgui_LoadTGA( filename ); |
|
|
if( image ) |
|
|
{ |
|
|
image->setColor( Color( 140, 140, 140, 0 ) ); |
|
|
setImage( image ); |
|
|
} |
|
|
|
|
|
setBorder( &m_Border ); |
|
|
} |
|
|
|
|
|
virtual void paintBackground() |
|
|
{ |
|
|
int wide, tall; |
|
|
getPaintSize( wide, tall ); |
|
|
|
|
|
// fill the background |
|
|
drawSetColor( 0, 0, 0, 0 ); |
|
|
drawFilledRect( 0, 0, wide, tall ); |
|
|
} |
|
|
}; |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
|
// Purpose: Constructor |
|
|
// Input : x - |
|
|
// y - |
|
|
// wide - |
|
|
// tall - |
|
|
// vertical - |
|
|
//----------------------------------------------------------------------------- |
|
|
ScrollBar2::ScrollBar2( int x, int y, int wide, int tall, bool vertical ) : Panel( x, y, wide, tall ) |
|
|
{ |
|
|
_slider = null; |
|
|
_button[0] = null; |
|
|
_button[1] = null; |
|
|
|
|
|
if( vertical ) |
|
|
{ |
|
|
setSlider( new Slider2( 0, wide - 1, wide, ( tall - ( wide * 2 ) ) + 2, true ) ); |
|
|
setButton( new ScrollBarButton( "gfx/vgui/arrowup.tga", 0, 0, wide, wide ), 0 ); |
|
|
setButton( new ScrollBarButton( "gfx/vgui/arrowdown.tga", 0, tall - wide, wide, wide ), 1 ); |
|
|
} |
|
|
else |
|
|
{ |
|
|
// untested code |
|
|
setSlider( new Slider2( tall, 0, wide - ( tall * 2 ), tall, false ) ); |
|
|
setButton( new ScrollBarButton( "gfx/vgui/320_arrowlt.tga", 0, 0, tall + 1, tall + 1 ), 0 ); |
|
|
setButton( new ScrollBarButton( "gfx/vgui/320_arrowrt.tga", wide - tall, 0, tall + 1, tall + 1 ) , 1 ); |
|
|
} |
|
|
|
|
|
setPaintBorderEnabled( true ); |
|
|
setPaintBackgroundEnabled( true ); |
|
|
setPaintEnabled( true ); |
|
|
setButtonPressedScrollValue( 15 ); |
|
|
|
|
|
validate(); |
|
|
} |
|
|
|
|
|
void ScrollBar2::setSize( int wide, int tall ) |
|
|
{ |
|
|
Panel::setSize( wide, tall ); |
|
|
|
|
|
if( _slider == null ) |
|
|
{ |
|
|
return; |
|
|
} |
|
|
|
|
|
if( _button[0] == null ) |
|
|
{ |
|
|
return; |
|
|
} |
|
|
|
|
|
if( _button[1] == null ) |
|
|
{ |
|
|
return; |
|
|
} |
|
|
|
|
|
getPaintSize( wide, tall ); |
|
|
|
|
|
if( _slider->isVertical() ) |
|
|
{ |
|
|
_slider->setBounds( 0, wide, wide, tall - ( wide * 2 ) ); |
|
|
// _slider->setBounds( 0, 0, wide, tall ); |
|
|
_button[0]->setBounds( 0, 0, wide, wide ); |
|
|
_button[1]->setBounds( 0, tall - wide, wide, wide ); |
|
|
} |
|
|
else |
|
|
{ |
|
|
_slider->setBounds( tall, 0, wide - ( tall * 2 ), tall ); |
|
|
// _slider->setBounds( 0, 0, wide, tall ); |
|
|
_button[0]->setBounds( 0, 0, tall, tall ); |
|
|
_button[1]->setBounds( ( wide - tall ), 0, tall, tall); |
|
|
} |
|
|
} |
|
|
|
|
|
void ScrollBar2::performLayout() |
|
|
{ |
|
|
} |
|
|
|
|
|
void ScrollBar2::setValue( int value ) |
|
|
{ |
|
|
_slider->setValue( value ); |
|
|
} |
|
|
|
|
|
int ScrollBar2::getValue() |
|
|
{ |
|
|
return _slider->getValue(); |
|
|
} |
|
|
|
|
|
void ScrollBar2::addIntChangeSignal( IntChangeSignal *s ) |
|
|
{ |
|
|
_intChangeSignalDar.putElement( s ); |
|
|
_slider->addIntChangeSignal( new FooDefaultScrollBarIntChangeSignal( this ) ); |
|
|
} |
|
|
|
|
|
void ScrollBar2::setRange( int min, int max ) |
|
|
{ |
|
|
_slider->setRange( min, max ); |
|
|
} |
|
|
|
|
|
void ScrollBar2::fireIntChangeSignal() |
|
|
{ |
|
|
for( int i = 0; i < _intChangeSignalDar.getCount(); i++ ) |
|
|
{ |
|
|
_intChangeSignalDar[i]->intChanged( _slider->getValue(), this ); |
|
|
} |
|
|
} |
|
|
|
|
|
bool ScrollBar2::isVertical() |
|
|
{ |
|
|
return _slider->isVertical(); |
|
|
} |
|
|
|
|
|
bool ScrollBar2::hasFullRange() |
|
|
{ |
|
|
return _slider->hasFullRange(); |
|
|
} |
|
|
|
|
|
// LEAK: new and old slider will leak |
|
|
void ScrollBar2::setButton( Button *button, int index ) |
|
|
{ |
|
|
if( _button[index] != null ) |
|
|
{ |
|
|
removeChild( _button[index] ); |
|
|
} |
|
|
|
|
|
_button[index] = button; |
|
|
addChild( _button[index] ); |
|
|
|
|
|
_button[index]->addActionSignal( new FooDefaultButtonSignal( this, index ) ); |
|
|
|
|
|
validate(); |
|
|
|
|
|
// _button[index]->setVisible( false ); |
|
|
} |
|
|
|
|
|
Button *ScrollBar2::getButton( int index ) |
|
|
{ |
|
|
return _button[index]; |
|
|
} |
|
|
|
|
|
// LEAK: new and old slider will leak |
|
|
void ScrollBar2::setSlider( Slider2 *slider ) |
|
|
{ |
|
|
if( _slider != null ) |
|
|
{ |
|
|
removeChild( _slider ); |
|
|
} |
|
|
|
|
|
_slider = slider; |
|
|
addChild( _slider ); |
|
|
|
|
|
_slider->addIntChangeSignal( new FooDefaultScrollBarIntChangeSignal( this ) ); |
|
|
|
|
|
validate(); |
|
|
} |
|
|
|
|
|
Slider2 *ScrollBar2::getSlider() |
|
|
{ |
|
|
return _slider; |
|
|
} |
|
|
|
|
|
void ScrollBar2::doButtonPressed( int buttonIndex ) |
|
|
{ |
|
|
if( buttonIndex == 0 ) |
|
|
{ |
|
|
_slider->setValue( _slider->getValue() - _buttonPressedScrollValue ); |
|
|
} |
|
|
else |
|
|
{ |
|
|
_slider->setValue( _slider->getValue() + _buttonPressedScrollValue ); |
|
|
} |
|
|
} |
|
|
|
|
|
void ScrollBar2::setButtonPressedScrollValue( int value ) |
|
|
{ |
|
|
_buttonPressedScrollValue = value; |
|
|
} |
|
|
|
|
|
void ScrollBar2::setRangeWindow( int rangeWindow ) |
|
|
{ |
|
|
_slider->setRangeWindow( rangeWindow ); |
|
|
} |
|
|
|
|
|
void ScrollBar2::setRangeWindowEnabled( bool state ) |
|
|
{ |
|
|
_slider->setRangeWindowEnabled( state ); |
|
|
} |
|
|
|
|
|
void ScrollBar2::validate() |
|
|
{ |
|
|
if( _slider != null ) |
|
|
{ |
|
|
int buttonOffset = 0; |
|
|
|
|
|
for( int i = 0; i < 2; i++ ) |
|
|
{ |
|
|
if( _button[i] != null ) |
|
|
{ |
|
|
if( _button[i]->isVisible() ) |
|
|
{ |
|
|
if( _slider->isVertical() ) |
|
|
{ |
|
|
buttonOffset += _button[i]->getTall(); |
|
|
} |
|
|
else |
|
|
{ |
|
|
buttonOffset += _button[i]->getWide(); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
_slider->setButtonOffset( buttonOffset ); |
|
|
} |
|
|
|
|
|
int wide, tall; |
|
|
|
|
|
getSize( wide, tall ); |
|
|
setSize( wide, tall ); |
|
|
}
|
|
|
|