36#include <QSvgGenerator>
72 auto *rhiViewport =
new QRhiWidget;
73#if defined(WASMBUILD) || defined(__EMSCRIPTEN__)
74 rhiViewport->setApi(QRhiWidget::Api::OpenGL);
75#elif defined(Q_OS_MACOS) || defined(Q_OS_IOS)
76 rhiViewport->setApi(QRhiWidget::Api::Metal);
77#elif defined(Q_OS_WIN)
78 rhiViewport->setApi(QRhiWidget::Api::Direct3D11);
80 rhiViewport->setApi(QRhiWidget::Api::OpenGL);
89 QVBoxLayout *neLayout =
new QVBoxLayout(
this);
91 neLayout->setContentsMargins(0,0,0,0);
92 this->setLayout(neLayout);
109 auto *rhiViewport =
new QRhiWidget;
110#if defined(WASMBUILD) || defined(__EMSCRIPTEN__)
111 rhiViewport->setApi(QRhiWidget::Api::OpenGL);
112#elif defined(Q_OS_MACOS) || defined(Q_OS_IOS)
113 rhiViewport->setApi(QRhiWidget::Api::Metal);
114#elif defined(Q_OS_WIN)
115 rhiViewport->setApi(QRhiWidget::Api::Direct3D11);
117 rhiViewport->setApi(QRhiWidget::Api::OpenGL);
149 for(
int i = 0; i<
m_pModel->rowCount(); i++) {
165 m_pTableView->setContextMenuPolicy(Qt::CustomContextMenu);
167 connect(
m_pTableView.data(), &QTableView::doubleClicked,
170 connect(
m_pTableView.data(), &QTableView::customContextMenuRequested,
174 m_pTableView->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
176 m_pTableView->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Stretch);
183 m_pTableView->setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel);
185 connect(
m_pTableView->verticalScrollBar(), &QScrollBar::valueChanged,
193 if(!data.isEmpty()) {
198 for(
int i = 0; i<
m_pModel->rowCount(); i++) {
214 qWarning() <<
"[RtFiffRawView::addData] Received data list is empty.";
235 return QWidget::eventFilter(
object, event);
327 for(
int i = 0; i<
m_pModel->rowCount(); i++) {
328 QString channel =
m_pModel->data(
m_pModel->index(i, 0), Qt::DisplayRole).toString();
385 if(fileName.contains(
".svg", Qt::CaseInsensitive)) {
387 QSvgGenerator svgGen;
388 svgGen.setFileName(fileName);
395 if(fileName.contains(
".png", Qt::CaseInsensitive)) {
397 pixMap.save(fileName);
419 m_pModel->updateSpharaActivation(state);
426 m_pModel->updateSpharaOptions(sSytemType, nBaseFctsFirst, nBaseFctsSecond);
447 m_pModel->setFilterChannelType(channelType);
454 const QString &triggerCh,
457 m_pModel->triggerInfoChanged(colorMap, active, triggerCh, threshold);
465 m_pModel->distanceTimeSpacerChanged(value);
490 QSettings settings(
"MNECPP");
501 QSettings settings(
"MNECPP");
538 QModelIndexList selected =
m_pTableView->selectionModel()->selectedIndexes();
541 QMenu *menu =
new QMenu(
this);
543 menu->addSection(
"Events");
545 QAction* addEventMarker = menu->addAction(tr(
"Add event"));
546 connect(addEventMarker, &QAction::triggered,
551 menu->addSection(
"Channel Marking");
554 QAction* doMarkChBad = menu->addAction(tr(
"Mark as bad"));
555 connect(doMarkChBad, &QAction::triggered,
558 QAction* doMarkChGood = menu->addAction(tr(
"Mark as good"));
559 connect(doMarkChGood, &QAction::triggered,
565 for(qint32 i = 0; i < selected.size(); ++i)
566 if(selected[i].column() == 1)
569 menu->addSection(
"Selection");
571 QAction* doSelection = menu->addAction(tr(
"Only show selection"));
572 connect(doSelection, &QAction::triggered,
576 QAction*
hideSelection = menu->addAction(tr(
"Hide selection"));
581 QAction* resetAppliedSelection = menu->addAction(tr(
"Reset selection"));
582 connect(resetAppliedSelection, &QAction::triggered,
584 connect(resetAppliedSelection, &QAction::triggered,
588 menu->popup(
m_pTableView->viewport()->mapToGlobal(pos));
596 for(
int i = 0; i<
m_pModel->rowCount(); i++) {
628 for(qint32 i = 0; i <
m_pFiffInfo->chs.size(); ++i) {
679 QModelIndexList selected =
m_pTableView->selectionModel()->selectedIndexes();
681 for(
int i=0; i<selected.size(); i++) {
683 m_pModel->markChBad(selected[i],
false);
687 m_pModel->markChBad(selected[i],
true);
718 double dDx =
static_cast<double>(
m_pTableView->columnWidth(1)) /
static_cast<double>(
m_pModel->getMaxSamples());
719 double dSample =
static_cast<double>(
m_iClickPosX) / dDx;
721 int iFirstSampleOffset =
m_pModel->getFirstSampleOffset();
724 if (dSample >
m_pModel->getCurrentSampleIndex() && iFirstSampleOffset == 0){
729 int iAbsoluteSample =
static_cast<int>(dSample) + iFirstSampleOffset;
732 if (dSample >
m_pModel->getCurrentSampleIndex()){
733 iAbsoluteSample -=
m_pModel->getMaxSamples();
736 qDebug() <<
"EVENT SAMPLE:" << iAbsoluteSample;
Real-time FIFF raw-data table browser backed by RtFiffRawViewModel + RtFiffRawViewDelegate.
QAbstractItemDelegate painting one FIFF channel's signal trace inside RtFiffRawView.
Circular-buffer QAbstractTableModel feeding the real-time FIFF raw browser.
Full FIFF measurement metadata: everything from FIFFB_MEAS / FIFFB_MEAS_INFO needed to interpret a re...
Linear-phase FIR filter kernel with overlap-add FFT convolution back-end.
FIFF file I/O, in-memory data structures and high-level readers/writers.
2-D display widgets and visualisation helpers (charts, topography, colour maps).
DSPSHARED_EXPORT Eigen::MatrixXd filterData(const Eigen::MatrixXd &matData, int type, double dCenterfreq, double dBandwidth, double dTransition, double dSFreq, int iOrder=1024, int designMethod=UTILSLIB::FilterKernel::m_designMethods.indexOf(UTILSLIB::FilterParameter("Cosine")), const Eigen::RowVectorXi &vecPicks=Eigen::RowVectorXi(), bool bUseThreads=true, bool bKeepOverhead=false)
Shared utilities (I/O helpers, spectral analysis, layout management, warp algorithms).
AbstractView(QWidget *parent=0, Qt::WindowFlags f=Qt::Widget)
QAbstractItemDelegate painting one FIFF channel's signal trace inside RtFiffRawView.
void markerMoved(QPoint position, int activeRow)
Circular-buffer QAbstractTableModel feeding the real-time FIFF raw browser.
void addEvent(int iSample)
void toggleFreeze(const QModelIndex &index)
void triggerDetected(int numberDetectedTriggers, const QMap< int, QList< QPair< int, double > > > &mapDetectedTriggers)
void setFilterChannelType(const QString &channelType)
QPointer< DISPLIB::RtFiffRawViewModel > m_pModel
QMap< qint32, float > m_qMapChScaling
void init(QSharedPointer< FIFFLIB::FiffInfo > &info)
QMap< qint32, float > getScalingMap()
RtFiffRawView(const QString &sSettingsPath="", QWidget *parent=0, Qt::WindowFlags f=Qt::Widget)
void takeScreenshot(const QString &fileName)
void updateGuiMode(GuiMode mode)
void setWindowSize(int T)
void visibleRowsChanged()
void updateCompensator(int to)
bool eventFilter(QObject *object, QEvent *event)
void triggerDetected(int numberDetectedTriggers, const QMap< int, QList< QPair< int, double > > > &mapDetectedTriggers)
void setBackgroundColor(const QColor &backgroundColor)
void addSampleAsEvent(int iSample)
void updateSpharaOptions(const QString &sSytemType, int nBaseFctsFirst, int nBaseFctsSecond)
void setDistanceTimeSpacer(int value)
QList< qint32 > m_qListBadChannels
float getSamplingFreq() const
QStringList m_slSelectedChannels
void channelContextMenu(QPoint pos)
Eigen::MatrixXd getLastBlock()
QPointer< QTableView > m_pTableView
void channelMarkingChanged()
void markerMoved(QPoint position, int activeRow)
void addData(const QList< Eigen::MatrixXd > &data)
void updateProcessingMode(ProcessingMode mode)
int m_iDistanceTimeSpacer
void showSelectedChannelsOnly(const QStringList &selectedChannels)
void updateSpharaActivation(bool state)
QSharedPointer< FIFFLIB::FiffInfo > m_pFiffInfo
void triggerInfoChanged(const QMap< double, QColor > &colorMap, bool active, const QString &triggerCh, double threshold)
void setSignalColor(const QColor &signalColor)
QColor getBackgroundColor()
void setSettingsPath(const QString &sSettingsPath)
QPointer< DISPLIB::RtFiffRawViewDelegate > m_pDelegate
void onAddEvent(bool bChecked)
bool getBadChannelHideStatus()
void resetTriggerCounter()
void setFilterActive(bool state)
void setFilter(const UTILSLIB::FilterKernel &filterData)
QList< qint32 > m_qListCurrentSelection
void updateProjection(const QList< FIFFLIB::FiffProj > &projs)
int getDistanceTimeSpacer()
void setZoom(double zoomFac)
void setScalingMap(const QMap< qint32, float > &scaleMap)
The FilterKernel class provides methods to create/design a FIR filter kernel.