Portable Half-Life SDK. GoldSource and Xash3D. Crossplatform.
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.

311 lines
6.1 KiB

//========= 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;
public:
FooDefaultButtonSignal(ScrollBar2* scrollBar,int buttonIndex)
{
_scrollBar=scrollBar;
_buttonIndex=buttonIndex;
}
public:
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);
}