Mercurial > hg > svgui
comparison widgets/Thumbwheel.cpp @ 133:9e6b3e239b9d
* Add zoom thumbwheels to Pane. Implement horizontal thumbwheel, and
vertical depending on layer type (supported for waveform and spectrogram,
though wrong for log-scale spectrogram at the moment).
* Add bare bones of a spectrum layer.
* Add window icon
* Add shortcut for "insert time instant" on laptops without keypad enter (";")
* Delete FFT processing thread when it exits (at least, next time we're asked
for something interesting)
* Get audio file extensions from the file readers, and thus from libsndfile for
the wave file reader -- leads to rather a wide combo box in file dialog though
* Better refresh order for spectrogram (redraw centre section first)
author | Chris Cannam |
---|---|
date | Fri, 04 Aug 2006 17:01:37 +0000 |
parents | 5d3a483856ff |
children | 793df5f0c6cb |
comparison
equal
deleted
inserted
replaced
132:5d3a483856ff | 133:9e6b3e239b9d |
---|---|
21 #include <QPainter> | 21 #include <QPainter> |
22 | 22 |
23 #include <cmath> | 23 #include <cmath> |
24 #include <iostream> | 24 #include <iostream> |
25 | 25 |
26 Thumbwheel::Thumbwheel(int min, int max, int defaultValue, | 26 Thumbwheel::Thumbwheel(Qt::Orientation orientation, |
27 Qt::Orientation orientation, | |
28 QWidget *parent) : | 27 QWidget *parent) : |
29 QWidget(parent), | 28 QWidget(parent), |
30 m_min(min), | 29 m_min(0), |
31 m_max(max), | 30 m_max(100), |
32 m_default(defaultValue), | 31 m_default(50), |
33 m_value((min + max) / 2), | 32 m_value(50), |
34 m_orientation(orientation), | 33 m_orientation(orientation), |
34 m_speed(0.25), | |
35 m_tracking(true), | 35 m_tracking(true), |
36 m_showScale(true), | 36 m_showScale(true), |
37 m_clicked(false), | 37 m_clicked(false), |
38 m_atDefault(true), | |
38 m_clickValue(m_value) | 39 m_clickValue(m_value) |
39 { | 40 { |
40 if (max <= min) max = min + 1; | |
41 m_speed = float(max - min) / 300.f; | |
42 } | 41 } |
43 | 42 |
44 Thumbwheel::~Thumbwheel() | 43 Thumbwheel::~Thumbwheel() |
45 { | 44 { |
46 } | 45 } |
47 | 46 |
48 void | 47 void |
48 Thumbwheel::setMinimumValue(int min) | |
49 { | |
50 if (m_min == min) return; | |
51 | |
52 m_min = min; | |
53 if (m_max <= m_min) m_max = m_min + 1; | |
54 if (m_value < m_min) m_value = m_min; | |
55 if (m_value > m_max) m_value = m_max; | |
56 } | |
57 | |
58 int | |
59 Thumbwheel::getMinimumValue() const | |
60 { | |
61 return m_min; | |
62 } | |
63 | |
64 void | |
65 Thumbwheel::setMaximumValue(int max) | |
66 { | |
67 if (m_max == max) return; | |
68 | |
69 m_max = max; | |
70 if (m_min >= m_max) m_min = m_max - 1; | |
71 if (m_value < m_min) m_value = m_min; | |
72 if (m_value > m_max) m_value = m_max; | |
73 } | |
74 | |
75 int | |
76 Thumbwheel::getMaximumValue() const | |
77 { | |
78 return m_max; | |
79 } | |
80 | |
81 void | |
82 Thumbwheel::setDefaultValue(int deft) | |
83 { | |
84 if (m_default == deft) return; | |
85 | |
86 m_default = deft; | |
87 if (m_atDefault) { | |
88 setValue(m_default); | |
89 emit valueChanged(getValue()); | |
90 } | |
91 } | |
92 | |
93 int | |
94 Thumbwheel::getDefaultValue() const | |
95 { | |
96 return m_default; | |
97 } | |
98 | |
99 void | |
49 Thumbwheel::setValue(int value) | 100 Thumbwheel::setValue(int value) |
50 { | 101 { |
102 if (m_value == value) return; | |
103 m_atDefault = false; | |
104 | |
51 if (value < m_min) value = m_min; | 105 if (value < m_min) value = m_min; |
52 if (value > m_max) value = m_max; | 106 if (value > m_max) value = m_max; |
53 m_value = value; | 107 m_value = value; |
54 update(); | 108 update(); |
55 } | 109 } |
56 | 110 |
111 void | |
112 Thumbwheel::resetToDefault() | |
113 { | |
114 if (m_default == m_value) return; | |
115 setValue(m_default); | |
116 m_atDefault = true; | |
117 emit valueChanged(getValue()); | |
118 } | |
119 | |
57 int | 120 int |
58 Thumbwheel::getValue() const | 121 Thumbwheel::getValue() const |
59 { | 122 { |
60 return m_value; | 123 return m_value; |
61 } | 124 } |
97 } | 160 } |
98 | 161 |
99 void | 162 void |
100 Thumbwheel::mousePressEvent(QMouseEvent *e) | 163 Thumbwheel::mousePressEvent(QMouseEvent *e) |
101 { | 164 { |
102 m_clicked = true; | 165 if (e->button() == Qt::LeftButton) { |
103 m_clickPos = e->pos(); | 166 m_clicked = true; |
104 m_clickValue = m_value; | 167 m_clickPos = e->pos(); |
168 m_clickValue = m_value; | |
169 } else if (e->button() == Qt::MidButton) { | |
170 resetToDefault(); | |
171 } | |
105 } | 172 } |
106 | 173 |
107 void | 174 void |
108 Thumbwheel::mouseDoubleClickEvent(QMouseEvent *) | 175 Thumbwheel::mouseDoubleClickEvent(QMouseEvent *) |
109 { | 176 { |
110 setValue(m_default); | 177 resetToDefault(); |
111 emit valueChanged(getValue()); | |
112 } | 178 } |
113 | 179 |
114 void | 180 void |
115 Thumbwheel::mouseMoveEvent(QMouseEvent *e) | 181 Thumbwheel::mouseMoveEvent(QMouseEvent *e) |
116 { | 182 { |
183 if (!m_clicked) return; | |
117 int dist = 0; | 184 int dist = 0; |
118 if (m_orientation == Qt::Horizontal) { | 185 if (m_orientation == Qt::Horizontal) { |
119 dist = e->x() - m_clickPos.x(); | 186 dist = e->x() - m_clickPos.x(); |
120 } else { | 187 } else { |
121 dist = e->y() - m_clickPos.y(); | 188 dist = e->y() - m_clickPos.y(); |
130 } | 197 } |
131 | 198 |
132 void | 199 void |
133 Thumbwheel::mouseReleaseEvent(QMouseEvent *e) | 200 Thumbwheel::mouseReleaseEvent(QMouseEvent *e) |
134 { | 201 { |
202 if (!m_clicked) return; | |
135 bool reallyTracking = m_tracking; | 203 bool reallyTracking = m_tracking; |
136 m_tracking = true; | 204 m_tracking = true; |
137 mouseMoveEvent(e); | 205 mouseMoveEvent(e); |
138 m_tracking = reallyTracking; | 206 m_tracking = reallyTracking; |
207 m_clicked = false; | |
139 } | 208 } |
140 | 209 |
141 void | 210 void |
142 Thumbwheel::wheelEvent(QWheelEvent *e) | 211 Thumbwheel::wheelEvent(QWheelEvent *e) |
143 { | 212 { |
154 } | 223 } |
155 | 224 |
156 void | 225 void |
157 Thumbwheel::paintEvent(QPaintEvent *) | 226 Thumbwheel::paintEvent(QPaintEvent *) |
158 { | 227 { |
228 QPainter paint(this); | |
229 paint.fillRect(rect(), palette().background().color()); | |
230 paint.setRenderHint(QPainter::Antialiasing, false); | |
231 | |
232 int bw = 3; | |
233 | |
234 for (int i = 0; i < bw; ++i) { | |
235 int grey = (i + 1) * (256 / (bw + 1)); | |
236 QColor fc = QColor(grey, grey, grey); | |
237 paint.setPen(fc); | |
238 paint.drawRect(i, i, width() - i*2 - 1, height() - i*2 - 1); | |
239 } | |
240 | |
241 paint.setClipRect(QRect(bw, bw, width() - bw*2, height() - bw*2)); | |
242 | |
159 float distance = float(m_value - m_min) / float(m_max - m_min); | 243 float distance = float(m_value - m_min) / float(m_max - m_min); |
160 float rotation = distance * 1.5f * M_PI; | 244 float rotation = distance * 1.5f * M_PI; |
161 | 245 |
162 // std::cerr << "value = " << m_value << ", min = " << m_min << ", max = " << m_max << ", rotation = " << rotation << std::endl; | 246 // std::cerr << "value = " << m_value << ", min = " << m_min << ", max = " << m_max << ", rotation = " << rotation << std::endl; |
163 | 247 |
164 int w = (m_orientation == Qt::Horizontal ? width() : height()); | 248 int w = (m_orientation == Qt::Horizontal ? width() : height()) - bw*2; |
165 | 249 |
166 // total number of notches on the entire wheel | 250 // total number of notches on the entire wheel |
167 int notches = 25; | 251 int notches = 25; |
168 | 252 |
169 // radius of the wheel including invisible part | 253 // radius of the wheel including invisible part |
170 int radius = w / 2 + 2; | 254 int radius = w / 2 + 2; |
171 | 255 |
172 QPainter paint(this); | |
173 paint.fillRect(rect(), palette().background().color()); | |
174 paint.setRenderHint(QPainter::Antialiasing, true); | 256 paint.setRenderHint(QPainter::Antialiasing, true); |
175 | 257 |
176 for (int i = 0; i < notches; ++i) { | 258 for (int i = 0; i < notches; ++i) { |
177 | 259 |
178 float a0 = (2.f * M_PI * i) / notches + rotation; | 260 float a0 = (2.f * M_PI * i) / notches + rotation; |
188 if (x2 < 0 || x0 > w) continue; | 270 if (x2 < 0 || x0 > w) continue; |
189 | 271 |
190 if (x0 < 0) x0 = 0; | 272 if (x0 < 0) x0 = 0; |
191 if (x2 > w) x2 = w; | 273 if (x2 > w) x2 = w; |
192 | 274 |
275 x0 += bw; | |
276 x1 += bw; | |
277 x2 += bw; | |
278 | |
193 int grey = lrintf(255 * depth); | 279 int grey = lrintf(255 * depth); |
194 QColor fc = QColor(grey, grey, grey); | 280 QColor fc = QColor(grey, grey, grey); |
195 QColor oc = palette().dark().color(); | 281 QColor oc = palette().dark().color(); |
196 | 282 |
197 paint.setPen(oc); | 283 paint.setPen(oc); |
198 paint.setBrush(fc); | 284 paint.setBrush(fc); |
199 | 285 |
200 if (m_orientation == Qt::Horizontal) { | 286 if (m_orientation == Qt::Horizontal) { |
201 paint.drawRect(QRectF(x1, 0, x2 - x1, height())); | 287 paint.drawRect(QRectF(x1, bw, x2 - x1, height() - bw*2)); |
202 } else { | 288 } else { |
203 paint.drawRect(QRectF(0, x1, width(), x2 - x1)); | 289 paint.drawRect(QRectF(bw, x1, width() - bw*2, x2 - x1)); |
204 } | 290 } |
205 | 291 |
206 if (m_showScale) { | 292 if (m_showScale) { |
207 | 293 |
208 paint.setBrush(oc); | 294 paint.setBrush(oc); |
214 } else { | 300 } else { |
215 prop = 0.f; | 301 prop = 0.f; |
216 } | 302 } |
217 | 303 |
218 if (m_orientation == Qt::Horizontal) { | 304 if (m_orientation == Qt::Horizontal) { |
219 paint.drawRect(QRectF(x1, height() - height() * prop, | 305 paint.drawRect(QRectF(x1, height() - (height() - bw*2) * prop - bw, |
220 x2 - x1, height() * prop)); | 306 x2 - x1, height() * prop)); |
221 } else { | 307 } else { |
222 paint.drawRect(QRectF(0, x1, width() * prop, x2 - x1)); | 308 paint.drawRect(QRectF(bw, x1, (width() - bw*2) * prop, x2 - x1)); |
223 } | 309 } |
224 } | 310 } |
225 | 311 |
226 paint.setPen(oc); | 312 paint.setPen(oc); |
227 paint.setBrush(palette().background().color()); | 313 paint.setBrush(palette().background().color()); |
228 | 314 |
229 if (m_orientation == Qt::Horizontal) { | 315 if (m_orientation == Qt::Horizontal) { |
230 paint.drawRect(QRectF(x0, 0, x1 - x0, height())); | 316 paint.drawRect(QRectF(x0, bw, x1 - x0, height() - bw*2)); |
231 } else { | 317 } else { |
232 paint.drawRect(QRectF(0, x0, width(), x1 - x0)); | 318 paint.drawRect(QRectF(bw, x0, width() - bw*2, x1 - x0)); |
233 } | 319 } |
234 } | 320 } |
235 } | 321 } |
236 | 322 |
237 QSize | 323 QSize |