lbajardsilogic@0
|
1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
|
lbajardsilogic@0
|
2
|
lbajardsilogic@0
|
3 /*
|
lbajardsilogic@0
|
4 Sonic Visualiser
|
lbajardsilogic@0
|
5 An audio file viewer and annotation editor.
|
lbajardsilogic@0
|
6 Centre for Digital Music, Queen Mary, University of London.
|
lbajardsilogic@0
|
7 This file copyright 2006 QMUL.
|
lbajardsilogic@0
|
8
|
lbajardsilogic@0
|
9 This program is free software; you can redistribute it and/or
|
lbajardsilogic@0
|
10 modify it under the terms of the GNU General Public License as
|
lbajardsilogic@0
|
11 published by the Free Software Foundation; either version 2 of the
|
lbajardsilogic@0
|
12 License, or (at your option) any later version. See the file
|
lbajardsilogic@0
|
13 COPYING included with this distribution for more information.
|
lbajardsilogic@0
|
14 */
|
lbajardsilogic@0
|
15
|
lbajardsilogic@0
|
16 #include "Panner.h"
|
lbajardsilogic@0
|
17
|
lbajardsilogic@0
|
18 #include <QMouseEvent>
|
lbajardsilogic@0
|
19 #include <QPaintEvent>
|
lbajardsilogic@0
|
20 #include <QWheelEvent>
|
lbajardsilogic@0
|
21 #include <QPainter>
|
lbajardsilogic@0
|
22
|
lbajardsilogic@0
|
23 #include <iostream>
|
lbajardsilogic@0
|
24 #include <cmath>
|
lbajardsilogic@0
|
25
|
lbajardsilogic@0
|
26 #include "system/System.h"
|
lbajardsilogic@0
|
27
|
lbajardsilogic@0
|
28 Panner::Panner(QWidget *parent) :
|
lbajardsilogic@0
|
29 QWidget(parent),
|
lbajardsilogic@0
|
30 m_rectX(0),
|
lbajardsilogic@0
|
31 m_rectY(0),
|
lbajardsilogic@0
|
32 m_rectWidth(1),
|
lbajardsilogic@0
|
33 m_rectHeight(1),
|
lbajardsilogic@0
|
34 m_defaultCentreX(0),
|
lbajardsilogic@0
|
35 m_defaultCentreY(0),
|
lbajardsilogic@0
|
36 m_defaultsSet(false),
|
lbajardsilogic@0
|
37 m_thumbColour(palette().highlightedText().color()),
|
lbajardsilogic@0
|
38 m_backgroundAlpha(255),
|
lbajardsilogic@0
|
39 m_thumbAlpha(255),
|
lbajardsilogic@0
|
40 m_clicked(false)
|
lbajardsilogic@0
|
41 {
|
lbajardsilogic@0
|
42 }
|
lbajardsilogic@0
|
43
|
lbajardsilogic@0
|
44 Panner::~Panner()
|
lbajardsilogic@0
|
45 {
|
lbajardsilogic@0
|
46 }
|
lbajardsilogic@0
|
47
|
lbajardsilogic@0
|
48 void
|
lbajardsilogic@0
|
49 Panner::setAlpha(int backgroundAlpha, int thumbAlpha)
|
lbajardsilogic@0
|
50 {
|
lbajardsilogic@0
|
51 m_backgroundAlpha = backgroundAlpha;
|
lbajardsilogic@0
|
52 m_thumbAlpha = thumbAlpha;
|
lbajardsilogic@0
|
53 }
|
lbajardsilogic@0
|
54
|
lbajardsilogic@0
|
55 void
|
lbajardsilogic@0
|
56 Panner::mousePressEvent(QMouseEvent *e)
|
lbajardsilogic@0
|
57 {
|
lbajardsilogic@0
|
58 if (e->button() == Qt::MidButton ||
|
lbajardsilogic@0
|
59 ((e->button() == Qt::LeftButton) &&
|
lbajardsilogic@0
|
60 (e->modifiers() & Qt::ControlModifier))) {
|
lbajardsilogic@0
|
61 resetToDefault();
|
lbajardsilogic@0
|
62 } else if (e->button() == Qt::LeftButton) {
|
lbajardsilogic@0
|
63 m_clicked = true;
|
lbajardsilogic@0
|
64 m_clickPos = e->pos();
|
lbajardsilogic@0
|
65 m_dragStartX = m_rectX;
|
lbajardsilogic@0
|
66 m_dragStartY = m_rectY;
|
lbajardsilogic@0
|
67 }
|
lbajardsilogic@0
|
68 }
|
lbajardsilogic@0
|
69
|
lbajardsilogic@0
|
70 void
|
lbajardsilogic@0
|
71 Panner::mouseDoubleClickEvent(QMouseEvent *e)
|
lbajardsilogic@0
|
72 {
|
lbajardsilogic@0
|
73 if (e->button() != Qt::LeftButton) {
|
lbajardsilogic@0
|
74 return;
|
lbajardsilogic@0
|
75 }
|
lbajardsilogic@0
|
76
|
lbajardsilogic@0
|
77 emit doubleClicked();
|
lbajardsilogic@0
|
78 }
|
lbajardsilogic@0
|
79
|
lbajardsilogic@0
|
80 void
|
lbajardsilogic@0
|
81 Panner::mouseMoveEvent(QMouseEvent *e)
|
lbajardsilogic@0
|
82 {
|
lbajardsilogic@0
|
83 if (!m_clicked) return;
|
lbajardsilogic@0
|
84
|
lbajardsilogic@0
|
85 float dx = float(e->pos().x() - m_clickPos.x()) / float(width());
|
lbajardsilogic@0
|
86 float dy = float(e->pos().y() - m_clickPos.y()) / float(height());
|
lbajardsilogic@0
|
87
|
lbajardsilogic@0
|
88 m_rectX = m_dragStartX + dx;
|
lbajardsilogic@0
|
89 m_rectY = m_dragStartY + dy;
|
lbajardsilogic@0
|
90
|
lbajardsilogic@0
|
91 normalise();
|
lbajardsilogic@0
|
92 repaint();
|
lbajardsilogic@0
|
93 emit rectExtentsChanged(m_rectX, m_rectY, m_rectWidth, m_rectHeight);
|
lbajardsilogic@0
|
94 emit rectCentreMoved(centreX(), centreY());
|
lbajardsilogic@0
|
95 }
|
lbajardsilogic@0
|
96
|
lbajardsilogic@0
|
97 void
|
lbajardsilogic@0
|
98 Panner::mouseReleaseEvent(QMouseEvent *e)
|
lbajardsilogic@0
|
99 {
|
lbajardsilogic@0
|
100 if (!m_clicked) return;
|
lbajardsilogic@0
|
101
|
lbajardsilogic@0
|
102 mouseMoveEvent(e);
|
lbajardsilogic@0
|
103 m_clicked = false;
|
lbajardsilogic@0
|
104 }
|
lbajardsilogic@0
|
105
|
lbajardsilogic@0
|
106 void
|
lbajardsilogic@0
|
107 Panner::wheelEvent(QWheelEvent *e)
|
lbajardsilogic@0
|
108 {
|
lbajardsilogic@0
|
109 if (e->delta() < 0) {
|
lbajardsilogic@0
|
110 m_rectY += 0.1;
|
lbajardsilogic@0
|
111 } else {
|
lbajardsilogic@0
|
112 m_rectY -= 0.1;
|
lbajardsilogic@0
|
113 }
|
lbajardsilogic@0
|
114
|
lbajardsilogic@0
|
115 normalise();
|
lbajardsilogic@0
|
116 emitAndUpdate();
|
lbajardsilogic@0
|
117 }
|
lbajardsilogic@0
|
118
|
lbajardsilogic@0
|
119 void
|
lbajardsilogic@0
|
120 Panner::enterEvent(QEvent *)
|
lbajardsilogic@0
|
121 {
|
lbajardsilogic@0
|
122 emit mouseEntered();
|
lbajardsilogic@0
|
123 }
|
lbajardsilogic@0
|
124
|
lbajardsilogic@0
|
125 void
|
lbajardsilogic@0
|
126 Panner::leaveEvent(QEvent *)
|
lbajardsilogic@0
|
127 {
|
lbajardsilogic@0
|
128 emit mouseLeft();
|
lbajardsilogic@0
|
129 }
|
lbajardsilogic@0
|
130
|
lbajardsilogic@0
|
131 void
|
lbajardsilogic@0
|
132 Panner::paintEvent(QPaintEvent *)
|
lbajardsilogic@0
|
133 {
|
lbajardsilogic@0
|
134 QPainter paint(this);
|
lbajardsilogic@0
|
135 paint.setRenderHint(QPainter::Antialiasing, false);
|
lbajardsilogic@0
|
136
|
lbajardsilogic@0
|
137 QColor bg(palette().background().color());
|
lbajardsilogic@0
|
138 bg.setAlpha(m_backgroundAlpha);
|
lbajardsilogic@0
|
139
|
lbajardsilogic@0
|
140 paint.setPen(palette().dark().color());
|
lbajardsilogic@0
|
141 paint.setBrush(bg);
|
lbajardsilogic@0
|
142 paint.drawRect(0, 0, width(), height());
|
lbajardsilogic@0
|
143
|
lbajardsilogic@0
|
144 QColor hl(m_thumbColour);
|
lbajardsilogic@0
|
145 hl.setAlpha(m_thumbAlpha);
|
lbajardsilogic@0
|
146
|
lbajardsilogic@0
|
147 paint.setBrush(hl);
|
lbajardsilogic@0
|
148
|
lbajardsilogic@0
|
149 paint.drawRect(lrintf(width() * m_rectX),
|
lbajardsilogic@0
|
150 lrintf(height() * m_rectY),
|
lbajardsilogic@0
|
151 lrintf(width() * m_rectWidth),
|
lbajardsilogic@0
|
152 lrintf(height() * m_rectHeight));
|
lbajardsilogic@0
|
153 }
|
lbajardsilogic@0
|
154
|
lbajardsilogic@0
|
155 void
|
lbajardsilogic@0
|
156 Panner::normalise()
|
lbajardsilogic@0
|
157 {
|
lbajardsilogic@0
|
158 if (m_rectWidth > 1.0) m_rectWidth = 1.0;
|
lbajardsilogic@0
|
159 if (m_rectHeight > 1.0) m_rectHeight = 1.0;
|
lbajardsilogic@0
|
160 if (m_rectX + m_rectWidth > 1.0) m_rectX = 1.0 - m_rectWidth;
|
lbajardsilogic@0
|
161 if (m_rectX < 0) m_rectX = 0;
|
lbajardsilogic@0
|
162 if (m_rectY + m_rectHeight > 1.0) m_rectY = 1.0 - m_rectHeight;
|
lbajardsilogic@0
|
163 if (m_rectY < 0) m_rectY = 0;
|
lbajardsilogic@0
|
164
|
lbajardsilogic@0
|
165 if (!m_defaultsSet) {
|
lbajardsilogic@0
|
166 m_defaultCentreX = centreX();
|
lbajardsilogic@0
|
167 m_defaultCentreY = centreY();
|
lbajardsilogic@0
|
168 m_defaultsSet = true;
|
lbajardsilogic@0
|
169 }
|
lbajardsilogic@0
|
170 }
|
lbajardsilogic@0
|
171
|
lbajardsilogic@0
|
172 void
|
lbajardsilogic@0
|
173 Panner::emitAndUpdate()
|
lbajardsilogic@0
|
174 {
|
lbajardsilogic@0
|
175 emit rectExtentsChanged(m_rectX, m_rectY, m_rectWidth, m_rectHeight);
|
lbajardsilogic@0
|
176 emit rectCentreMoved(centreX(), centreY());
|
lbajardsilogic@0
|
177 update();
|
lbajardsilogic@0
|
178 }
|
lbajardsilogic@0
|
179
|
lbajardsilogic@0
|
180 void
|
lbajardsilogic@0
|
181 Panner::getRectExtents(float &x0, float &y0, float &width, float &height)
|
lbajardsilogic@0
|
182 {
|
lbajardsilogic@0
|
183 x0 = m_rectX;
|
lbajardsilogic@0
|
184 y0 = m_rectY;
|
lbajardsilogic@0
|
185 width = m_rectWidth;
|
lbajardsilogic@0
|
186 height = m_rectHeight;
|
lbajardsilogic@0
|
187 }
|
lbajardsilogic@0
|
188
|
lbajardsilogic@0
|
189 void
|
lbajardsilogic@0
|
190 Panner::setRectExtents(float x0, float y0, float width, float height)
|
lbajardsilogic@0
|
191 {
|
lbajardsilogic@0
|
192 // std::cerr << "Panner::setRectExtents(" << x0 << ", " << y0 << ", "
|
lbajardsilogic@0
|
193 // << width << ", " << height << ")" << std::endl;
|
lbajardsilogic@0
|
194
|
lbajardsilogic@0
|
195 if (m_rectX == x0 &&
|
lbajardsilogic@0
|
196 m_rectY == y0 &&
|
lbajardsilogic@0
|
197 m_rectWidth == width &&
|
lbajardsilogic@0
|
198 m_rectHeight == height) {
|
lbajardsilogic@0
|
199 return;
|
lbajardsilogic@0
|
200 }
|
lbajardsilogic@0
|
201
|
lbajardsilogic@0
|
202 m_rectX = x0;
|
lbajardsilogic@0
|
203 m_rectY = y0;
|
lbajardsilogic@0
|
204 m_rectWidth = width;
|
lbajardsilogic@0
|
205 m_rectHeight = height;
|
lbajardsilogic@0
|
206
|
lbajardsilogic@0
|
207 normalise();
|
lbajardsilogic@0
|
208 emitAndUpdate();
|
lbajardsilogic@0
|
209 }
|
lbajardsilogic@0
|
210
|
lbajardsilogic@0
|
211 void
|
lbajardsilogic@0
|
212 Panner::setRectWidth(float width)
|
lbajardsilogic@0
|
213 {
|
lbajardsilogic@0
|
214 if (m_rectWidth == width) return;
|
lbajardsilogic@0
|
215 m_rectWidth = width;
|
lbajardsilogic@0
|
216 normalise();
|
lbajardsilogic@0
|
217 emitAndUpdate();
|
lbajardsilogic@0
|
218 }
|
lbajardsilogic@0
|
219
|
lbajardsilogic@0
|
220 void
|
lbajardsilogic@0
|
221 Panner::setRectHeight(float height)
|
lbajardsilogic@0
|
222 {
|
lbajardsilogic@0
|
223 if (m_rectHeight == height) return;
|
lbajardsilogic@0
|
224 m_rectHeight = height;
|
lbajardsilogic@0
|
225 normalise();
|
lbajardsilogic@0
|
226 emitAndUpdate();
|
lbajardsilogic@0
|
227 }
|
lbajardsilogic@0
|
228
|
lbajardsilogic@0
|
229 void
|
lbajardsilogic@0
|
230 Panner::setRectCentreX(float x)
|
lbajardsilogic@0
|
231 {
|
lbajardsilogic@0
|
232 float x0 = x - m_rectWidth/2;
|
lbajardsilogic@0
|
233 if (x0 == m_rectX) return;
|
lbajardsilogic@0
|
234 m_rectX = x0;
|
lbajardsilogic@0
|
235 normalise();
|
lbajardsilogic@0
|
236 emitAndUpdate();
|
lbajardsilogic@0
|
237 }
|
lbajardsilogic@0
|
238
|
lbajardsilogic@0
|
239 void
|
lbajardsilogic@0
|
240 Panner::setRectCentreY(float y)
|
lbajardsilogic@0
|
241 {
|
lbajardsilogic@0
|
242 float y0 = y - m_rectHeight/2;
|
lbajardsilogic@0
|
243 if (y0 == m_rectY) return;
|
lbajardsilogic@0
|
244 m_rectY = y0;
|
lbajardsilogic@0
|
245 normalise();
|
lbajardsilogic@0
|
246 emitAndUpdate();
|
lbajardsilogic@0
|
247 }
|
lbajardsilogic@0
|
248
|
lbajardsilogic@0
|
249 QSize
|
lbajardsilogic@0
|
250 Panner::sizeHint() const
|
lbajardsilogic@0
|
251 {
|
lbajardsilogic@0
|
252 return QSize(30, 30);
|
lbajardsilogic@0
|
253 }
|
lbajardsilogic@0
|
254
|
lbajardsilogic@0
|
255 void
|
lbajardsilogic@0
|
256 Panner::setDefaultRectCentre(float cx, float cy)
|
lbajardsilogic@0
|
257 {
|
lbajardsilogic@0
|
258 m_defaultCentreX = cx;
|
lbajardsilogic@0
|
259 m_defaultCentreY = cy;
|
lbajardsilogic@0
|
260 m_defaultsSet = true;
|
lbajardsilogic@0
|
261 }
|
lbajardsilogic@0
|
262
|
lbajardsilogic@0
|
263 void
|
lbajardsilogic@0
|
264 Panner::resetToDefault()
|
lbajardsilogic@0
|
265 {
|
lbajardsilogic@0
|
266 float x0 = m_defaultCentreX - m_rectWidth/2;
|
lbajardsilogic@0
|
267 float y0 = m_defaultCentreY - m_rectHeight/2;
|
lbajardsilogic@0
|
268 if (x0 == m_rectX && y0 == m_rectY) return;
|
lbajardsilogic@0
|
269 m_rectX = x0;
|
lbajardsilogic@0
|
270 m_rectY = y0;
|
lbajardsilogic@0
|
271 normalise();
|
lbajardsilogic@0
|
272 emitAndUpdate();
|
lbajardsilogic@0
|
273 }
|
lbajardsilogic@0
|
274
|
lbajardsilogic@0
|
275
|