312 lines
6 KiB
C++
312 lines
6 KiB
C++
//========= Copyright © 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;
|
|
}
|
|
void intChanged(int value, Panel* panel) override
|
|
{
|
|
_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:
|
|
void actionPerformed(Panel* panel) override
|
|
{
|
|
_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);
|
|
}
|
|
|
|
void paintBackground() override
|
|
{
|
|
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);
|
|
}
|