45 #include <helpers/chinfomodel.h>
64 #include <QPaintEvent>
68 #include <QVBoxLayout>
69 #include <QHeaderView>
71 #include <QMessageBox>
105 , m_pRTMSAModel(NULL)
106 , m_pRTMSADelegate(NULL)
108 , m_fDefaultSectionSize(80.0f)
109 , m_fZoomFactor(1.0f)
111 , m_bInitialized(false)
113 , m_fSamplingRate(1024)
114 , m_fDesiredSamplingRate(128)
115 , m_bHideBadChannels(false)
119 m_pDoubleSpinBoxZoom =
new QDoubleSpinBox(
this);
120 m_pDoubleSpinBoxZoom->setMinimum(0.3);
121 m_pDoubleSpinBoxZoom->setMaximum(4.0);
122 m_pDoubleSpinBoxZoom->setSingleStep(0.1);
123 m_pDoubleSpinBoxZoom->setValue(1.0);
124 m_pDoubleSpinBoxZoom->setSuffix(
" x");
125 connect(m_pDoubleSpinBoxZoom,
static_cast<void (QDoubleSpinBox::*)(
double)
>(&QDoubleSpinBox::valueChanged),
this, &RealTimeMultiSampleArrayWidget::zoomChanged);
128 m_pSpinBoxTimeScale =
new QSpinBox(
this);
129 m_pSpinBoxTimeScale->setMinimum(1);
130 m_pSpinBoxTimeScale->setMaximum(20);
131 m_pSpinBoxTimeScale->setValue(m_iT);
132 m_pSpinBoxTimeScale->setSuffix(
" s");
133 connect(m_pSpinBoxTimeScale,
static_cast<void (QSpinBox::*)(
int)
>(&QSpinBox::valueChanged),
this, &RealTimeMultiSampleArrayWidget::timeWindowChanged);
136 m_pActionSelectSensors =
new QAction(QIcon(
":/images/selectSensors.png"), tr(
"Shows the region selection widget (F10)"),
this);
137 m_pActionSelectSensors->setShortcut(tr(
"F10"));
138 m_pActionSelectSensors->setStatusTip(tr(
"Shows the region selection widget (F10)"));
139 m_pActionSelectSensors->setVisible(
true);
140 connect(m_pActionSelectSensors, &QAction::triggered,
this, &RealTimeMultiSampleArrayWidget::showSensorSelectionWidget);
143 m_pActionChScaling =
new QAction(QIcon(
":/images/channelScaling.png"), tr(
"Shows the channel scaling widget (F11)"),
this);
144 m_pActionChScaling->setShortcut(tr(
"F11"));
145 m_pActionChScaling->setStatusTip(tr(
"Shows the channel scaling widget (F11)"));
148 m_pActionChScaling->setVisible(
false);
151 m_pActionProjection =
new QAction(QIcon(
":/images/iconSSP.png"), tr(
"Shows the SSP widget (F12)"),
this);
152 m_pActionProjection->setShortcut(tr(
"F12"));
153 m_pActionProjection->setStatusTip(tr(
"Shows the SSP widget (F12)"));
154 connect(m_pActionProjection, &QAction::triggered,
this, &RealTimeMultiSampleArrayWidget::showProjectionWidget);
156 m_pActionProjection->setVisible(
true);
160 m_pTableView =
new QTableView;
163 QVBoxLayout *rtmsaLayout =
new QVBoxLayout(
this);
165 rtmsaLayout->addWidget(m_pTableView);
168 this->setLayout(rtmsaLayout);
171 m_pChInfoModel = QSharedPointer<ChInfoModel>(
new ChInfoModel(
this));
172 m_pSelectionManagerWindow = QSharedPointer<SelectionManagerWindow>(
new SelectionManagerWindow(
this, m_pChInfoModel.data()));
185 if(!m_pRTMSA->getName().isEmpty())
187 QString t_sRTMSAWName = m_pRTMSA->getName();
191 if(m_qMapChScaling.contains(FIFF_UNIT_T))
192 settings.setValue(QString(
"RTMSAW/%1/scaleMAG").arg(t_sRTMSAWName), m_qMapChScaling[FIFF_UNIT_T]);
195 settings.setValue(QString(
"RTMSAW/%1/scaleGRAD").arg(t_sRTMSAWName), m_qMapChScaling[
FIFF_UNIT_T_M]);
197 if(m_qMapChScaling.contains(FIFFV_EEG_CH))
198 settings.setValue(QString(
"RTMSAW/%1/scaleEEG").arg(t_sRTMSAWName), m_qMapChScaling[FIFFV_EEG_CH]);
200 if(m_qMapChScaling.contains(FIFFV_EOG_CH))
201 settings.setValue(QString(
"RTMSAW/%1/scaleEOG").arg(t_sRTMSAWName), m_qMapChScaling[FIFFV_EOG_CH]);
203 if(m_qMapChScaling.contains(FIFFV_STIM_CH))
204 settings.setValue(QString(
"RTMSAW/%1/scaleSTIM").arg(t_sRTMSAWName), m_qMapChScaling[FIFFV_STIM_CH]);
206 if(m_qMapChScaling.contains(FIFFV_MISC_CH))
207 settings.setValue(QString(
"RTMSAW/%1/scaleMISC").arg(t_sRTMSAWName), m_qMapChScaling[FIFFV_MISC_CH]);
214 void RealTimeMultiSampleArrayWidget::broadcastScaling()
226 if(m_pRTMSA->isChInit())
228 m_qListChInfo = m_pRTMSA->chInfo();
229 m_pFiffInfo = m_pRTMSA->info();
233 m_fSamplingRate = m_pRTMSA->getSamplingRate();
239 m_pRTMSAModel->
addData(m_pRTMSA->getMultiSampleArray());
247 if(m_qListChInfo.size() > 0)
250 delete m_pRTMSAModel;
255 m_pRTMSAModel->
setSamplingInfo(m_fSamplingRate, m_iT, m_fDesiredSamplingRate);
258 delete m_pRTMSADelegate;
263 m_pTableView->setModel(m_pRTMSAModel);
264 m_pTableView->setItemDelegate(m_pRTMSADelegate);
267 m_pTableView->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
269 m_pTableView->setShowGrid(
false);
271 m_pTableView->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Stretch);
272 m_pTableView->horizontalHeader()->hide();
273 m_pTableView->verticalHeader()->setDefaultSectionSize(m_fZoomFactor*m_fDefaultSectionSize);
275 m_pTableView->setAutoScroll(
false);
276 m_pTableView->setColumnHidden(0,
true);
278 m_pTableView->resizeColumnsToContents();
280 m_pTableView->setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel);
283 m_pTableView->setContextMenuPolicy(Qt::CustomContextMenu);
284 connect(m_pTableView,SIGNAL(customContextMenuRequested(QPoint)),
this,SLOT(
channelContextMenu(QPoint)));
287 QString t_sRTMSAWName = m_pRTMSA->getName();
289 if(!t_sRTMSAWName.isEmpty())
291 m_qMapChScaling.clear();
295 val = settings.value(QString(
"RTMSAW/%1/scaleMAG").arg(t_sRTMSAWName), 1e-11f).toFloat();
296 m_qMapChScaling.insert(FIFF_UNIT_T, val);
298 val = settings.value(QString(
"RTMSAW/%1/scaleGRAD").arg(t_sRTMSAWName), 1e-10f).toFloat();
301 val = settings.value(QString(
"RTMSAW/%1/scaleEEG").arg(t_sRTMSAWName), 1e-4f).toFloat();
302 m_qMapChScaling.insert(FIFFV_EEG_CH, val);
304 val = settings.value(QString(
"RTMSAW/%1/scaleEOG").arg(t_sRTMSAWName), 1e-3f).toFloat();
305 m_qMapChScaling.insert(FIFFV_EOG_CH, val);
307 val = settings.value(QString(
"RTMSAW/%1/scaleSTIM").arg(t_sRTMSAWName), 1e-3f).toFloat();
308 m_qMapChScaling.insert(FIFFV_STIM_CH, val);
310 val = settings.value(QString(
"RTMSAW/%1/scaleMISC").arg(t_sRTMSAWName), 1e-3f).toFloat();
311 m_qMapChScaling.insert(FIFFV_MISC_CH, val);
315 m_pActionChScaling->setVisible(
true);
320 this, &RealTimeMultiSampleArrayWidget::showSelectedChannelsOnly);
329 m_pChInfoModel->fiffInfoChanged(*m_pFiffInfo.data());
331 m_bInitialized =
true;
341 QModelIndex index = m_pTableView->indexAt(pos);
344 QModelIndexList selected = m_pTableView->selectionModel()->selectedIndexes();
362 m_qListCurrentSelection.clear();
363 for(qint32 i = 0; i < selected.size(); ++i)
364 if(selected[i].column() == 1)
365 m_qListCurrentSelection.append(m_pRTMSAModel->
getIdxSelMap()[selected[i].row()]);
368 QMenu *menu =
new QMenu(
this);
371 QAction* doSelection = menu->addAction(tr(
"Apply selection"));
372 connect(doSelection, &QAction::triggered,
this, &RealTimeMultiSampleArrayWidget::applySelection);
375 QAction* resetAppliedSelection = menu->addAction(tr(
"Reset selection"));
377 connect(resetAppliedSelection,&QAction::triggered,
this, &RealTimeMultiSampleArrayWidget::resetSelection);
380 menu->popup(m_pTableView->viewport()->mapToGlobal(pos));
388 Q_UNUSED(resizeEvent)
436 if(!m_pRTMSAScalingWidget)
440 m_pRTMSAScalingWidget->setWindowTitle(
"Channel Scaling");
442 connect(m_pRTMSAScalingWidget.data(), &RealTimeMultiSampleArrayScalingWidget::scalingChanged,
this, &RealTimeMultiSampleArrayWidget::broadcastScaling);
444 m_pRTMSAScalingWidget->show();
457 void RealTimeMultiSampleArrayWidget::zoomChanged(
double zoomFac)
459 m_fZoomFactor = zoomFac;
461 m_pTableView->verticalHeader()->setDefaultSectionSize(m_fZoomFactor*m_fDefaultSectionSize);
467 void RealTimeMultiSampleArrayWidget::timeWindowChanged(
int T)
470 m_pRTMSAModel->
setSamplingInfo(m_fSamplingRate, T, m_fDesiredSamplingRate);
476 void RealTimeMultiSampleArrayWidget::showProjectionWidget()
479 if(m_pFiffInfo && m_pFiffInfo->projs.size() > 0)
481 if(!m_pProjectorSelectionWidget)
483 m_pProjectorSelectionWidget = QSharedPointer<ProjectorWidget>(
new ProjectorWidget);
485 m_pProjectorSelectionWidget->setFiffInfo(m_pFiffInfo);
490 m_pProjectorSelectionWidget->show();
497 void RealTimeMultiSampleArrayWidget::showSensorSelectionWidget()
499 if(!m_pSelectionManagerWindow) {
503 m_pSelectionManagerWindow->show();
509 void RealTimeMultiSampleArrayWidget::applySelection()
511 m_pRTMSAModel->
selectRows(m_qListCurrentSelection);
517 void RealTimeMultiSampleArrayWidget::resetSelection()
520 m_qListCurrentSelection.clear();
521 for(qint32 i = 0; i < m_qListChInfo.size(); ++i)
522 m_qListCurrentSelection.append(i);
530 void RealTimeMultiSampleArrayWidget::showSelectedChannelsOnly(QStringList selectedChannels)
532 m_slSelectedChannels = selectedChannels;
535 for(
int i = 0; i<m_pRTMSAModel->
rowCount(); i++) {
536 QString channel = m_pRTMSAModel->
data(m_pRTMSAModel->index(i, 0), Qt::DisplayRole).toString();
537 QVariant v = m_pRTMSAModel->
data(m_pRTMSAModel->index(i,1), Qt::BackgroundRole);
539 if(!selectedChannels.contains(channel))
540 m_pTableView->hideRow(i);
542 m_pTableView->showRow(i);
545 if(v.canConvert<QBrush>() && m_bHideBadChannels)
546 m_pTableView->hideRow(i);
void addData(const QList< MatrixXd > &data)
The RealTimeMultiSampleArrayDelegate class represents a RTMSA delegate which creates the plot paths...
void setCurrentlyMappedFiffChannels(const QStringList &mappedLayoutChNames)
virtual QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const
const QMap< qint32, qint32 > & getIdxSelMap() const
void setSamplingInfo(float sps, int T, float dest_sps=128.0f)
void setFiffInfo(FIFFLIB::FiffInfo::SPtr &p_pFiffInfo)
void showSelectedChannelsOnly(QStringList selectedChannels)
The SelectionManagerWindow class provides a channel selection window.
The RealTimeMultiSampleArrayModel class implements the data access model for a real-time multi sample...
void loadedLayoutMap(const QMap< QString, QPointF > &layoutMap)
void layoutChanged(const QMap< QString, QPointF > &layoutMap)
void setScaling(const QMap< qint32, float > &p_qMapChScaling)
QSharedPointer< NewMeasurement > SPtr
void toggleFreeze(const QModelIndex &index)
Contains the declaration of the NewRealTimeMultiSampleArray class.
void setChannelInfo(QList< RealTimeSampleArrayChInfo > &chInfo)
void selectRows(const QList< qint32 > &selection)
virtual int rowCount(const QModelIndex &parent=QModelIndex()) const
void channelsMappedToLayout(const QStringList &mappedLayoutChNames)