1 #ifndef QDRAWNSLIDER_H 2 #define QDRAWNSLIDER_H 3 // A set of simplistic (okay, not really) multimedia widgets that mimics stock 4 // QSliders, but completely disregards their storage semantics. 5 // 6 // These widgets use doubles rather than integers to store their positional- 7 // related attributes. This is important because timestamps are usually more 8 // accurate than a single second. 9 10 #include <QWidget> 11 #include <QImage> 12 #include <QMouseEvent> 13 14 class DrawnSlider : public QWidget { 15 Q_OBJECT 16 17 public: 18 explicit DrawnSlider(QWidget *parent, QSize handle, QSize margin); 19 void setValue(double v); 20 void setMaximum(double v); 21 void setMinimum(double v); 22 double value(); 23 double maximum(); 24 double minimum(); 25 26 signals: 27 void sliderMoved(double v); 28 29 protected: 30 void setSliderGeometry(int handleWidth, int handleHeight, 31 int marginX, int marginY); 32 virtual void makeBackground() = 0; 33 virtual void makeHandle() = 0; 34 virtual void handleHover(double x); 35 36 double valueToX(double value); 37 double xToValue(double x); 38 39 void paintEvent(QPaintEvent *event); 40 void resizeEvent(QResizeEvent *event); 41 42 bool redrawPics = true; 43 QImage backgroundPic; 44 QImage handlePics[16]; 45 46 QRectF drawnArea; 47 QRectF grooveArea; 48 QRectF sliderArea; 49 QColor grooveBorder, grooveFill; 50 QColor handleBorder, handleFill; 51 QColor bgColor, loopColor, markColor; 52 int handleWidth, handleHeight, marginX, marginY; 53 54 private: 55 void mousePressEvent(QMouseEvent *ev); 56 void mouseReleaseEvent(QMouseEvent *ev); 57 void mouseMoveEvent(QMouseEvent *ev); 58 59 bool isDragging = false; 60 double xPosition = 0.0; 61 62 double vValue = 0.0; 63 double vMaximum = 0.0; 64 double vMinimum = 0.0; 65 }; 66 67 class MediaSlider : public DrawnSlider { 68 Q_OBJECT 69 public: 70 explicit MediaSlider(QWidget *parent = nullptr); 71 72 void clearTicks(); 73 void setTick(double value, QString text); 74 void setLoopA(double a); 75 void setLoopB(double b); 76 double loopA(); 77 double loopB(); 78 bool isLoopEmpty(); 79 80 signals: 81 void hoverBegin(); 82 void hoverEnd(); 83 void hoverValue(double value, QString text, double x); 84 85 protected: 86 void resizeEvent(QResizeEvent *event); 87 void makeBackground(); 88 void makeHandle(); 89 void enterEvent(QEvent *event); 90 void leaveEvent(QEvent *event); 91 void handleHover(double x); 92 93 void updateLoopArea(); 94 95 QString valueToTickText(double value); 96 QMap<double, QString> ticks; 97 double vLoopA = -1; 98 double vLoopB = -1; 99 QRectF loopArea = { -1, -1, 0, 0}; 100 }; 101 102 class VolumeSlider : public DrawnSlider { 103 Q_OBJECT 104 105 public: 106 explicit VolumeSlider(QWidget *parent = nullptr); 107 108 protected: 109 void makeBackground(); 110 void makeHandle(); 111 }; 112 #endif // QDRAWNSLIDER_H 113