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