31#include <QPainterPath>
45: QAbstractItemDelegate(parent)
54 m_tableview = m_pTableView;
55 m_tableview->setMouseTracking(
true);
62 m_iScaleType = ScaleType;
69 float t_fPlotHeight = option.rect.height();
70 switch(index.column()) {
75 painter->drawText(QRectF(-option.rect.y()-t_fPlotHeight,0,t_fPlotHeight,20),Qt::AlignCenter,index.model()->data(index,Qt::DisplayRole).toString());
101 QVariant variant = index.model()->data(index,Qt::DisplayRole);
102 RowVectorXd data = variant.value< RowVectorXd >();
108 QPainterPath path(QPointF(option.rect.x(),option.rect.y()));
111 painter->setRenderHint(QPainter::Antialiasing,
false);
112 createGridPath(index, option, path, data);
113 createGridTick(index, option, painter);
116 capturePoint(index, option, path, data, painter);
120 pen.setStyle(Qt::DotLine);
122 painter->setPen(pen);
123 painter->drawPath(path);
127 path = QPainterPath(QPointF(option.rect.x(),option.rect.y()));
129 createPlotPath(index, option, path, data);
132 painter->translate(0,t_fPlotHeight/2);
133 painter->setRenderHint(QPainter::Antialiasing,
true);
135 if(option.state & QStyle::State_Selected)
136 painter->setPen(QPen(t_pModel->isFreezed() ? Qt::darkRed : Qt::red, 1, Qt::SolidLine));
138 painter->setPen(QPen(t_pModel->isFreezed() ? Qt::darkGray : Qt::darkBlue, 1, Qt::SolidLine));
140 painter->drawPath(path);
155 switch(index.column()) {
157 size = QSize(20,option.rect.height());
160 RowVectorXd data = index.model()->data(index).value< RowVectorXd >();
176 if(mousex != m_mousex){
178 m_tableview_row = tableview_row;
183 m_x_rate = (float)m_mousex/(
float)m_visRect.width();
185 m_tableview->viewport()->repaint();
191void FrequencySpectrumDelegate::capturePoint(
const QModelIndex &index,
const QStyleOptionViewItem &option, QPainterPath& path, RowVectorXd& data, QPainter *painter)
const
196 if (m_tableview_row == index.row()){
201 RowVectorXd org_vecFreqScale = t_pModel->
getFreqScale();
213 for(i = lowerIdx+1; i <= upperIdx; ++i) {
217 float tmp_rate = (vecFreqScale[i] - vecFreqScale[lowerIdx])/(vecFreqScale[upperIdx]-vecFreqScale[lowerIdx]);
219 if (tmp_rate > m_x_rate) {
break;}
228 unsigned short usPosY = m_visRect.bottom();
229 unsigned short usPosX = m_visRect.left();
230 unsigned short usHeight = m_visRect.height();
231 unsigned short usWidth = m_visRect.width();
233 int iPosX = m_mousex;
234 int iPosY = m_mousey;
236 if(iPosX>usPosX && iPosX < usPosX+usWidth && iPosY > (usPosY - usHeight) && iPosY < usPosY )
240 painter->setPen(QPen(Qt::gray, 1, Qt::DashLine));
242 QPoint start(iPosX - 25, iPosY);
243 QPoint end(iPosX + 25, iPosY);
248 start.setX(iPosX); start.setY(usPosY -usHeight);
249 end.setX(iPosX); end.setY(usPosY);
250 painter->drawLine(start, end);
252 painter->setPen(QPen(Qt::black, 1, Qt::SolidLine));
255 double fs = t_pModel->
getInfo()->sfreq/2;
262 double max = log10(fs+1);
263 org_vecFreqScale *= max;
265 freq = pow(10,org_vecFreqScale[i]) - 1;
269 org_vecFreqScale *= fs;
271 freq = org_vecFreqScale[i];
275 QString tx = QString(
"%1 [DB], %2 [Hz]").arg(data[i]).arg(freq);
277 if (iPosX > usPosX + usWidth - tx.size()*8 )
278 painter->drawText(iPosX-tx.size()*8, iPosY-8, tx);
280 painter->drawText(iPosX+8, iPosY-8, tx);
287void FrequencySpectrumDelegate::createPlotPath(
const QModelIndex &index,
const QStyleOptionViewItem &option, QPainterPath& path, RowVectorXd& data)
const
289 const FrequencySpectrumModel* t_pModel =
static_cast<const FrequencySpectrumModel*
>(index.model());
291 float fMaxValue = data.maxCoeff();
294 float fScaleY = option.rect.height()/(fMaxValue*0.5);
296 float y_base = path.currentPosition().y();
297 QPointF qSamplePosition;
306 fValue = val*fScaleY;
308 float newY = y_base+fValue;
310 qSamplePosition.setY(newY);
311 qSamplePosition.setX((
double)option.rect.width()*t_pModel->
getFreqScaleBound()[lowerIdx]);
313 path.moveTo(qSamplePosition);
318 for(i = lowerIdx+1; i <= upperIdx; ++i) {
319 float val = data[i]-data[0];
320 fValue = val*fScaleY;
322 float newY = y_base+fValue;
324 qSamplePosition.setY(newY);
325 qSamplePosition.setX((
double)option.rect.width()*t_pModel->
getFreqScaleBound()[i]);
327 path.lineTo(qSamplePosition);
333void FrequencySpectrumDelegate::createGridPath(
const QModelIndex &index,
const QStyleOptionViewItem &option, QPainterPath& path, RowVectorXd& data)
const
337 const FrequencySpectrumModel* t_pModel =
static_cast<const FrequencySpectrumModel*
>(index.model());
341 double nf = t_pModel->
getInfo()->sfreq/2;
343 qint32 numLines = (m_iScaleType)? (qint32)ceil(log10(nf)) : 5 ;
345 QList<qint32> qListLineSamples;
347 qListLineSamples << 0;
351 for(qint32 lineIdx = 0; lineIdx < numLines; ++lineIdx)
353 double val = pow(10,lineIdx);
354 qint32 idx = (qint32)floor(val / ((
float)nf/(
float)t_pModel->
getNumStems()));
355 qListLineSamples.append(idx);
359 for(qint32 lineIdx = 1; lineIdx < numLines; ++lineIdx)
361 double val = lineIdx*(nf/numLines);
362 qint32 idx = (qint32)floor(val / ((
float)nf/(
float)t_pModel->
getNumStems()));
363 qListLineSamples.append(idx);
368 float yStart = option.rect.topLeft().y();
370 float yEnd = option.rect.bottomRight().y();
372 for(qint32 i = 0; i < qListLineSamples.size(); ++i) {
375 float x = (t_pModel->
getFreqScaleBound()[qListLineSamples[i]])*option.rect.width();
376 path.moveTo(x,yStart);
386void FrequencySpectrumDelegate::createGridTick(
const QModelIndex &index,
const QStyleOptionViewItem &option, QPainter *painter)
const
388 const FrequencySpectrumModel* t_pModel =
static_cast<const FrequencySpectrumModel*
>(index.model());
392 double nf = t_pModel->
getInfo()->sfreq/2;
394 qint32 numLines = (m_iScaleType)? (qint32)ceil(log10(nf)) : 5 ;
396 QList<qint32> qListLineSamples;
398 qListLineSamples << 0;
401 for(qint32 lineIdx = 0; lineIdx < numLines; ++lineIdx)
403 double val = pow(10,lineIdx);
404 qint32 idx = (qint32)floor(val / ((
float)nf/(
float)t_pModel->
getNumStems()));
405 qListLineSamples.append(idx);
410 for(qint32 lineIdx = 1; lineIdx < numLines; ++lineIdx)
412 double val = lineIdx*(nf/numLines);
413 qint32 idx = (qint32)floor(val / ((
float)nf/(
float)t_pModel->
getNumStems()));
414 qListLineSamples.append(idx);
420 float yStart = 1.0*option.rect.topLeft().y();
425 float x = (t_pModel->
getFreqScaleBound()[qListLineSamples[0]])*option.rect.width();
426 painter->drawText(x,yStart,QString(
"%1Hz").arg(val));
429 for(qint32 i = 1; i < qListLineSamples.size(); ++i) {
432 double val = (m_iScaleType)? pow(10,i-1) : t_pModel->
getFreqScaleBound()[qListLineSamples[i]]*nf;
433 float x = (t_pModel->
getFreqScaleBound()[qListLineSamples[i]])*option.rect.width();
434 painter->drawText(x,yStart,QString(
"%1Hz").arg(val));
QAbstractTableModel storing per-channel FFT magnitudes for SpectrumView.
QAbstractItemDelegate painting one row of the SpectrumView as a horizontal frequency band.
Full FIFF measurement metadata: everything from FIFFB_MEAS / FIFFB_MEAS_INFO needed to interpret a re...
2-D display widgets and visualisation helpers (charts, topography, colour maps).
virtual QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
void setScaleType(qint8 ScaleType)
void rcvMouseLoc(int row, int x, int y, QRect visRect)
FrequencySpectrumDelegate(QTableView *m_pTableView, QObject *parent=0)
virtual void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
QAbstractTableModel storing per-channel FFT magnitudes for SpectrumView.
QSharedPointer< FIFFLIB::FiffInfo > getInfo() const
qint32 getLowerFrqBound() const
qint32 getUpperFrqBound() const
qint32 getNumStems() const
Eigen::RowVectorXd getFreqScaleBound() const
Eigen::RowVectorXd getFreqScale() const