37#include <QSvgGenerator>
75 QVBoxLayout* neLayout =
new QVBoxLayout(
this);
77 neLayout->setContentsMargins(0, 0, 0, 0);
78 this->setLayout(neLayout);
95 auto* rhiViewport =
new QRhiWidget;
96#if defined(WASMBUILD) || defined(__EMSCRIPTEN__)
97 rhiViewport->setApi(QRhiWidget::Api::OpenGL);
98#elif defined(Q_OS_MACOS) || defined(Q_OS_IOS)
99 rhiViewport->setApi(QRhiWidget::Api::Metal);
100#elif defined(Q_OS_WIN)
101 rhiViewport->setApi(QRhiWidget::Api::Direct3D11);
103 rhiViewport->setApi(QRhiWidget::Api::OpenGL);
108 rhiViewport->installEventFilter(
this);
109 rhiViewport->setMouseTracking(
true);
139 for (
int i = 0; i <
m_pModel->rowCount(); i++) {
155 m_pTableView->setContextMenuPolicy(Qt::CustomContextMenu);
157 connect(
m_pTableView.data(), &QTableView::doubleClicked,
160 connect(
m_pTableView.data(), &QTableView::customContextMenuRequested,
164 m_pTableView->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
166 m_pTableView->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Stretch);
173 m_pTableView->setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel);
175 connect(
m_pTableView->verticalScrollBar(), &QScrollBar::valueChanged,
183 if (!lMatData.isEmpty()) {
188 for (
int i = 0; i <
m_pModel->rowCount(); i++) {
207 qWarning() <<
"[RtFiffRawView::addData] Received lMatData list is empty.";
223 if (event->type() == QEvent::MouseMove) {
224 updateCrosshair(
static_cast<QMouseEvent*
>(event)->position().toPoint());
225 }
else if (event->type() == QEvent::Leave) {
231 return QWidget::eventFilter(
object, event);
257 const double dDx =
static_cast<double>(
m_pTableView->columnWidth(1)) /
static_cast<double>(
m_pModel->getMaxSamples());
259 return static_cast<int>((iX -
m_pTableView->columnViewportPosition(1)) / dDx);
270 const int iColumn =
columnAt(position.x());
271 const int iSample =
m_pModel->getSampleAtColumn(iColumn);
272 if (iRow < 0 || iSample < 0) {
277 static_cast<float>(
m_pModel->getValueAtColumn(iRow, iColumn)),
374 int iVisibleRows = 0;
375 for (
int i = 0; i <
m_pModel->rowCount(); ++i) {
381 if (iVisibleRows <= 0) {
387 m_pTableView->verticalHeader()->setDefaultSectionSize(iHeight);
404 for (
int i = 0; i <
m_pModel->rowCount(); i++) {
405 QString channel =
m_pModel->data(
m_pModel->index(i, 0), Qt::DisplayRole).toString();
469 qWarning() <<
"[RtFiffRawView::takeScreenshot] No data view available yet"
470 <<
"- no screenshot was taken.";
474 if (fileName.contains(
".svg", Qt::CaseInsensitive)) {
476 QSvgGenerator svgGen;
477 svgGen.setFileName(fileName);
484 if (fileName.contains(
".png", Qt::CaseInsensitive)) {
486 pixMap.save(fileName);
508 m_pModel->updateSpharaActivation(state);
515 m_pModel->updateSpharaOptions(sSytemType, nBaseFctsFirst, nBaseFctsSecond);
536 m_pModel->setFilterChannelType(channelType);
543 const QString& triggerCh,
546 m_pModel->triggerInfoChanged(colorMap, active, triggerCh, threshold);
554 m_pModel->distanceTimeSpacerChanged(value);
579 QSettings settings(
"MNECPP");
590 QSettings settings(
"MNECPP");
627 QModelIndexList selected =
m_pTableView->selectionModel()->selectedIndexes();
630 QMenu* menu =
new QMenu(
this);
631 menu->setAttribute(Qt::WA_DeleteOnClose);
633 menu->addSection(
"Events");
635 QAction* addEventMarker = menu->addAction(tr(
"Add event"));
636 connect(addEventMarker, &QAction::triggered,
641 menu->addSection(
"Channel Marking");
644 QAction* doMarkChBad = menu->addAction(tr(
"Mark as bad"));
645 connect(doMarkChBad, &QAction::triggered,
648 QAction* doMarkChGood = menu->addAction(tr(
"Mark as good"));
649 connect(doMarkChGood, &QAction::triggered,
655 for (qint32 i = 0; i < selected.size(); ++i)
656 if (selected[i].column() == 1)
659 menu->addSection(
"Selection");
661 QAction* doSelection = menu->addAction(tr(
"Only show selection"));
662 connect(doSelection, &QAction::triggered,
666 QAction*
hideSelection = menu->addAction(tr(
"Hide selection"));
671 QAction* resetAppliedSelection = menu->addAction(tr(
"Reset selection"));
672 connect(resetAppliedSelection, &QAction::triggered,
674 connect(resetAppliedSelection, &QAction::triggered,
678 menu->popup(
m_pTableView->viewport()->mapToGlobal(pos));
686 for (
int i = 0; i <
m_pModel->rowCount(); i++) {
718 for (qint32 i = 0; i <
m_pFiffInfo->chs.size(); ++i) {
769 QModelIndexList selected =
m_pTableView->selectionModel()->selectedIndexes();
771 for (
int i = 0; i < selected.size(); i++) {
773 m_pModel->markChBad(selected[i],
false);
776 m_pModel->markChBad(selected[i],
true);
Full FIFF measurement metadata: everything from FIFFB_MEAS / FIFFB_MEAS_INFO needed to interpret a re...
Recursive node of the parsed FIFF block tree (FIFFB_* hierarchy with directory entries and children).
Real-time FIFF raw-data table browser backed by DISPLIB::RtFiffRawViewModel + DISPLIB::RtFiffRawViewD...
QAbstractItemDelegate painting one FIFF channel's signal trace inside DISPLIB::RtFiffRawView.
Circular-buffer QAbstractTableModel feeding the real-time FIFF raw browser.
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)
void cursorDataChanged(float timeSec, float amplitude, const QString &channelName, const QString &unitLabel)
QPointer< DISPLIB::RtFiffRawViewModel > m_pModel
void init(QSharedPointer< FIFFLIB::FiffInfo > &info)
QMap< qint32, float > getScalingMap()
RtFiffRawView(const QString &sSettingsPath="", QWidget *parent=0, Qt::WindowFlags f=Qt::Widget)
bool crosshairEnabled() const
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 addData(const QList< Eigen::MatrixXd > &lMatData)
void triggerDetected(int numberDetectedTriggers, const QMap< int, QList< QPair< int, double > > > &mapDetectedTriggers)
QMap< qint32, float > m_qMapChScaling
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()
int columnAt(int iX) const
void markerMoved(QPoint position, int activeRow)
void updateProcessingMode(ProcessingMode mode)
int m_iDistanceTimeSpacer
void showSelectedChannelsOnly(const QStringList &selectedChannels)
void updateSpharaActivation(bool state)
void setCrosshairEnabled(bool enabled)
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 updateCrosshair(const QPoint &position)
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.
static const char * get_unit_name(int unit)