Mercurial > hg > easaier-soundaccess
comparison view/Overview.cpp @ 0:fc9323a41f5a
start base : Sonic Visualiser sv1-1.0rc1
author | lbajardsilogic |
---|---|
date | Fri, 11 May 2007 09:08:14 +0000 |
parents | |
children | be6d31baecb9 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:fc9323a41f5a |
---|---|
1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ | |
2 | |
3 /* | |
4 Sonic Visualiser | |
5 An audio file viewer and annotation editor. | |
6 Centre for Digital Music, Queen Mary, University of London. | |
7 This file copyright 2006 Chris Cannam and QMUL. | |
8 | |
9 This program is free software; you can redistribute it and/or | |
10 modify it under the terms of the GNU General Public License as | |
11 published by the Free Software Foundation; either version 2 of the | |
12 License, or (at your option) any later version. See the file | |
13 COPYING included with this distribution for more information. | |
14 */ | |
15 | |
16 #include "Overview.h" | |
17 #include "layer/Layer.h" | |
18 #include "data/model/Model.h" | |
19 #include "base/ZoomConstraint.h" | |
20 #include "system/System.h" | |
21 | |
22 #include <QPaintEvent> | |
23 #include <QPainter> | |
24 #include <iostream> | |
25 | |
26 using std::cerr; | |
27 using std::endl; | |
28 | |
29 Overview::Overview(QWidget *w) : | |
30 View(w, false), | |
31 m_clickedInRange(false) | |
32 { | |
33 setObjectName(tr("Overview")); | |
34 m_followPan = false; | |
35 m_followZoom = false; | |
36 setPlaybackFollow(PlaybackIgnore); | |
37 } | |
38 | |
39 void | |
40 Overview::modelChanged(size_t startFrame, size_t endFrame) | |
41 { | |
42 View::modelChanged(startFrame, endFrame); | |
43 } | |
44 | |
45 void | |
46 Overview::modelReplaced() | |
47 { | |
48 View::modelReplaced(); | |
49 } | |
50 | |
51 void | |
52 Overview::registerView(View *view) | |
53 { | |
54 m_views.insert(view); | |
55 update(); | |
56 } | |
57 | |
58 void | |
59 Overview::unregisterView(View *view) | |
60 { | |
61 m_views.erase(view); | |
62 update(); | |
63 } | |
64 | |
65 void | |
66 Overview::globalCentreFrameChanged(unsigned long) | |
67 { | |
68 update(); | |
69 } | |
70 | |
71 void | |
72 Overview::viewCentreFrameChanged(View *v, unsigned long) | |
73 { | |
74 if (m_views.find(v) != m_views.end()) { | |
75 update(); | |
76 } | |
77 } | |
78 | |
79 void | |
80 Overview::viewZoomLevelChanged(View *v, unsigned long, bool) | |
81 { | |
82 if (v == this) return; | |
83 if (m_views.find(v) != m_views.end()) { | |
84 update(); | |
85 } | |
86 } | |
87 | |
88 void | |
89 Overview::viewManagerPlaybackFrameChanged(unsigned long f) | |
90 { | |
91 bool changed = false; | |
92 | |
93 if (getXForFrame(m_playPointerFrame) != getXForFrame(f)) changed = true; | |
94 m_playPointerFrame = f; | |
95 | |
96 if (changed) update(); | |
97 } | |
98 | |
99 void | |
100 Overview::paintEvent(QPaintEvent *e) | |
101 { | |
102 // Recalculate zoom in case the size of the widget has changed. | |
103 | |
104 // std::cerr << "Overview::paintEvent: width is " << width() << ", centre frame " << m_centreFrame << std::endl; | |
105 | |
106 size_t startFrame = getModelsStartFrame(); | |
107 size_t frameCount = getModelsEndFrame() - getModelsStartFrame(); | |
108 int zoomLevel = frameCount / width(); | |
109 if (zoomLevel < 1) zoomLevel = 1; | |
110 zoomLevel = getZoomConstraintBlockSize(zoomLevel, | |
111 ZoomConstraint::RoundUp); | |
112 if (zoomLevel != m_zoomLevel) { | |
113 m_zoomLevel = zoomLevel; | |
114 emit zoomLevelChanged(m_zoomLevel, m_followZoom); | |
115 } | |
116 size_t centreFrame = startFrame + m_zoomLevel * (width() / 2); | |
117 if (centreFrame > (startFrame + getModelsEndFrame())/2) { | |
118 centreFrame = (startFrame + getModelsEndFrame())/2; | |
119 } | |
120 if (centreFrame != m_centreFrame) { | |
121 // std::cerr << "Overview::paintEvent: Centre frame changed from " | |
122 // << m_centreFrame << " to " << centreFrame << " and thus start frame from " << getStartFrame(); | |
123 m_centreFrame = centreFrame; | |
124 // std::cerr << " to " << getStartFrame() << std::endl; | |
125 emit centreFrameChanged(m_centreFrame, false, PlaybackIgnore); | |
126 } | |
127 | |
128 View::paintEvent(e); | |
129 | |
130 QPainter paint; | |
131 paint.begin(this); | |
132 | |
133 QRect r(rect()); | |
134 | |
135 if (e) { | |
136 r = e->rect(); | |
137 paint.setClipRect(r); | |
138 } | |
139 | |
140 paint.setPen(Qt::black); | |
141 | |
142 int y = 0; | |
143 | |
144 int prevx0 = -10; | |
145 int prevx1 = -10; | |
146 | |
147 for (ViewSet::iterator i = m_views.begin(); i != m_views.end(); ++i) { | |
148 if (!*i) continue; | |
149 | |
150 View *w = (View *)*i; | |
151 | |
152 long f0 = w->getFrameForX(0); | |
153 long f1 = w->getFrameForX(w->width()); | |
154 | |
155 int x0 = getXForFrame(f0); | |
156 int x1 = getXForFrame(f1); | |
157 | |
158 if (x0 != prevx0 || x1 != prevx1) { | |
159 y += height() / 10 + 1; | |
160 prevx0 = x0; | |
161 prevx1 = x1; | |
162 } | |
163 | |
164 if (x1 <= x0) x1 = x0 + 1; | |
165 | |
166 paint.drawRect(x0, y, x1 - x0, height() - 2 * y); | |
167 } | |
168 | |
169 paint.end(); | |
170 } | |
171 | |
172 void | |
173 Overview::mousePressEvent(QMouseEvent *e) | |
174 { | |
175 m_clickPos = e->pos(); | |
176 for (ViewSet::iterator i = m_views.begin(); i != m_views.end(); ++i) { | |
177 if (*i) { | |
178 m_clickedInRange = true; | |
179 m_dragCentreFrame = ((View *)*i)->getCentreFrame(); | |
180 break; | |
181 } | |
182 } | |
183 } | |
184 | |
185 void | |
186 Overview::mouseReleaseEvent(QMouseEvent *e) | |
187 { | |
188 if (m_clickedInRange) { | |
189 mouseMoveEvent(e); | |
190 } | |
191 m_clickedInRange = false; | |
192 } | |
193 | |
194 void | |
195 Overview::mouseMoveEvent(QMouseEvent *e) | |
196 { | |
197 if (!m_clickedInRange) return; | |
198 | |
199 long xoff = int(e->x()) - int(m_clickPos.x()); | |
200 long frameOff = xoff * m_zoomLevel; | |
201 | |
202 size_t newCentreFrame = m_dragCentreFrame; | |
203 if (frameOff > 0) { | |
204 newCentreFrame += frameOff; | |
205 } else if (newCentreFrame >= size_t(-frameOff)) { | |
206 newCentreFrame += frameOff; | |
207 } else { | |
208 newCentreFrame = 0; | |
209 } | |
210 | |
211 if (newCentreFrame >= getModelsEndFrame()) { | |
212 newCentreFrame = getModelsEndFrame(); | |
213 if (newCentreFrame > 0) --newCentreFrame; | |
214 } | |
215 | |
216 if (max(m_centreFrame, newCentreFrame) - | |
217 min(m_centreFrame, newCentreFrame) > size_t(m_zoomLevel)) { | |
218 emit centreFrameChanged(newCentreFrame, true, PlaybackScrollContinuous); | |
219 } | |
220 } | |
221 | |
222 void | |
223 Overview::mouseDoubleClickEvent(QMouseEvent *e) | |
224 { | |
225 long frame = getFrameForX(e->x()); | |
226 emit centreFrameChanged(frame, true, PlaybackScrollContinuous); | |
227 } | |
228 | |
229 void | |
230 Overview::enterEvent(QEvent *) | |
231 { | |
232 emit contextHelpChanged(tr("Click and drag to navigate; double-click to jump")); | |
233 } | |
234 | |
235 void | |
236 Overview::leaveEvent(QEvent *) | |
237 { | |
238 emit contextHelpChanged(""); | |
239 } | |
240 | |
241 |