2
#if QT_VERSION >= 0x040000
3
#include <qstyleoption.h>
7
ScrollBar::ScrollBar(QWidget * parent):
13
ScrollBar::ScrollBar(Qt::Orientation o,
20
ScrollBar::ScrollBar(double minBase, double maxBase,
21
Qt::Orientation o, QWidget *parent):
25
setBase(minBase, maxBase);
26
moveSlider(minBase, maxBase);
29
void ScrollBar::init()
31
d_inverted = orientation() == Qt::Vertical;
32
d_baseTicks = 1000000;
35
moveSlider(d_minBase, d_maxBase);
37
connect(this, SIGNAL(sliderMoved(int)), SLOT(catchSliderMoved(int)));
38
connect(this, SIGNAL(valueChanged(int)), SLOT(catchValueChanged(int)));
41
void ScrollBar::setInverted(bool inverted)
43
if ( d_inverted != inverted )
45
d_inverted = inverted;
46
moveSlider(minSliderValue(), maxSliderValue());
50
bool ScrollBar::isInverted() const
55
void ScrollBar::setBase(double min, double max)
57
if ( min != d_minBase || max != d_maxBase )
62
moveSlider(minSliderValue(), maxSliderValue());
66
void ScrollBar::moveSlider(double min, double max)
68
const int sliderTicks = qRound((max - min) /
69
(d_maxBase - d_minBase) * d_baseTicks);
71
// setRange initiates a valueChanged of the scrollbars
72
// in some situations. So we block
73
// and unblock the signals.
77
setRange(sliderTicks / 2, d_baseTicks - sliderTicks / 2);
78
int steps = sliderTicks / 200;
82
#if QT_VERSION < 0x040000
83
setSteps(steps, sliderTicks);
86
setPageStep(sliderTicks);
89
int tick = mapToTick(min + (max - min) / 2);
91
tick = d_baseTicks - tick;
93
#if QT_VERSION < 0x040000
97
setSliderPosition(tick);
102
double ScrollBar::minBaseValue() const
107
double ScrollBar::maxBaseValue() const
112
void ScrollBar::sliderRange(int value, double &min, double &max) const
115
value = d_baseTicks - value;
117
const int visibleTicks = pageStep();
119
min = mapFromTick(value - visibleTicks / 2);
120
max = mapFromTick(value + visibleTicks / 2);
123
double ScrollBar::minSliderValue() const
126
sliderRange(value(), min, dummy);
131
double ScrollBar::maxSliderValue() const
134
sliderRange(value(), dummy, max);
139
int ScrollBar::mapToTick(double v) const
141
return (int) ( ( v - d_minBase) / (d_maxBase - d_minBase ) * d_baseTicks );
144
double ScrollBar::mapFromTick(int tick) const
146
return d_minBase + ( d_maxBase - d_minBase ) * tick / d_baseTicks;
149
void ScrollBar::catchValueChanged(int value)
152
sliderRange(value, min, max);
153
emit valueChanged(orientation(), min, max);
156
void ScrollBar::catchSliderMoved(int value)
159
sliderRange(value, min, max);
160
emit sliderMoved(orientation(), min, max);
163
int ScrollBar::extent() const
165
#if QT_VERSION < 0x040000
166
return style().pixelMetric(QStyle::PM_ScrollBarExtent, this);
168
QStyleOptionSlider opt;
170
opt.subControls = QStyle::SC_None;
171
opt.activeSubControls = QStyle::SC_None;
172
opt.orientation = orientation();
173
opt.minimum = minimum();
174
opt.maximum = maximum();
175
opt.sliderPosition = sliderPosition();
176
opt.sliderValue = value();
177
opt.singleStep = singleStep();
178
opt.pageStep = pageStep();
179
opt.upsideDown = invertedAppearance();
180
if (orientation() == Qt::Horizontal)
181
opt.state |= QStyle::State_Horizontal;
182
return style()->pixelMetric(QStyle::PM_ScrollBarExtent, &opt, this);