Mixxx

/home/maxime/Projets/Mixxx/1.10/mixxx/src/waveform/waveformrendermarkrange.cpp

Go to the documentation of this file.
00001 // waveformrendermarkrange.cpp
00002 // Created 11/14/2009 by RJ Ryan (rryan@mit.edu)
00003 
00004 #include <QDebug>
00005 #include <QColor>
00006 #include <QDomNode>
00007 #include <QPaintEvent>
00008 #include <QPainter>
00009 #include <QObject>
00010 #include <QVector>
00011 
00012 #include "waveformrendermarkrange.h"
00013 
00014 #include "waveformrenderer.h"
00015 #include "configobject.h"
00016 #include "controlobjectthreadmain.h"
00017 #include "controlobject.h"
00018 #include "widget/wskincolor.h"
00019 #include "widget/wwidget.h"
00020 #include "trackinfoobject.h"
00021 
00022 WaveformRenderMarkRange::WaveformRenderMarkRange(const char* pGroup,
00023                                                  WaveformRenderer *parent)
00024         : m_pGroup(pGroup),
00025           m_pParent(parent),
00026           m_pMarkStartPoint(NULL),
00027           m_pMarkEndPoint(NULL),
00028           m_pMarkEnabled(NULL),
00029           m_pTrackSamples(NULL),
00030           m_bMarkEnabled(true),
00031           m_iMarkStartPoint(-1),
00032           m_iMarkEndPoint(-1),
00033           m_iWidth(0),
00034           m_iHeight(0),
00035           m_dSamplesPerDownsample(-1),
00036           m_iNumSamples(0),
00037           m_iSampleRate(-1) {
00038 
00039     m_pTrackSamples = new ControlObjectThreadMain(
00040         ControlObject::getControl(ConfigKey(pGroup, "track_samples")));
00041     slotUpdateTrackSamples(m_pTrackSamples->get());
00042     connect(m_pTrackSamples, SIGNAL(valueChanged(double)),
00043             this, SLOT(slotUpdateTrackSamples(double)));
00044 
00045     m_pTrackSampleRate = new ControlObjectThreadMain(
00046         ControlObject::getControl(ConfigKey(pGroup, "track_samplerate")));
00047     slotUpdateTrackSampleRate(m_pTrackSampleRate->get());
00048     connect(m_pTrackSampleRate, SIGNAL(valueChanged(double)),
00049             this, SLOT(slotUpdateTrackSampleRate(double)));
00050 }
00051 
00052 WaveformRenderMarkRange::~WaveformRenderMarkRange() {
00053     qDebug() << this << "~WaveformRenderMarkRange()";
00054     delete m_pTrackSamples;
00055     delete m_pMarkStartPoint;
00056     delete m_pMarkEndPoint;
00057     delete m_pMarkEnabled;
00058 }
00059 
00060 void WaveformRenderMarkRange::slotUpdateMarkStartPoint(double v) {
00061     //qDebug() << "WaveformRenderMarkRange :: MarkStartPoint = " << v;
00062     m_iMarkStartPoint = (int)v;
00063 }
00064 
00065 void WaveformRenderMarkRange::slotUpdateMarkEndPoint(double v) {
00066     //qDebug() << "WaveformRenderMarkRange :: MarkEndPoint = " << v;
00067     m_iMarkEndPoint = (int)v;
00068 }
00069 
00070 void WaveformRenderMarkRange::slotUpdateMarkEnabled(double v) {
00071     //qDebug() << "WaveformRenderMarkRange :: MarkEnabled = " << v;
00072     m_bMarkEnabled = !(v == 0.0f);
00073 }
00074 
00075 void WaveformRenderMarkRange::slotUpdateTrackSamples(double samples) {
00076     //qDebug() << "WaveformRenderMarkRange :: samples = " << int(samples);
00077     m_iNumSamples = (int)samples;
00078 }
00079 
00080 void WaveformRenderMarkRange::slotUpdateTrackSampleRate(double sampleRate) {
00081     //qDebug() << "WaveformRenderMarkRange :: sampleRate = " << int(sampleRate);
00082 
00083     // f = z * m * n
00084     double m = m_pParent->getSubpixelsPerPixel();
00085     double f = sampleRate;
00086     double z = m_pParent->getPixelsPerSecond();
00087     double n = f / (m*z);
00088 
00089     m_iSampleRate = static_cast<int>(sampleRate);
00090     m_dSamplesPerDownsample = n;
00091 }
00092 
00093 
00094 void WaveformRenderMarkRange::resize(int w, int h) {
00095     m_iWidth = w;
00096     m_iHeight = h;
00097 }
00098 
00099 void WaveformRenderMarkRange::newTrack(TrackPointer pTrack) {
00100 }
00101 
00102 void WaveformRenderMarkRange::setup(QDomNode node) {
00103 
00104     if (m_pMarkStartPoint) {
00105         // Disconnect the old control
00106         disconnect(m_pMarkStartPoint, 0, this, 0);
00107         delete m_pMarkStartPoint;
00108         m_pMarkStartPoint = NULL;
00109     }
00110 
00111     if (m_pMarkEndPoint) {
00112         // Disconnect the old control
00113         disconnect(m_pMarkEndPoint, 0, this, 0);
00114         delete m_pMarkEndPoint;
00115         m_pMarkEndPoint = NULL;
00116     }
00117 
00118     if (m_pMarkEnabled) {
00119         // Disconnect the old control
00120         disconnect(m_pMarkEnabled, 0, this, 0);
00121         delete m_pMarkEnabled;
00122         m_pMarkEnabled = NULL;
00123     }
00124 
00125     ConfigKey configKey;
00126     configKey.group = m_pGroup;
00127 
00128     configKey.item = WWidget::selectNodeQString(node, "StartControl");
00129     m_pMarkStartPoint = new ControlObjectThreadMain(
00130         ControlObject::getControl(configKey));
00131     slotUpdateMarkStartPoint(m_pMarkStartPoint->get());
00132     connect(m_pMarkStartPoint, SIGNAL(valueChanged(double)),
00133             this, SLOT(slotUpdateMarkStartPoint(double)));
00134 
00135     configKey.item = WWidget::selectNodeQString(node, "EndControl");
00136     m_pMarkEndPoint = new ControlObjectThreadMain(
00137         ControlObject::getControl(configKey));
00138     slotUpdateMarkEndPoint(m_pMarkEndPoint->get());
00139     connect(m_pMarkEndPoint, SIGNAL(valueChanged(double)),
00140             this, SLOT(slotUpdateMarkEndPoint(double)));
00141 
00142     // Leave m_pMarkEnabled NULL if it is not specified
00143     if (!WWidget::selectNode(node, "EnabledControl").isNull()) {
00144         configKey.item = WWidget::selectNodeQString(node, "EnabledControl");
00145         m_pMarkEnabled = new ControlObjectThreadMain(
00146             ControlObject::getControl(configKey));
00147         slotUpdateMarkEnabled(m_pMarkEnabled->get());
00148         connect(m_pMarkEnabled, SIGNAL(valueChanged(double)),
00149                 this, SLOT(slotUpdateMarkEnabled(double)));
00150     }
00151 
00152     // Read the mark color, otherwise get MarkerColor of the Visual element
00153     QString markColor = WWidget::selectNodeQString(node, "Color");
00154     if (markColor == "") {
00155         // As a fallback, grab the mark color from the parent's MarkerColor
00156         markColor = WWidget::selectNodeQString(node.parentNode(), "MarkerColor");
00157         qDebug() << "Didn't get mark Color, using parent's MarkerColor:"
00158                  << markColor;
00159         m_markColor.setNamedColor(markColor);
00160         // m_markColor = QColor(255 - m_markColor.red(),
00161         //                      255 - m_markColor.green(),
00162         //                      255 - m_markColor.blue());
00163     } else {
00164         m_markColor.setNamedColor(markColor);
00165     }
00166     m_markColor = WSkinColor::getCorrectColor(m_markColor);
00167 
00168     QString markDisabledColor = WWidget::selectNodeQString(node, "DisabledColor");
00169     if (markDisabledColor == "") {
00170         // As a fallback, grab the mark color from the parent's MarkerColor
00171         markDisabledColor = WWidget::selectNodeQString(
00172             node.parentNode(), "SignalColor");
00173         qDebug() << "Didn't get mark Color, using parent's MarkerColor:"
00174                  << markDisabledColor;
00175         m_markDisabledColor.setNamedColor(markDisabledColor);
00176         // m_markDisabledColor = QColor(255 - m_markDisabledColor.red(),
00177         //                      255 - m_markDisabledColor.green(),
00178         //                      255 - m_markDisabledColor.blue());
00179     } else {
00180         m_markDisabledColor.setNamedColor(markDisabledColor);
00181     }
00182     m_markDisabledColor = WSkinColor::getCorrectColor(m_markDisabledColor);
00183 }
00184 
00185 
00186 void WaveformRenderMarkRange::draw(QPainter *pPainter, QPaintEvent *event,
00187                               QVector<float> *buffer, double dPlayPos,
00188                               double rateAdjust) {
00189     if (m_iSampleRate == -1 || m_iSampleRate == 0 || m_iNumSamples == 0)
00190         return;
00191 
00192     // necessary?
00193     if (buffer == NULL)
00194         return;
00195 
00196     // The range is not active, do nothing.
00197     if (m_iMarkStartPoint == -1 || m_iMarkEndPoint == -1)
00198         return;
00199 
00200     double subpixelsPerPixel = m_pParent->getSubpixelsPerPixel()*(1.0+rateAdjust);
00201 
00202     pPainter->save();
00203     pPainter->scale(1.0/subpixelsPerPixel,1.0);
00204     QPen oldPen = pPainter->pen();
00205     QBrush oldBrush = pPainter->brush();
00206 
00207     double subpixelWidth = m_iWidth * subpixelsPerPixel;
00208     double subpixelHalfWidth = subpixelWidth / 2.0;
00209     double halfh = m_iHeight/2;
00210 
00211     double curPos = dPlayPos * (m_iNumSamples/2);
00212 
00213     double markStartPointMono = m_iMarkStartPoint >> 1;
00214     double markEndPointMono = m_iMarkEndPoint >> 1;
00215 
00216     double iStart = (markStartPointMono - curPos)/m_dSamplesPerDownsample;
00217     double xStart = iStart + subpixelHalfWidth;
00218     double iEnd = (markEndPointMono - curPos)/m_dSamplesPerDownsample;
00219     double xEnd = iEnd + subpixelHalfWidth;
00220 
00221     QRectF markRect(QPointF(xStart, halfh), QPointF(xEnd, -halfh));
00222 
00223     QColor color = m_bMarkEnabled ? m_markColor : m_markDisabledColor;
00224     color.setAlphaF(0.3);
00225     QPen newPen(color);
00226     pPainter->setPen(newPen);
00227     pPainter->setBrush(QBrush(color));
00228     pPainter->drawRect(markRect);
00229 
00230     pPainter->setPen(oldPen);
00231     pPainter->setBrush(oldBrush);
00232     pPainter->restore();
00233 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines