benoitrigolleau@211
|
1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
|
benoitrigolleau@211
|
2
|
benoitrigolleau@211
|
3 /* Sound Access
|
benoitrigolleau@211
|
4 EASAIER client application.
|
benoitrigolleau@211
|
5 Silogic 2007. Benoit Rigolleau.
|
benoitrigolleau@211
|
6
|
benoitrigolleau@211
|
7 This program is free software; you can redistribute it and/or
|
benoitrigolleau@211
|
8 modify it under the terms of the GNU General Public License as
|
benoitrigolleau@211
|
9 published by the Free Software Foundation; either version 2 of the
|
benoitrigolleau@211
|
10 License, or (at your option) any later version. See the file
|
benoitrigolleau@211
|
11 COPYING included with this distribution for more information.
|
benoitrigolleau@211
|
12 */
|
benoitrigolleau@211
|
13
|
benoitrigolleau@211
|
14 #include "Plotter.h"
|
benoitrigolleau@211
|
15 #include <QtGui>
|
benoitrigolleau@211
|
16
|
benoitrigolleau@211
|
17 Plotter::Plotter(QWidget *parent):
|
benoitrigolleau@211
|
18 m_signalWidth(400),
|
benoitrigolleau@211
|
19 m_signalHeight(180),
|
benoitrigolleau@211
|
20 m_margin(5),
|
benoitrigolleau@211
|
21 m_curveMaskActive(false)
|
benoitrigolleau@211
|
22 {
|
benoitrigolleau@211
|
23 m_curveMask = new int[m_signalWidth];
|
benoitrigolleau@211
|
24 for(int i = 0 ; i < m_signalWidth ; i++){
|
benoitrigolleau@211
|
25 m_curveMask[i] = 0;
|
benoitrigolleau@211
|
26 }
|
benoitrigolleau@211
|
27
|
benoitrigolleau@211
|
28
|
benoitrigolleau@211
|
29 m_curve.push_back(QPoint(399,179));
|
benoitrigolleau@211
|
30 m_curve.push_back(QPoint(300,20));
|
benoitrigolleau@211
|
31 m_curve.push_back(QPoint(60,150));
|
benoitrigolleau@211
|
32 m_curve.push_back(QPoint(10,30));
|
benoitrigolleau@211
|
33 m_curve.push_back(QPoint(0,0));
|
benoitrigolleau@211
|
34
|
lbajardsilogic@222
|
35 setMinimumSize(QSize(m_signalWidth + 10, m_signalHeight + 10));
|
benoitrigolleau@211
|
36
|
benoitrigolleau@211
|
37 refreshPixmap();
|
benoitrigolleau@211
|
38
|
benoitrigolleau@211
|
39 }
|
benoitrigolleau@211
|
40
|
benoitrigolleau@211
|
41 void Plotter::setCurveData(const QVector<QPoint> &data){
|
benoitrigolleau@211
|
42 m_curve = data;
|
benoitrigolleau@211
|
43 refreshPixmap();
|
benoitrigolleau@211
|
44 }
|
benoitrigolleau@211
|
45
|
benoitrigolleau@211
|
46 void Plotter::clearCurve(){
|
benoitrigolleau@211
|
47 m_curve.clear();
|
benoitrigolleau@211
|
48 refreshPixmap();
|
benoitrigolleau@211
|
49 }
|
benoitrigolleau@211
|
50
|
benoitrigolleau@211
|
51 void Plotter::paintEvent(QPaintEvent *event){
|
benoitrigolleau@211
|
52 QStylePainter painter(this);
|
benoitrigolleau@211
|
53 painter.drawPixmap(0, 0, m_pixmap);
|
benoitrigolleau@211
|
54 }
|
benoitrigolleau@211
|
55
|
benoitrigolleau@211
|
56 void Plotter::resizeEvent(QResizeEvent *event){
|
benoitrigolleau@211
|
57 refreshPixmap();
|
benoitrigolleau@211
|
58 }
|
benoitrigolleau@211
|
59
|
benoitrigolleau@211
|
60 void Plotter::mousePressEvent(QMouseEvent *event){
|
benoitrigolleau@211
|
61 QRect rect(m_margin, m_margin,
|
benoitrigolleau@211
|
62 m_signalWidth + m_margin, m_signalHeight + m_margin);
|
benoitrigolleau@211
|
63
|
benoitrigolleau@211
|
64 if (event->button() == Qt::LeftButton) {
|
benoitrigolleau@211
|
65 if (rect.contains(event->pos())) {
|
benoitrigolleau@211
|
66 m_curveMaskActive = true;
|
benoitrigolleau@211
|
67 int x = event->pos().x()- m_margin;
|
benoitrigolleau@211
|
68 int y = event->pos().y()- m_margin;
|
benoitrigolleau@211
|
69 m_curveMask[x] = y;
|
benoitrigolleau@211
|
70 m_lastPoint.setX(x);
|
benoitrigolleau@211
|
71 m_lastPoint.setY(y);
|
benoitrigolleau@211
|
72 setCursor(Qt::CrossCursor);
|
benoitrigolleau@211
|
73 refreshPixmap();
|
benoitrigolleau@211
|
74 }
|
benoitrigolleau@211
|
75 }
|
benoitrigolleau@211
|
76 }
|
benoitrigolleau@211
|
77
|
benoitrigolleau@211
|
78 void Plotter::mouseMoveEvent(QMouseEvent *event){
|
benoitrigolleau@211
|
79 QRect rect(m_margin, m_margin,
|
benoitrigolleau@211
|
80 m_signalWidth + m_margin , m_signalHeight + m_margin);
|
benoitrigolleau@211
|
81
|
benoitrigolleau@211
|
82 if(m_curveMaskActive && rect.contains(event->pos())){
|
benoitrigolleau@211
|
83 int x = event->pos().x() - m_margin;
|
benoitrigolleau@211
|
84 int y = event->pos().y() - m_margin;
|
benoitrigolleau@211
|
85 if(y>m_signalHeight-1)
|
benoitrigolleau@211
|
86 y= m_signalHeight-1;
|
benoitrigolleau@211
|
87 int xlast = m_lastPoint.x();
|
benoitrigolleau@211
|
88 int ylast = m_lastPoint.y();
|
benoitrigolleau@211
|
89
|
benoitrigolleau@211
|
90 //regul mask curve
|
benoitrigolleau@211
|
91 int minx, maxx, miny, maxy;
|
benoitrigolleau@211
|
92 if(x>xlast){
|
benoitrigolleau@211
|
93 minx = xlast;
|
benoitrigolleau@211
|
94 maxx = x;
|
benoitrigolleau@211
|
95 }else{
|
benoitrigolleau@211
|
96 minx = x;
|
benoitrigolleau@211
|
97 maxx = xlast;
|
benoitrigolleau@211
|
98 }
|
benoitrigolleau@211
|
99 if(y>ylast){
|
benoitrigolleau@211
|
100 miny = ylast;
|
benoitrigolleau@211
|
101 maxy = y;
|
benoitrigolleau@211
|
102 }else{
|
benoitrigolleau@211
|
103 miny = y;
|
benoitrigolleau@211
|
104 maxy = ylast;
|
benoitrigolleau@211
|
105 }
|
benoitrigolleau@211
|
106
|
benoitrigolleau@211
|
107 if((maxx - minx)>1){
|
benoitrigolleau@211
|
108 double incr = (double)(maxy - miny)/(double)(maxx - minx);
|
benoitrigolleau@211
|
109 if(x>xlast){
|
benoitrigolleau@211
|
110 for (int i = xlast + 1 ; i < x ; i++){
|
benoitrigolleau@211
|
111 if(ylast > y){
|
benoitrigolleau@211
|
112 m_curveMask[i] = ylast - (i-xlast)*incr;
|
benoitrigolleau@211
|
113 }else{
|
benoitrigolleau@211
|
114 m_curveMask[i] = ylast + (i-xlast)*incr;
|
benoitrigolleau@211
|
115 }
|
benoitrigolleau@211
|
116 }
|
benoitrigolleau@211
|
117 }else{
|
benoitrigolleau@211
|
118 for (int i = xlast - 1 ; i > x ; i--){
|
benoitrigolleau@211
|
119 if(ylast > y){
|
benoitrigolleau@211
|
120 m_curveMask[i] = ylast + (i-xlast)*incr;
|
benoitrigolleau@211
|
121 }else{
|
benoitrigolleau@211
|
122 m_curveMask[i] = ylast - (i-xlast)*incr;
|
benoitrigolleau@211
|
123 }
|
benoitrigolleau@211
|
124 }
|
benoitrigolleau@211
|
125 }
|
benoitrigolleau@211
|
126 }
|
benoitrigolleau@211
|
127 m_curveMask[x] = y;
|
benoitrigolleau@211
|
128 m_lastPoint.setX(x);
|
benoitrigolleau@211
|
129 m_lastPoint.setY(y);
|
benoitrigolleau@211
|
130 refreshPixmap();
|
benoitrigolleau@211
|
131 }
|
benoitrigolleau@211
|
132 }
|
benoitrigolleau@211
|
133
|
benoitrigolleau@211
|
134 void Plotter::mouseReleaseEvent(QMouseEvent *event){
|
benoitrigolleau@211
|
135 if ((event->button() == Qt::LeftButton) && m_curveMaskActive) {
|
benoitrigolleau@211
|
136 m_curveMaskActive = false;
|
benoitrigolleau@211
|
137 unsetCursor();
|
benoitrigolleau@211
|
138 }
|
benoitrigolleau@211
|
139 }
|
benoitrigolleau@211
|
140
|
benoitrigolleau@211
|
141 void Plotter::drawGrid(QPainter *painter){
|
benoitrigolleau@211
|
142 QPixmap pm(":icons/grid.png");
|
benoitrigolleau@211
|
143 painter->drawPixmap(0,0,pm);
|
benoitrigolleau@211
|
144 }
|
benoitrigolleau@211
|
145
|
benoitrigolleau@211
|
146 void Plotter::drawCurve(QPainter *painter){
|
benoitrigolleau@220
|
147 painter->setRenderHint (QPainter::Antialiasing, true );
|
benoitrigolleau@211
|
148 QPolygonF polyline(m_signalWidth);
|
benoitrigolleau@211
|
149 for(int i = 0 ; i < m_curve.count() ; i++){
|
benoitrigolleau@211
|
150 polyline[i] = QPoint(m_curve.at(i).x()+m_margin, m_curve.at(i).y()+m_margin);
|
benoitrigolleau@211
|
151 }
|
benoitrigolleau@211
|
152 painter->setPen(Qt::green);
|
benoitrigolleau@211
|
153 painter->drawPolyline(polyline);
|
benoitrigolleau@211
|
154 }
|
benoitrigolleau@211
|
155
|
benoitrigolleau@211
|
156 void Plotter::drawMaskCurve(QPainter *painter){
|
benoitrigolleau@211
|
157
|
benoitrigolleau@220
|
158 painter->setRenderHint (QPainter::Antialiasing, true );
|
benoitrigolleau@220
|
159
|
benoitrigolleau@211
|
160 QPolygonF polyline(m_signalWidth);
|
benoitrigolleau@211
|
161
|
benoitrigolleau@211
|
162 for(int i = 0 ; i < m_signalWidth ; i++){
|
benoitrigolleau@211
|
163 polyline[i] = QPoint(i+m_margin, m_curveMask[i]+m_margin);
|
benoitrigolleau@211
|
164 }
|
benoitrigolleau@211
|
165 painter->setPen(Qt::red);
|
benoitrigolleau@211
|
166 painter->drawPolyline(polyline);
|
benoitrigolleau@211
|
167 }
|
benoitrigolleau@211
|
168
|
benoitrigolleau@211
|
169 void Plotter::refreshPixmap(){
|
benoitrigolleau@211
|
170 m_pixmap = QPixmap(size());
|
benoitrigolleau@211
|
171 m_pixmap.fill(this, 0, 0);
|
benoitrigolleau@211
|
172
|
benoitrigolleau@211
|
173 QPainter painter(&m_pixmap);
|
benoitrigolleau@211
|
174 painter.initFrom(this);
|
benoitrigolleau@211
|
175 drawGrid(&painter);
|
benoitrigolleau@211
|
176 drawCurve(&painter);
|
benoitrigolleau@211
|
177 drawMaskCurve(&painter);
|
benoitrigolleau@211
|
178 update();
|
benoitrigolleau@211
|
179 }
|
benoitrigolleau@211
|
180
|
benoitrigolleau@211
|
181 void Plotter::setMargin(int margin){
|
benoitrigolleau@211
|
182 m_margin = margin;
|
benoitrigolleau@211
|
183 } |