53 #include <QPainterPath>
71 : QAbstractItemDelegate(parent)
75 m_tableview = m_pTableView;
77 m_tableview->setMouseTracking(
true);
85 m_iScaleType = ScaleType;
93 float t_fPlotHeight = option.rect.height();
94 switch(index.column()) {
99 painter->drawText(QRectF(-option.rect.y()-t_fPlotHeight,0,t_fPlotHeight,20),Qt::AlignCenter,index.model()->data(index,Qt::DisplayRole).toString());
125 QVariant variant = index.model()->data(index,Qt::DisplayRole);
126 RowVectorXd data = variant.value< RowVectorXd >();
133 QPainterPath path(QPointF(option.rect.x(),option.rect.y()));
136 painter->setRenderHint(QPainter::Antialiasing,
false);
137 createGridPath(index, option, path, data);
138 createGridTick(index, option, painter);
141 capturePoint(index, option, path, data, painter);
145 pen.setStyle(Qt::DotLine);
147 painter->setPen(pen);
148 painter->drawPath(path);
153 path = QPainterPath(QPointF(option.rect.x(),option.rect.y()));
155 createPlotPath(index, option, path, data);
158 painter->translate(0,t_fPlotHeight/2);
159 painter->setRenderHint(QPainter::Antialiasing,
true);
161 if(option.state & QStyle::State_Selected)
162 painter->setPen(QPen(t_pModel->isFreezed() ? Qt::darkRed : Qt::red, 1, Qt::SolidLine));
164 painter->setPen(QPen(t_pModel->isFreezed() ? Qt::darkGray : Qt::darkBlue, 1, Qt::SolidLine));
166 painter->drawPath(path);
186 switch(index.column()) {
188 size = QSize(20,option.rect.height());
191 RowVectorXd data = index.model()->data(index).value< RowVectorXd >();
208 if(mousex != m_mousex){
210 m_tableview_row = tableview_row;
215 m_x_rate = (float)m_mousex/(
float)m_visRect.width();
218 m_tableview->viewport()->repaint();
224 void FrequencySpectrumDelegate::capturePoint(
const QModelIndex &index,
const QStyleOptionViewItem &option, QPainterPath& path, RowVectorXd& data, QPainter *painter)
const
229 if (m_tableview_row == index.row()){
234 RowVectorXd org_vecFreqScale = t_pModel->
getFreqScale();
247 for(i = lowerIdx+1; i <= upperIdx; ++i) {
251 float tmp_rate = (vecFreqScale[i] - vecFreqScale[lowerIdx])/(vecFreqScale[upperIdx]-vecFreqScale[lowerIdx]);
253 if (tmp_rate > m_x_rate) {
break;}
262 unsigned short usPosY = m_visRect.bottom();
263 unsigned short usPosX = m_visRect.left();
264 unsigned short usHeight = m_visRect.height();
265 unsigned short usWidth = m_visRect.width();
267 int iPosX = m_mousex;
268 int iPosY = m_mousey;
271 if(iPosX>usPosX && iPosX < usPosX+usWidth && iPosY > (usPosY - usHeight) && iPosY < usPosY )
275 painter->setPen(QPen(Qt::gray, 1, Qt::DashLine));
277 QPoint start(iPosX - 25, iPosY);
278 QPoint end(iPosX + 25, iPosY);
283 start.setX(iPosX); start.setY(usPosY -usHeight);
284 end.setX(iPosX); end.setY(usPosY);
285 painter->drawLine(start, end);
287 painter->setPen(QPen(Qt::black, 1, Qt::SolidLine));
290 double fs = t_pModel->
getInfo()->sfreq/2;
297 double max = log10(fs+1);
298 org_vecFreqScale *= max;
300 freq = pow(10,org_vecFreqScale[i]) - 1;
304 org_vecFreqScale *= fs;
306 freq = org_vecFreqScale[i];
310 QString tx = QString(
"%1 [DB], %2 [Hz]").arg(data[i]).arg(freq);
312 if (iPosX > usPosX + usWidth - tx.size()*8 )
313 painter->drawText(iPosX-tx.size()*8, iPosY-8, tx);
315 painter->drawText(iPosX+8, iPosY-8, tx);
322 void FrequencySpectrumDelegate::createPlotPath(
const QModelIndex &index,
const QStyleOptionViewItem &option, QPainterPath& path, RowVectorXd& data)
const
326 float fMaxValue = data.maxCoeff();
329 float fScaleY = option.rect.height()/(fMaxValue*0.5);
331 float y_base = path.currentPosition().y();
332 QPointF qSamplePosition;
341 fValue = val*fScaleY;
343 float newY = y_base+fValue;
345 qSamplePosition.setY(newY);
346 qSamplePosition.setX((
double)option.rect.width()*t_pModel->
getFreqScaleBound()[lowerIdx]);
348 path.moveTo(qSamplePosition);
354 for(i = lowerIdx+1; i <= upperIdx; ++i) {
355 float val = data[i]-data[0];
356 fValue = val*fScaleY;
358 float newY = y_base+fValue;
360 qSamplePosition.setY(newY);
361 qSamplePosition.setX((
double)option.rect.width()*t_pModel->
getFreqScaleBound()[i]);
363 path.lineTo(qSamplePosition);
370 void FrequencySpectrumDelegate::createGridPath(
const QModelIndex &index,
const QStyleOptionViewItem &option, QPainterPath& path, RowVectorXd& data)
const
376 if(t_pModel->getInfo())
378 double nf = t_pModel->
getInfo()->sfreq/2;
380 qint32 numLines = (m_iScaleType)? (qint32)ceil(log10(nf)) : 5 ;
382 QList<qint32> qListLineSamples;
384 qListLineSamples << 0;
388 for(qint32 lineIdx = 0; lineIdx < numLines; ++lineIdx)
390 double val = pow(10,lineIdx);
391 qint32 idx = (qint32)floor(val / ((
float)nf/(
float)t_pModel->
getNumStems()));
392 qListLineSamples.append(idx);
396 for(qint32 lineIdx = 1; lineIdx < numLines; ++lineIdx)
398 double val = lineIdx*(nf/numLines);
399 qint32 idx = (qint32)floor(val / ((
float)nf/(float)t_pModel->
getNumStems()));
400 qListLineSamples.append(idx);
405 float yStart = option.rect.topLeft().y();
407 float yEnd = option.rect.bottomRight().y();
409 for(qint32 i = 0; i < qListLineSamples.size(); ++i) {
412 float x = (t_pModel->
getFreqScaleBound()[qListLineSamples[i]])*option.rect.width();
413 path.moveTo(x,yStart);
423 void FrequencySpectrumDelegate::createGridTick(
const QModelIndex &index,
const QStyleOptionViewItem &option, QPainter *painter)
const
429 double nf = t_pModel->
getInfo()->sfreq/2;
431 qint32 numLines = (m_iScaleType)? (qint32)ceil(log10(nf)) : 5 ;
433 QList<qint32> qListLineSamples;
435 qListLineSamples << 0;
438 for(qint32 lineIdx = 0; lineIdx < numLines; ++lineIdx)
440 double val = pow(10,lineIdx);
441 qint32 idx = (qint32)floor(val / ((
float)nf/(
float)t_pModel->
getNumStems()));
442 qListLineSamples.append(idx);
447 for(qint32 lineIdx = 1; lineIdx < numLines; ++lineIdx)
449 double val = lineIdx*(nf/numLines);
450 qint32 idx = (qint32)floor(val / ((
float)nf/(float)t_pModel->
getNumStems()));
451 qListLineSamples.append(idx);
457 float yStart = 1.0*option.rect.topLeft().y();
462 float x = (t_pModel->
getFreqScaleBound()[qListLineSamples[0]])*option.rect.width();
463 painter->drawText(x,yStart,QString(
"%1Hz").arg(val));
466 for(qint32 i = 1; i < qListLineSamples.size(); ++i) {
469 double val = (m_iScaleType)? pow(10,i-1) : t_pModel->
getFreqScaleBound()[qListLineSamples[i]]*nf;
470 float x = (t_pModel->
getFreqScaleBound()[qListLineSamples[i]])*option.rect.width();
471 painter->drawText(x,yStart,QString(
"%1Hz").arg(val));
qint32 getNumStems() const
The FrequencySpectrumModel class implements the data access model for a real-time multi sample array ...
FrequencySpectrumDelegate(QTableView *m_pTableView, QObject *parent=0)
Declaration of the FrequencySpectrumModel Class.
FiffInfo::SPtr getInfo() const
RowVectorXd getFreqScale() const
void rcvMouseLoc(int row, int x, int y, QRect visRect)
RowVectorXd getFreqScaleBound() const
virtual void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
Declaration of the FrequencySpectrumDelegate Class.
qint32 getLowerFrqBound() const
qint32 getUpperFrqBound() const
virtual QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
void setScaleType(qint8 ScaleType)