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