Chris@923
|
1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
|
Chris@923
|
2
|
Chris@923
|
3 /*
|
Chris@923
|
4 Sonic Visualiser
|
Chris@923
|
5 An audio file viewer and annotation editor.
|
Chris@923
|
6 Centre for Digital Music, Queen Mary, University of London.
|
Chris@923
|
7
|
Chris@923
|
8 This program is free software; you can redistribute it and/or
|
Chris@923
|
9 modify it under the terms of the GNU General Public License as
|
Chris@923
|
10 published by the Free Software Foundation; either version 2 of the
|
Chris@923
|
11 License, or (at your option) any later version. See the file
|
Chris@923
|
12 COPYING included with this distribution for more information.
|
Chris@923
|
13 */
|
Chris@923
|
14
|
Chris@923
|
15 #ifndef LEVEL_PAN_WIDGET_H
|
Chris@923
|
16 #define LEVEL_PAN_WIDGET_H
|
Chris@923
|
17
|
Chris@923
|
18 #include <QWidget>
|
Chris@923
|
19
|
Chris@1303
|
20 #include "WheelCounter.h"
|
Chris@1303
|
21
|
Chris@923
|
22 /**
|
Chris@923
|
23 * A simple widget for coarse level and pan control.
|
Chris@923
|
24 */
|
Chris@923
|
25
|
Chris@923
|
26 class LevelPanWidget : public QWidget
|
Chris@923
|
27 {
|
Chris@923
|
28 Q_OBJECT
|
Chris@923
|
29
|
Chris@923
|
30 public:
|
Chris@923
|
31 LevelPanWidget(QWidget *parent = 0);
|
Chris@923
|
32 ~LevelPanWidget();
|
Chris@923
|
33
|
Chris@1201
|
34 /// Return level as a gain value. The basic level range is [0,1] but the
|
Chris@1201
|
35 /// gain scale may go up to 4.0
|
Chris@923
|
36 float getLevel() const;
|
Chris@923
|
37
|
Chris@923
|
38 /// Return pan as a value in the range [-1,1]
|
Chris@923
|
39 float getPan() const;
|
Chris@923
|
40
|
Chris@923
|
41 /// Find out whether the widget is editable
|
Chris@923
|
42 bool isEditable() const;
|
Chris@923
|
43
|
Chris@940
|
44 /// Discover whether the level range includes muting or not
|
Chris@940
|
45 bool includesMute() const;
|
Chris@940
|
46
|
Chris@929
|
47 /// Draw a suitably sized copy of the widget's contents to the given device
|
Chris@929
|
48 void renderTo(QPaintDevice *, QRectF, bool asIfEditable) const;
|
Chris@929
|
49
|
Chris@1406
|
50 QSize sizeHint() const override;
|
Chris@929
|
51
|
Chris@923
|
52 public slots:
|
Chris@1201
|
53 /// Set level. The basic level range is [0,1] but the scale may go
|
Chris@1201
|
54 /// higher. The value will be rounded.
|
Chris@923
|
55 void setLevel(float);
|
Chris@923
|
56
|
Chris@1201
|
57 /// Set pan in the range [-1,1]. The value will be rounded
|
Chris@923
|
58 void setPan(float);
|
Chris@923
|
59
|
Chris@1177
|
60 /// Set left and right peak monitoring levels in the range [0,1]
|
Chris@1177
|
61 void setMonitoringLevels(float, float);
|
Chris@1177
|
62
|
Chris@923
|
63 /// Specify whether the widget is editable or read-only (default editable)
|
Chris@923
|
64 void setEditable(bool);
|
Chris@940
|
65
|
Chris@940
|
66 /// Specify whether the level range should include muting or not
|
Chris@940
|
67 void setIncludeMute(bool);
|
Chris@1249
|
68
|
Chris@1249
|
69 /// Reset to default values
|
Chris@1249
|
70 void setToDefault();
|
Chris@923
|
71
|
Chris@1200
|
72 // public so it can be called from LevelPanToolButton (ew)
|
Chris@1406
|
73 void wheelEvent(QWheelEvent *ev) override;
|
Chris@1200
|
74
|
Chris@923
|
75 signals:
|
Chris@1177
|
76 void levelChanged(float); // range [0,1]
|
Chris@1177
|
77 void panChanged(float); // range [-1,1]
|
Chris@923
|
78
|
Chris@1180
|
79 void mouseEntered();
|
Chris@1180
|
80 void mouseLeft();
|
Chris@1180
|
81
|
Chris@923
|
82 protected:
|
Chris@1406
|
83 void mousePressEvent(QMouseEvent *ev) override;
|
Chris@1406
|
84 void mouseMoveEvent(QMouseEvent *ev) override;
|
Chris@1406
|
85 void mouseReleaseEvent(QMouseEvent *ev) override;
|
Chris@1406
|
86 void paintEvent(QPaintEvent *ev) override;
|
Chris@1406
|
87 void enterEvent(QEvent *) override;
|
Chris@1406
|
88 void leaveEvent(QEvent *) override;
|
Chris@923
|
89
|
Chris@923
|
90 void emitLevelChanged();
|
Chris@923
|
91 void emitPanChanged();
|
Chris@1301
|
92
|
Chris@1301
|
93 int m_minNotch;
|
Chris@1301
|
94 int m_maxNotch;
|
Chris@1301
|
95 int m_notch;
|
Chris@923
|
96 int m_pan;
|
Chris@1177
|
97 float m_monitorLeft;
|
Chris@1177
|
98 float m_monitorRight;
|
Chris@923
|
99 bool m_editable;
|
Chris@1249
|
100 bool m_editing;
|
Chris@940
|
101 bool m_includeMute;
|
Chris@1301
|
102 bool m_includeHalfSteps;
|
Chris@1303
|
103
|
Chris@1303
|
104 WheelCounter m_wheelCounter;
|
Chris@923
|
105
|
Chris@1301
|
106 int clampNotch(int notch) const;
|
Chris@1302
|
107 int clampPan(int pan) const;
|
Chris@1177
|
108
|
Chris@1301
|
109 int audioLevelToNotch(float audioLevel) const;
|
Chris@1301
|
110 float notchToAudioLevel(int notch) const;
|
Chris@1301
|
111
|
Chris@1301
|
112 int audioPanToPan(float audioPan) const;
|
Chris@1301
|
113 float panToAudioPan(int pan) const;
|
Chris@1301
|
114
|
Chris@1301
|
115 int coordsToNotch(QRectF rect, QPointF pos) const;
|
Chris@1301
|
116 int coordsToPan(QRectF rect, QPointF pos) const;
|
Chris@1301
|
117
|
Chris@1306
|
118 QColor cellToColour(int cell) const;
|
Chris@1177
|
119
|
Chris@929
|
120 QSizeF cellSize(QRectF) const;
|
Chris@1301
|
121 QPointF cellCentre(QRectF, int row, int col) const;
|
Chris@929
|
122 QSizeF cellLightSize(QRectF) const;
|
Chris@1301
|
123 QRectF cellLightRect(QRectF, int row, int col) const;
|
Chris@1301
|
124 QRectF cellOutlineRect(QRectF, int row, int col) const;
|
Chris@929
|
125 double thinLineWidth(QRectF) const;
|
Chris@1304
|
126 double cornerRadius(QRectF) const;
|
Chris@923
|
127 };
|
Chris@923
|
128
|
Chris@923
|
129 #endif
|