|
@@ -1,29 +1,42 @@
|
|
-#include "slider-absoluteset-style.hpp"
|
|
|
|
#include "absolute-slider.hpp"
|
|
#include "absolute-slider.hpp"
|
|
-#include <QStyleFactory>
|
|
|
|
|
|
|
|
AbsoluteSlider::AbsoluteSlider(QWidget *parent) : SliderIgnoreScroll(parent)
|
|
AbsoluteSlider::AbsoluteSlider(QWidget *parent) : SliderIgnoreScroll(parent)
|
|
{
|
|
{
|
|
installEventFilter(this);
|
|
installEventFilter(this);
|
|
setMouseTracking(true);
|
|
setMouseTracking(true);
|
|
|
|
+}
|
|
|
|
|
|
- QString styleName = style()->objectName();
|
|
|
|
- QStyle *style;
|
|
|
|
- style = QStyleFactory::create(styleName);
|
|
|
|
- if (!style) {
|
|
|
|
- style = new SliderAbsoluteSetStyle();
|
|
|
|
- } else {
|
|
|
|
- style = new SliderAbsoluteSetStyle(style);
|
|
|
|
|
|
+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));
|
|
}
|
|
}
|
|
|
|
|
|
- style->setParent(this);
|
|
|
|
- this->setStyle(style);
|
|
|
|
|
|
+ event->accept();
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void AbsoluteSlider::mouseReleaseEvent(QMouseEvent *event)
|
|
|
|
+{
|
|
|
|
+ dragging = false;
|
|
|
|
+ setSliderDown(false);
|
|
|
|
+ event->accept();
|
|
}
|
|
}
|
|
|
|
|
|
void AbsoluteSlider::mouseMoveEvent(QMouseEvent *event)
|
|
void AbsoluteSlider::mouseMoveEvent(QMouseEvent *event)
|
|
{
|
|
{
|
|
- int val = minimum() +
|
|
|
|
- ((maximum() - minimum()) * event->pos().x()) / width();
|
|
|
|
|
|
+ int val = posToRangeValue(event);
|
|
|
|
|
|
if (val > maximum())
|
|
if (val > maximum())
|
|
val = maximum();
|
|
val = maximum();
|
|
@@ -31,8 +44,14 @@ void AbsoluteSlider::mouseMoveEvent(QMouseEvent *event)
|
|
val = minimum();
|
|
val = minimum();
|
|
|
|
|
|
emit absoluteSliderHovered(val);
|
|
emit absoluteSliderHovered(val);
|
|
- event->accept();
|
|
|
|
|
|
+
|
|
|
|
+ if (dragging) {
|
|
|
|
+ setValue(posToRangeValue(event));
|
|
|
|
+ emit AbsoluteSlider::sliderMoved(posToRangeValue(event));
|
|
|
|
+ }
|
|
|
|
+
|
|
QSlider::mouseMoveEvent(event);
|
|
QSlider::mouseMoveEvent(event);
|
|
|
|
+ event->accept();
|
|
}
|
|
}
|
|
|
|
|
|
bool AbsoluteSlider::eventFilter(QObject *obj, QEvent *event)
|
|
bool AbsoluteSlider::eventFilter(QObject *obj, QEvent *event)
|
|
@@ -51,3 +70,37 @@ bool AbsoluteSlider::eventFilter(QObject *obj, QEvent *event)
|
|
|
|
|
|
return QSlider::eventFilter(obj, event);
|
|
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;
|
|
|
|
+}
|