From b07e24edcc91e28edfacdb64114b5f5ace644666 Mon Sep 17 00:00:00 2001 From: laserpants Date: Thu, 24 Mar 2016 08:52:27 +0300 Subject: [PATCH] implement correct slider handle positioning --- components/slider.cpp | 47 +++++++++++++++++++++++++++++++------------ components/slider.h | 6 ++++++ 2 files changed, 40 insertions(+), 13 deletions(-) diff --git a/components/slider.cpp b/components/slider.cpp index 6b75ed4..ed0f499 100644 --- a/components/slider.cpp +++ b/components/slider.cpp @@ -13,6 +13,31 @@ Handle::~Handle() { } +void Handle::setPosition(const QPoint &pos) +{ + _position = pos; + refreshGeometry(); +} + +void Handle::refreshGeometry() +{ + QWidget *container = parentWidget(); + const QSize s = sizeHint(); + + setGeometry(QRect(_slider->orientation() == Qt::Horizontal + ? QPoint(qBound(0, _position.x(), container->width()-s.width()), container->height()/2-s.height()/2) + : QPoint(container->width()/2-s.width()/2, qBound(0, _position.y(), container->height()-s.height())), s)); + + update(); +} + +bool Handle::event(QEvent *event) +{ + qDebug() << event; + + return QWidget::event(event); +} + void Handle::paintEvent(QPaintEvent *event) { QPainter painter(this); @@ -38,15 +63,7 @@ void Handle::mouseReleaseEvent(QMouseEvent *event) void Handle::mouseMoveEvent(QMouseEvent *event) { - Q_UNUSED(event) - - QWidget *container = parentWidget(); - const QPoint d = _offset + event->globalPos() - _eventPos; - const QSize s = sizeHint(); - QRect r(_slider->orientation() == Qt::Horizontal - ? QPoint(qBound(0, d.x(), container->width()-s.width()), container->height()/2-s.height()/2) - : QPoint(container->width()/2-s.width()/2, qBound(0, d.y(), container->height()-s.height())), s); - setGeometry(r); + setPosition(_offset + event->globalPos() - _eventPos); } Slider::Slider(QWidget *parent) @@ -84,10 +101,14 @@ void Slider::paintEvent(QPaintEvent *event) void Slider::mousePressEvent(QMouseEvent *event) { const QSize s = _handle->sizeHint(); - - _handle->setGeometry(QRect(Qt::Horizontal == _orientation - ? QPoint(event->pos().x()-s.width()/2, height()/2-s.height()/2) - : QPoint(width()/2-s.width()/2, event->pos().y()-s.height()/2), s)); + _handle->setPosition(event->pos() - QPoint(s.width()/2, s.height()/2)); QWidget::mousePressEvent(event); } + +void Slider::resizeEvent(QResizeEvent *event) +{ + _handle->refreshGeometry(); + + QWidget::resizeEvent(event); +} diff --git a/components/slider.h b/components/slider.h index c92139a..fdf2ea8 100644 --- a/components/slider.h +++ b/components/slider.h @@ -15,8 +15,12 @@ public: ~Handle(); inline QSize sizeHint() const { return QSize(16, 16); } + inline const QPoint &position() const { return _position; } + inline void setPosition(const QPoint &pos); + void refreshGeometry(); protected: + bool event(QEvent *event); void paintEvent(QPaintEvent *event); void mousePressEvent(QMouseEvent *event); void mouseReleaseEvent(QMouseEvent *event); @@ -24,6 +28,7 @@ protected: private: Slider *const _slider; + QPoint _position; QPoint _eventPos; QPoint _offset; }; @@ -42,6 +47,7 @@ public: protected: void paintEvent(QPaintEvent *event); void mousePressEvent(QMouseEvent *event); + void resizeEvent(QResizeEvent *event); private: Handle *const _handle;