Mercurial > hg > svgui
comparison view/AlignmentView.cpp @ 867:99373ca20caf alignment_view
First sketch at alignment view (between panes in stack)
author | Chris Cannam |
---|---|
date | Fri, 17 Oct 2014 14:58:51 +0100 |
parents | |
children | 99299949f965 |
comparison
equal
deleted
inserted
replaced
866:d854c72dcaa1 | 867:99373ca20caf |
---|---|
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-2014 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 "AlignmentView.h" | |
17 | |
18 #include <QPainter> | |
19 | |
20 using std::vector; | |
21 | |
22 AlignmentView::AlignmentView(QWidget *w) : | |
23 View(w, false), | |
24 m_above(0), | |
25 m_below(0) | |
26 { | |
27 setObjectName(tr("AlignmentView")); | |
28 } | |
29 | |
30 void | |
31 AlignmentView::globalCentreFrameChanged(int f) | |
32 { | |
33 View::globalCentreFrameChanged(f); | |
34 update(); | |
35 } | |
36 | |
37 void | |
38 AlignmentView::viewCentreFrameChanged(View *v, int f) | |
39 { | |
40 View::viewCentreFrameChanged(v, f); | |
41 if (v == m_above) { | |
42 m_centreFrame = f; | |
43 update(); | |
44 } else if (v == m_below) { | |
45 update(); | |
46 } | |
47 } | |
48 | |
49 void | |
50 AlignmentView::viewManagerPlaybackFrameChanged(int) | |
51 { | |
52 update(); | |
53 } | |
54 | |
55 void | |
56 AlignmentView::viewAboveZoomLevelChanged(int level, bool) | |
57 { | |
58 m_zoomLevel = level; | |
59 update(); | |
60 } | |
61 | |
62 void | |
63 AlignmentView::viewBelowZoomLevelChanged(int, bool) | |
64 { | |
65 update(); | |
66 } | |
67 | |
68 void | |
69 AlignmentView::setViewAbove(View *v) | |
70 { | |
71 if (m_above) { | |
72 disconnect(m_above, 0, this, 0); | |
73 } | |
74 | |
75 m_above = v; | |
76 | |
77 if (m_above) { | |
78 connect(m_above, | |
79 SIGNAL(zoomLevelChanged(int, bool)), | |
80 this, | |
81 SLOT(viewAboveZoomLevelChanged(int, bool))); | |
82 } | |
83 } | |
84 | |
85 void | |
86 AlignmentView::setViewBelow(View *v) | |
87 { | |
88 if (m_below) { | |
89 disconnect(m_below, 0, this, 0); | |
90 } | |
91 | |
92 m_below = v; | |
93 | |
94 if (m_below) { | |
95 connect(m_below, | |
96 SIGNAL(zoomLevelChanged(int, bool)), | |
97 this, | |
98 SLOT(viewBelowZoomLevelChanged(int, bool))); | |
99 } | |
100 } | |
101 | |
102 void | |
103 AlignmentView::paintEvent(QPaintEvent *) | |
104 { | |
105 if (m_above == 0 || m_below == 0 || !m_manager) return; | |
106 | |
107 int rate = m_manager->getMainModelSampleRate(); | |
108 if (rate == 0) return; | |
109 | |
110 bool darkPalette = false; | |
111 if (m_manager) darkPalette = m_manager->getGlobalDarkBackground(); | |
112 | |
113 QColor fg = Qt::black, bg = Qt::white; | |
114 if (darkPalette) std::swap(fg, bg); | |
115 | |
116 QPainter paint(this); | |
117 paint.setPen(QPen(fg, 2)); | |
118 paint.setBrush(Qt::NoBrush); | |
119 paint.setRenderHint(QPainter::Antialiasing, true); | |
120 | |
121 paint.fillRect(rect(), bg); | |
122 | |
123 vector<int> keyFrames; | |
124 for (int f = m_above->getModelsStartFrame(); | |
125 f <= m_above->getModelsEndFrame(); | |
126 f += rate * 5) { | |
127 keyFrames.push_back(f); | |
128 } | |
129 | |
130 foreach (int f, keyFrames) { | |
131 int af = m_above->alignFromReference(f); | |
132 int ax = m_above->getXForFrame(af); | |
133 int bf = m_below->alignFromReference(f); | |
134 int bx = m_below->getXForFrame(bf); | |
135 paint.drawLine(ax, 0, bx, height()); | |
136 } | |
137 | |
138 paint.end(); | |
139 } | |
140 |