#ifndef SLIDER_H #define SLIDER_H #include #include class QPropertyAnimation; class Slider; class Handle : public QWidget { Q_OBJECT Q_PROPERTY(qreal scaleFactor WRITE setScaleFactor READ scaleFactor) public: explicit Handle(Slider *slider); ~Handle(); inline QSize sizeHint() const Q_DECL_OVERRIDE { return QSize(20, 20); } inline void setRelativePosition(const QPoint &pos) { setPosition(_offset + pos); } inline void setPosition(const QPoint &pos) { _position = pos; refreshGeometry(); } inline const QPoint &position() const { return _position; } inline void setOffset(const QPoint &offset) { _offset = offset; update(); } inline const QPoint &offset() const { return _offset; } inline void setScaleFactor (qreal factor ) { _scaleFactor = factor; refreshGeometry(); } inline qreal scaleFactor() const { return _scaleFactor; } void refreshGeometry(); protected: void paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE; void mousePressEvent(QMouseEvent *event) Q_DECL_OVERRIDE; void mouseReleaseEvent(QMouseEvent *event) Q_DECL_OVERRIDE; void mouseMoveEvent(QMouseEvent *event) Q_DECL_OVERRIDE; private: Slider *const _slider; QPropertyAnimation *const _animation; QPoint _position; QPoint _eventPos; QPoint _offset; qreal _scaleFactor; }; class Slider : public QAbstractSlider { Q_OBJECT public: explicit Slider(QWidget *parent = 0); ~Slider(); inline void setOrientation(Qt::Orientation orientation) { _orientation = orientation; } inline Qt::Orientation orientation() const { return _orientation; } protected: void paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE; void mousePressEvent(QMouseEvent *event) Q_DECL_OVERRIDE; void mouseMoveEvent(QMouseEvent *event) Q_DECL_OVERRIDE; void resizeEvent(QResizeEvent *event) Q_DECL_OVERRIDE; private: friend class Handle; inline bool isOnTrack(int p, int x) const { return (p >= x-2 && p <= x+2); } void updateValue(); bool _drag; Handle *const _handle; Qt::Orientation _orientation; }; #endif // SLIDER_H