mirror of
https://github.com/shawns-valve/halflife.git
synced 2024-11-24 21:21:15 +00:00
311 lines
5.8 KiB
C++
311 lines
5.8 KiB
C++
|
//========= Copyright <20> 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);
|
|||
|
}
|