2024-04-28 19:13:02 +02:00
|
|
|
#include "absolute-slider.hpp"
|
2018-08-24 03:43:44 +02:00
|
|
|
|
2024-04-28 19:13:02 +02:00
|
|
|
AbsoluteSlider::AbsoluteSlider(QWidget *parent) : SliderIgnoreScroll(parent)
|
2018-08-24 03:43:44 +02:00
|
|
|
{
|
2022-06-11 20:11:27 +02:00
|
|
|
installEventFilter(this);
|
2018-08-24 03:43:44 +02:00
|
|
|
setMouseTracking(true);
|
2024-04-28 19:29:02 +02:00
|
|
|
}
|
2018-08-24 03:43:44 +02:00
|
|
|
|
2024-04-28 19:29:02 +02:00
|
|
|
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));
|
2018-08-24 03:43:44 +02:00
|
|
|
}
|
|
|
|
|
2024-04-28 19:29:02 +02:00
|
|
|
event->accept();
|
|
|
|
}
|
|
|
|
|
|
|
|
void AbsoluteSlider::mouseReleaseEvent(QMouseEvent *event)
|
|
|
|
{
|
|
|
|
dragging = false;
|
|
|
|
setSliderDown(false);
|
|
|
|
event->accept();
|
2018-08-24 03:43:44 +02:00
|
|
|
}
|
|
|
|
|
2024-04-28 19:13:02 +02:00
|
|
|
void AbsoluteSlider::mouseMoveEvent(QMouseEvent *event)
|
2018-08-24 03:43:44 +02:00
|
|
|
{
|
2024-04-28 19:29:02 +02:00
|
|
|
int val = posToRangeValue(event);
|
2018-08-24 03:43:44 +02:00
|
|
|
|
|
|
|
if (val > maximum())
|
|
|
|
val = maximum();
|
|
|
|
else if (val < minimum())
|
|
|
|
val = minimum();
|
|
|
|
|
2024-04-28 19:13:02 +02:00
|
|
|
emit absoluteSliderHovered(val);
|
2024-04-28 19:29:02 +02:00
|
|
|
|
|
|
|
if (dragging) {
|
|
|
|
setValue(posToRangeValue(event));
|
|
|
|
emit AbsoluteSlider::sliderMoved(posToRangeValue(event));
|
|
|
|
}
|
|
|
|
|
2018-08-24 03:43:44 +02:00
|
|
|
QSlider::mouseMoveEvent(event);
|
2024-04-28 19:29:02 +02:00
|
|
|
event->accept();
|
2018-08-24 03:43:44 +02:00
|
|
|
}
|
2022-06-11 20:11:27 +02:00
|
|
|
|
2024-04-28 19:13:02 +02:00
|
|
|
bool AbsoluteSlider::eventFilter(QObject *obj, QEvent *event)
|
2022-06-11 20:11:27 +02:00
|
|
|
{
|
|
|
|
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);
|
|
|
|
}
|
2024-04-28 19:29:02 +02:00
|
|
|
|
|
|
|
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;
|
|
|
|
}
|