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