From 6fb7183006cbca1808983bf386b9d86bc316edbe Mon Sep 17 00:00:00 2001 From: laserpants Date: Tue, 3 May 2016 08:48:43 +0300 Subject: [PATCH] implement drag behavior --- components/slider.cpp | 42 ++++++++++++++++++++++++++++++++---------- components/slider.h | 1 + components/slider_p.h | 4 +++- 3 files changed, 36 insertions(+), 11 deletions(-) diff --git a/components/slider.cpp b/components/slider.cpp index 58bfa11..98122e4 100644 --- a/components/slider.cpp +++ b/components/slider.cpp @@ -59,28 +59,50 @@ void Slider::mouseMoveEvent(QMouseEvent *event) { Q_D(Slider); - QRect track(d->trackGeometry().adjusted(-2, -2, 2, 2)); + if (d->slide) { + setSliderPosition(d->valueFromPosition(event->pos())); + } else + { + QRect track(d->trackGeometry().adjusted(-2, -2, 2, 2)); - if (track.contains(event->pos()) != d->hoverTrack) { - d->hoverTrack = !d->hoverTrack; - update(); - } + if (track.contains(event->pos()) != d->hoverTrack) { + d->hoverTrack = !d->hoverTrack; + update(); + } - QRectF thumb(0, 0, 16, 16); - thumb.moveCenter(d->thumbGeometry().center()); + QRectF thumb(0, 0, 16, 16); + thumb.moveCenter(d->thumbGeometry().center()); - if (thumb.contains(event->pos()) != d->hoverThumb) { - d->hoverThumb = !d->hoverThumb; - update(); + if (thumb.contains(event->pos()) != d->hoverThumb) { + d->hoverThumb = !d->hoverThumb; + update(); + } } QAbstractSlider::mouseMoveEvent(event); } +void Slider::mousePressEvent(QMouseEvent *event) +{ + Q_D(Slider); + + QRectF thumb(0, 0, 16, 16); + thumb.moveCenter(d->thumbGeometry().center()); + + if (thumb.contains(event->pos())) { + d->slide = true; + } +} + void Slider::mouseReleaseEvent(QMouseEvent *event) { Q_D(Slider); + if (d->slide) { + d->slide = false; + return QAbstractSlider::mouseReleaseEvent(event); + } + QRect track(d->trackGeometry().adjusted(-2, -2, 2, 2)); if (track.contains(event->pos())) { diff --git a/components/slider.h b/components/slider.h index 7868149..39b5a6d 100644 --- a/components/slider.h +++ b/components/slider.h @@ -20,6 +20,7 @@ public: protected: void paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE; void mouseMoveEvent(QMouseEvent *event) Q_DECL_OVERRIDE; + void mousePressEvent(QMouseEvent *event) Q_DECL_OVERRIDE; void mouseReleaseEvent(QMouseEvent *event) Q_DECL_OVERRIDE; const QScopedPointer d_ptr; diff --git a/components/slider_p.h b/components/slider_p.h index 1ba766b..b6943dc 100644 --- a/components/slider_p.h +++ b/components/slider_p.h @@ -17,7 +17,8 @@ public: : q_ptr(parent), orientation(Qt::Horizontal), hoverTrack(false), - hoverThumb(false) + hoverThumb(false), + slide(false) { parent->setMouseTracking(true); } @@ -134,6 +135,7 @@ public: Qt::Orientation orientation; bool hoverTrack; bool hoverThumb; + bool slide; }; #endif // SLIDER_P_H