1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
|
#include "absolute-slider.hpp"
AbsoluteSlider::AbsoluteSlider(QWidget *parent) : SliderIgnoreScroll(parent)
{
installEventFilter(this);
setMouseTracking(true);
}
AbsoluteSlider::AbsoluteSlider(Qt::Orientation orientation, QWidget *parent)
: SliderIgnoreScroll(orientation, parent)
{
installEventFilter(this);
setMouseTracking(true);
}
void AbsoluteSlider::mousePressEvent(QMouseEvent *event)
{
dragging = (event->buttons() & Qt::LeftButton ||
event->buttons() & Qt::MiddleButton);
if (dragging) {
setSliderDown(true);
setValue(posToRangeValue(event));
emit AbsoluteSlider::sliderMoved(posToRangeValue(event));
}
event->accept();
}
void AbsoluteSlider::mouseReleaseEvent(QMouseEvent *event)
{
dragging = false;
setSliderDown(false);
event->accept();
}
void AbsoluteSlider::mouseMoveEvent(QMouseEvent *event)
{
int val = posToRangeValue(event);
if (val > maximum())
val = maximum();
else if (val < minimum())
val = minimum();
emit absoluteSliderHovered(val);
if (dragging) {
setValue(posToRangeValue(event));
emit AbsoluteSlider::sliderMoved(posToRangeValue(event));
}
QSlider::mouseMoveEvent(event);
event->accept();
}
bool AbsoluteSlider::eventFilter(QObject *obj, QEvent *event)
{
if (event->type() == QEvent::KeyPress) {
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
if (keyEvent->key() == Qt::Key_Up ||
keyEvent->key() == Qt::Key_Down) {
return true;
}
}
return QSlider::eventFilter(obj, event);
}
int AbsoluteSlider::posToRangeValue(QMouseEvent *event)
{
QStyleOptionSlider opt;
initStyleOption(&opt);
int pos;
int sliderMin;
int sliderMax;
int handleLength;
const QRect groove = style()->subControlRect(
QStyle::CC_Slider, &opt, QStyle::SC_SliderGroove, this);
const QRect handle = style()->subControlRect(
QStyle::CC_Slider, &opt, QStyle::SC_SliderHandle, this);
if (orientation() == Qt::Horizontal) {
pos = event->pos().x();
handleLength = handle.width();
sliderMin = groove.left() + (handleLength / 2);
sliderMax = groove.right() - (handleLength / 2) + 1;
} else {
pos = event->pos().y();
handleLength = handle.height();
sliderMin = groove.top() + (handleLength / 2);
sliderMax = groove.bottom() - (handleLength / 2) + 1;
}
int sliderValue = style()->sliderValueFromPosition(
minimum(), maximum(), pos - sliderMin, sliderMax - sliderMin,
opt.upsideDown);
return sliderValue;
}
|