![]() |
Mixxx
|
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 }