//========= Copyright � 1996-2002, Valve LLC, All rights reserved. ============ // // Purpose: // // $NoKeywords: $ //============================================================================= #include "vgui_scrollbar2.h" #include "vgui_slider2.h" #include "vgui_loadtga.h" #include #include #include #include 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 ); }