benoitrigolleau@211: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ benoitrigolleau@211: benoitrigolleau@211: /* Sound Access benoitrigolleau@211: EASAIER client application. benoitrigolleau@211: Silogic 2007. Benoit Rigolleau. benoitrigolleau@211: benoitrigolleau@211: This program is free software; you can redistribute it and/or benoitrigolleau@211: modify it under the terms of the GNU General Public License as benoitrigolleau@211: published by the Free Software Foundation; either version 2 of the benoitrigolleau@211: License, or (at your option) any later version. See the file benoitrigolleau@211: COPYING included with this distribution for more information. benoitrigolleau@211: */ benoitrigolleau@211: benoitrigolleau@211: #include "Plotter.h" benoitrigolleau@211: #include benoitrigolleau@211: benoitrigolleau@211: Plotter::Plotter(QWidget *parent): benoitrigolleau@211: m_signalWidth(400), benoitrigolleau@211: m_signalHeight(180), benoitrigolleau@211: m_margin(5), benoitrigolleau@211: m_curveMaskActive(false) benoitrigolleau@211: { benoitrigolleau@211: m_curveMask = new int[m_signalWidth]; benoitrigolleau@211: for(int i = 0 ; i < m_signalWidth ; i++){ benoitrigolleau@211: m_curveMask[i] = 0; benoitrigolleau@211: } benoitrigolleau@211: benoitrigolleau@211: benoitrigolleau@211: m_curve.push_back(QPoint(399,179)); benoitrigolleau@211: m_curve.push_back(QPoint(300,20)); benoitrigolleau@211: m_curve.push_back(QPoint(60,150)); benoitrigolleau@211: m_curve.push_back(QPoint(10,30)); benoitrigolleau@211: m_curve.push_back(QPoint(0,0)); benoitrigolleau@211: benoitrigolleau@211: benoitrigolleau@211: refreshPixmap(); benoitrigolleau@211: benoitrigolleau@211: } benoitrigolleau@211: benoitrigolleau@211: void Plotter::setCurveData(const QVector &data){ benoitrigolleau@211: m_curve = data; benoitrigolleau@211: refreshPixmap(); benoitrigolleau@211: } benoitrigolleau@211: benoitrigolleau@211: void Plotter::clearCurve(){ benoitrigolleau@211: m_curve.clear(); benoitrigolleau@211: refreshPixmap(); benoitrigolleau@211: } benoitrigolleau@211: benoitrigolleau@211: void Plotter::paintEvent(QPaintEvent *event){ benoitrigolleau@211: QStylePainter painter(this); benoitrigolleau@211: painter.drawPixmap(0, 0, m_pixmap); benoitrigolleau@211: } benoitrigolleau@211: benoitrigolleau@211: void Plotter::resizeEvent(QResizeEvent *event){ benoitrigolleau@211: refreshPixmap(); benoitrigolleau@211: } benoitrigolleau@211: benoitrigolleau@211: void Plotter::mousePressEvent(QMouseEvent *event){ benoitrigolleau@211: QRect rect(m_margin, m_margin, benoitrigolleau@211: m_signalWidth + m_margin, m_signalHeight + m_margin); benoitrigolleau@211: benoitrigolleau@211: if (event->button() == Qt::LeftButton) { benoitrigolleau@211: if (rect.contains(event->pos())) { benoitrigolleau@211: m_curveMaskActive = true; benoitrigolleau@211: int x = event->pos().x()- m_margin; benoitrigolleau@211: int y = event->pos().y()- m_margin; benoitrigolleau@211: m_curveMask[x] = y; benoitrigolleau@211: m_lastPoint.setX(x); benoitrigolleau@211: m_lastPoint.setY(y); benoitrigolleau@211: setCursor(Qt::CrossCursor); benoitrigolleau@211: refreshPixmap(); benoitrigolleau@211: } benoitrigolleau@211: } benoitrigolleau@211: } benoitrigolleau@211: benoitrigolleau@211: void Plotter::mouseMoveEvent(QMouseEvent *event){ benoitrigolleau@211: QRect rect(m_margin, m_margin, benoitrigolleau@211: m_signalWidth + m_margin , m_signalHeight + m_margin); benoitrigolleau@211: benoitrigolleau@211: if(m_curveMaskActive && rect.contains(event->pos())){ benoitrigolleau@211: int x = event->pos().x() - m_margin; benoitrigolleau@211: int y = event->pos().y() - m_margin; benoitrigolleau@211: if(y>m_signalHeight-1) benoitrigolleau@211: y= m_signalHeight-1; benoitrigolleau@211: int xlast = m_lastPoint.x(); benoitrigolleau@211: int ylast = m_lastPoint.y(); benoitrigolleau@211: benoitrigolleau@211: //regul mask curve benoitrigolleau@211: int minx, maxx, miny, maxy; benoitrigolleau@211: if(x>xlast){ benoitrigolleau@211: minx = xlast; benoitrigolleau@211: maxx = x; benoitrigolleau@211: }else{ benoitrigolleau@211: minx = x; benoitrigolleau@211: maxx = xlast; benoitrigolleau@211: } benoitrigolleau@211: if(y>ylast){ benoitrigolleau@211: miny = ylast; benoitrigolleau@211: maxy = y; benoitrigolleau@211: }else{ benoitrigolleau@211: miny = y; benoitrigolleau@211: maxy = ylast; benoitrigolleau@211: } benoitrigolleau@211: benoitrigolleau@211: if((maxx - minx)>1){ benoitrigolleau@211: double incr = (double)(maxy - miny)/(double)(maxx - minx); benoitrigolleau@211: if(x>xlast){ benoitrigolleau@211: for (int i = xlast + 1 ; i < x ; i++){ benoitrigolleau@211: if(ylast > y){ benoitrigolleau@211: m_curveMask[i] = ylast - (i-xlast)*incr; benoitrigolleau@211: }else{ benoitrigolleau@211: m_curveMask[i] = ylast + (i-xlast)*incr; benoitrigolleau@211: } benoitrigolleau@211: } benoitrigolleau@211: }else{ benoitrigolleau@211: for (int i = xlast - 1 ; i > x ; i--){ benoitrigolleau@211: if(ylast > y){ benoitrigolleau@211: m_curveMask[i] = ylast + (i-xlast)*incr; benoitrigolleau@211: }else{ benoitrigolleau@211: m_curveMask[i] = ylast - (i-xlast)*incr; benoitrigolleau@211: } benoitrigolleau@211: } benoitrigolleau@211: } benoitrigolleau@211: } benoitrigolleau@211: m_curveMask[x] = y; benoitrigolleau@211: m_lastPoint.setX(x); benoitrigolleau@211: m_lastPoint.setY(y); benoitrigolleau@211: refreshPixmap(); benoitrigolleau@211: } benoitrigolleau@211: } benoitrigolleau@211: benoitrigolleau@211: void Plotter::mouseReleaseEvent(QMouseEvent *event){ benoitrigolleau@211: if ((event->button() == Qt::LeftButton) && m_curveMaskActive) { benoitrigolleau@211: m_curveMaskActive = false; benoitrigolleau@211: unsetCursor(); benoitrigolleau@211: } benoitrigolleau@211: } benoitrigolleau@211: benoitrigolleau@211: void Plotter::drawGrid(QPainter *painter){ benoitrigolleau@211: QPixmap pm(":icons/grid.png"); benoitrigolleau@211: painter->drawPixmap(0,0,pm); benoitrigolleau@211: } benoitrigolleau@211: benoitrigolleau@211: void Plotter::drawCurve(QPainter *painter){ benoitrigolleau@211: QPolygonF polyline(m_signalWidth); benoitrigolleau@211: for(int i = 0 ; i < m_curve.count() ; i++){ benoitrigolleau@211: polyline[i] = QPoint(m_curve.at(i).x()+m_margin, m_curve.at(i).y()+m_margin); benoitrigolleau@211: } benoitrigolleau@211: painter->setPen(Qt::green); benoitrigolleau@211: painter->drawPolyline(polyline); benoitrigolleau@211: } benoitrigolleau@211: benoitrigolleau@211: void Plotter::drawMaskCurve(QPainter *painter){ benoitrigolleau@211: benoitrigolleau@211: QPolygonF polyline(m_signalWidth); benoitrigolleau@211: benoitrigolleau@211: for(int i = 0 ; i < m_signalWidth ; i++){ benoitrigolleau@211: polyline[i] = QPoint(i+m_margin, m_curveMask[i]+m_margin); benoitrigolleau@211: } benoitrigolleau@211: painter->setPen(Qt::red); benoitrigolleau@211: painter->drawPolyline(polyline); benoitrigolleau@211: } benoitrigolleau@211: benoitrigolleau@211: void Plotter::refreshPixmap(){ benoitrigolleau@211: m_pixmap = QPixmap(size()); benoitrigolleau@211: m_pixmap.fill(this, 0, 0); benoitrigolleau@211: benoitrigolleau@211: QPainter painter(&m_pixmap); benoitrigolleau@211: painter.initFrom(this); benoitrigolleau@211: drawGrid(&painter); benoitrigolleau@211: drawCurve(&painter); benoitrigolleau@211: drawMaskCurve(&painter); benoitrigolleau@211: update(); benoitrigolleau@211: } benoitrigolleau@211: benoitrigolleau@211: void Plotter::setMargin(int margin){ benoitrigolleau@211: m_margin = margin; benoitrigolleau@211: }