v2.0.0
Loading...
Searching...
No Matches
rtfiffrawview.cpp
Go to the documentation of this file.
1//=============================================================================================================
15
16//=============================================================================================================
17// INCLUDES
18//=============================================================================================================
19
20#include "rtfiffrawview.h"
21
24
25#include <dsp/filterkernel.h>
26#include <fiff/fiff_info.h>
27#include <fiff/fiff_dir_node.h>
28
29//=============================================================================================================
30// QT INCLUDES
31//=============================================================================================================
32
33#include <QGridLayout>
34#include <QHeaderView>
35#include <QTableView>
36#include <QMenu>
37#include <QSvgGenerator>
38#include <QSettings>
39#include <QScrollBar>
40#include <QMouseEvent>
41#include <QRhiWidget>
42
43
44//=============================================================================================================
45// USED NAMESPACES
46//=============================================================================================================
47
48using namespace DISPLIB;
49using namespace FIFFLIB;
50using namespace Eigen;
51using namespace RTPROCESSINGLIB;
52using namespace UTILSLIB;
53
54//=============================================================================================================
55// DEFINE MEMBER METHODS
56//=============================================================================================================
57
58RtFiffRawView::RtFiffRawView(const QString& sSettingsPath,
59 QWidget* parent,
60 Qt::WindowFlags f)
61: AbstractView(parent, f)
62, m_iT(10)
63, m_fSamplingRate(1024)
64, m_fZoomFactor(1.0f)
65, m_bHideBadChannels(false)
67, m_iClickPosX(0)
69{
70 m_sSettingsPath = sSettingsPath;
71 m_pTableView = new QTableView;
73
74 // Set layout
75 QVBoxLayout* neLayout = new QVBoxLayout(this);
76 neLayout->addWidget(m_pTableView);
77 neLayout->setContentsMargins(0, 0, 0, 0);
78 this->setLayout(neLayout);
79
81}
82
83//=============================================================================================================
84
89
90//=============================================================================================================
91
93{
94 if (m_pTableView) {
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);
102#else
103 rhiViewport->setApi(QRhiWidget::Api::OpenGL);
104#endif
105 m_pTableView->setViewport(rhiViewport);
106
107 // Mouse moves drive the crosshair
108 rhiViewport->installEventFilter(this);
109 rhiViewport->setMouseTracking(true);
110 }
111}
112
113//=============================================================================================================
114
115void RtFiffRawView::setSettingsPath(const QString& sSettingsPath)
116{
117 m_sSettingsPath = sSettingsPath;
118 loadSettings();
119}
120
121//=============================================================================================================
122
123void RtFiffRawView::init(QSharedPointer<FIFFLIB::FiffInfo>& info)
124{
125 m_pFiffInfo = info;
127
128 //Init the model
129 m_pModel = new RtFiffRawViewModel(this);
130 m_pModel->setFiffInfo(m_pFiffInfo);
131 m_pModel->setSamplingInfo(m_fSamplingRate, m_iT, true);
134 connect(this, &RtFiffRawView::addSampleAsEvent,
135 m_pModel, &RtFiffRawViewModel::addEvent, Qt::UniqueConnection);
136
137 //Init bad channel list
138 m_qListBadChannels.clear();
139 for (int i = 0; i < m_pModel->rowCount(); i++) {
140 if (m_pModel->data(m_pModel->index(i, 2)).toBool()) {
142 }
143 }
144
145 //Init the delegate
147 m_pDelegate->initPainterPaths(m_pModel);
148
149 connect(this, &RtFiffRawView::markerMoved,
151
152 //Init the view
153 m_pTableView->setModel(m_pModel);
154 m_pTableView->setItemDelegate(m_pDelegate);
155 m_pTableView->setContextMenuPolicy(Qt::CustomContextMenu);
156
157 connect(m_pTableView.data(), &QTableView::doubleClicked,
159
160 connect(m_pTableView.data(), &QTableView::customContextMenuRequested,
162
163 //set some size settings for m_pTableView
164 m_pTableView->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
165 m_pTableView->setShowGrid(false);
166 m_pTableView->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Stretch); //Stretch 2 column to maximal width
167 m_pTableView->horizontalHeader()->hide();
168 m_pTableView->verticalHeader()->setDefaultSectionSize(m_pTableView->height() / m_fZoomFactor); //Row Height
169 m_pTableView->setAutoScroll(false);
170 m_pTableView->setColumnHidden(0, true); //because content is plotted jointly with column=1
171 m_pTableView->setColumnHidden(2, true);
172 m_pTableView->resizeColumnsToContents();
173 m_pTableView->setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel);
174
175 connect(m_pTableView->verticalScrollBar(), &QScrollBar::valueChanged,
177}
178
179//=============================================================================================================
180
181void RtFiffRawView::addData(const QList<Eigen::MatrixXd>& lMatData)
182{
183 if (!lMatData.isEmpty()) {
184 m_pModel->addData(lMatData);
185
186 if (m_qListBadChannels.size() != m_pFiffInfo->bads.size()) {
187 m_qListBadChannels.clear();
188 for (int i = 0; i < m_pModel->rowCount(); i++) {
189 if (m_pModel->data(m_pModel->index(i, 2)).toBool()) {
191 }
192 }
193
194 //Hide non selected channels/rows in the lMatData views
195 for (int i = 0; i < m_qListBadChannels.size(); i++) {
196 if (m_bHideBadChannels) {
197 m_pTableView->hideRow(m_qListBadChannels.at(i));
198 } else {
199 m_pTableView->showRow(m_qListBadChannels.at(i));
200 }
201 }
202
203 //The set of visible rows changed, so the row height has to follow
205 }
206 } else {
207 qWarning() << "[RtFiffRawView::addData] Received lMatData list is empty.";
208 }
209}
210
211//=============================================================================================================
212
214{
215 return m_pModel->getLastBlock();
216}
217
218//=============================================================================================================
219
220bool RtFiffRawView::eventFilter(QObject* object, QEvent* event)
221{
222 if (m_bCrosshairEnabled && m_pModel && object == m_pTableView->viewport()) {
223 if (event->type() == QEvent::MouseMove) {
224 updateCrosshair(static_cast<QMouseEvent*>(event)->position().toPoint());
225 } else if (event->type() == QEvent::Leave) {
226 emit markerMoved(QPoint(), -1);
227 m_pTableView->viewport()->update();
228 }
229 }
230
231 return QWidget::eventFilter(object, event);
232}
233
234//=============================================================================================================
235
237{
238 m_bCrosshairEnabled = enabled;
239
240 if (!enabled) {
241 emit markerMoved(QPoint(), -1);
242 m_pTableView->viewport()->update();
243 }
244}
245
246//=============================================================================================================
247
249{
250 return m_bCrosshairEnabled;
251}
252
253//=============================================================================================================
254
255int RtFiffRawView::columnAt(int iX) const
256{
257 const double dDx = static_cast<double>(m_pTableView->columnWidth(1)) / static_cast<double>(m_pModel->getMaxSamples());
258
259 return static_cast<int>((iX - m_pTableView->columnViewportPosition(1)) / dDx);
260}
261
262//=============================================================================================================
263
264void RtFiffRawView::updateCrosshair(const QPoint& position)
265{
266 const int iRow = m_pTableView->rowAt(position.y());
267 emit markerMoved(position, iRow);
268 m_pTableView->viewport()->update();
269
270 const int iColumn = columnAt(position.x());
271 const int iSample = m_pModel->getSampleAtColumn(iColumn);
272 if (iRow < 0 || iSample < 0) {
273 return;
274 }
275
276 emit cursorDataChanged(static_cast<float>(iSample / static_cast<double>(m_fSamplingRate)),
277 static_cast<float>(m_pModel->getValueAtColumn(iRow, iColumn)),
278 m_pModel->data(m_pModel->index(iRow, 0)).toString(),
279 QString::fromLatin1(FiffDirNode::get_unit_name(m_pModel->getUnit(iRow))));
280}
281
282//=============================================================================================================
283
284void RtFiffRawView::setBackgroundColor(const QColor& backgroundColor)
285{
286 m_backgroundColor = backgroundColor;
287
288 if (m_pModel) {
289 m_pModel->setBackgroundColor(m_backgroundColor);
290 }
291
292 // QPalette pal;
293 // pal.setColor(QPalette::Window, m_backgroundColor);
294 // m_pTableView->viewport()->setPalette(pal);
295 // m_pTableView->viewport()->setBackgroundRole(QPalette::Window);
296}
297
298//=============================================================================================================
299
304
305//=============================================================================================================
306
307QMap<qint32, float> RtFiffRawView::getScalingMap()
308{
309 return m_qMapChScaling;
310}
311
312//=============================================================================================================
313
314void RtFiffRawView::setScalingMap(const QMap<qint32, float>& scaleMap)
315{
316 m_qMapChScaling = scaleMap;
317 m_pModel->setScaling(scaleMap);
318}
319
320//=============================================================================================================
321
322void RtFiffRawView::setSignalColor(const QColor& signalColor)
323{
324 m_pDelegate->setSignalColor(signalColor);
325}
326
327//=============================================================================================================
328
330{
331 return m_pDelegate->getSignalColor();
332}
333
334//=============================================================================================================
335
337{
338 if (m_bHideBadChannels) {
339 m_bHideBadChannels = false;
340 } else {
341 m_bHideBadChannels = true;
342 }
343
344 //Hide non selected channels/rows in the data views
345 for (int i = 0; i < m_qListBadChannels.size(); i++) {
346 if (m_bHideBadChannels) {
347 m_pTableView->hideRow(m_qListBadChannels.at(i));
348 } else {
349 m_pTableView->showRow(m_qListBadChannels.at(i));
350 }
351 }
352
353 //The rows that remain have to share the freed space
355
356 //Update the visible channel list which are to be filtered
358}
359
360//=============================================================================================================
361
363{
364 if (!m_pTableView || !m_pModel) {
365 return;
366 }
367
368 //
369 // The row height is derived from the height of the whole view, so it has to
370 // be recomputed whenever rows appear or disappear. Otherwise hiding a
371 // channel leaves the remaining rows at their previous height and the view
372 // no longer fills the widget.
373 //
374 int iVisibleRows = 0;
375 for (int i = 0; i < m_pModel->rowCount(); ++i) {
376 if (!m_pTableView->isRowHidden(i)) {
377 ++iVisibleRows;
378 }
379 }
380
381 if (iVisibleRows <= 0) {
382 return;
383 }
384
385 const int iHeight = static_cast<int>(static_cast<float>(m_pTableView->height() * m_pModel->rowCount()) / (static_cast<float>(iVisibleRows) * m_fZoomFactor));
386
387 m_pTableView->verticalHeader()->setDefaultSectionSize(iHeight);
388}
389
390//=============================================================================================================
391
396
397//=============================================================================================================
398
399void RtFiffRawView::showSelectedChannelsOnly(const QStringList& selectedChannels)
400{
401 m_slSelectedChannels = selectedChannels;
402
403 //Hide non selected channels/rows in the data views
404 for (int i = 0; i < m_pModel->rowCount(); i++) {
405 QString channel = m_pModel->data(m_pModel->index(i, 0), Qt::DisplayRole).toString();
406
407 //if channel is a bad channel and bad channels are to be hidden -> do not show
408 if (!selectedChannels.contains(channel) || (m_qListBadChannels.contains(i) && m_bHideBadChannels)) {
409 m_pTableView->hideRow(i);
410 } else {
411 m_pTableView->showRow(i);
412 }
413 }
414
415 //The rows that remain have to share the freed space
417
418 //Update the visible channel list which are to be filtered
420}
421
422//=============================================================================================================
423
424void RtFiffRawView::setZoom(double zoomFac)
425{
426 m_fZoomFactor = zoomFac;
427
429}
430
431//=============================================================================================================
432
434{
435 return m_fZoomFactor;
436}
437
438//=============================================================================================================
439
441{
442 m_iT = T;
443
444 m_pModel->setSamplingInfo(m_fSamplingRate, T);
445}
446
447//=============================================================================================================
448
450{
451 return m_iT;
452}
453
454//=============================================================================================================
455
457{
458 return m_fSamplingRate;
459}
460
461//=============================================================================================================
462
463void RtFiffRawView::takeScreenshot(const QString& fileName)
464{
465 // m_pTableView is a QPointer and is only created once a model has been set.
466 // Taking a screenshot before that, or after the view was destroyed, would
467 // otherwise dereference a null pointer.
468 if (m_pTableView.isNull()) {
469 qWarning() << "[RtFiffRawView::takeScreenshot] No data view available yet"
470 << "- no screenshot was taken.";
471 return;
472 }
473
474 if (fileName.contains(".svg", Qt::CaseInsensitive)) {
475 // Generate screenshot
476 QSvgGenerator svgGen;
477 svgGen.setFileName(fileName);
478 svgGen.setSize(m_pTableView->size());
479 svgGen.setViewBox(m_pTableView->rect());
480
481 m_pTableView->render(&svgGen);
482 }
483
484 if (fileName.contains(".png", Qt::CaseInsensitive)) {
485 QPixmap pixMap(m_pTableView->grab());
486 pixMap.save(fileName);
487 }
488}
489
490//=============================================================================================================
491
492void RtFiffRawView::updateProjection(const QList<FIFFLIB::FiffProj>& projs)
493{
494 m_pModel->updateProjection(projs);
495}
496
497//=============================================================================================================
498
500{
501 m_pModel->updateCompensator(to);
502}
503
504//=============================================================================================================
505
507{
508 m_pModel->updateSpharaActivation(state);
509}
510
511//=============================================================================================================
512
513void RtFiffRawView::updateSpharaOptions(const QString& sSytemType, int nBaseFctsFirst, int nBaseFctsSecond)
514{
515 m_pModel->updateSpharaOptions(sSytemType, nBaseFctsFirst, nBaseFctsSecond);
516}
517
518//=============================================================================================================
519
521{
522 m_pModel->setFilter(QList<FilterKernel>() << filterData);
523}
524
525//=============================================================================================================
526
528{
529 m_pModel->setFilterActive(state);
530}
531
532//=============================================================================================================
533
534void RtFiffRawView::setFilterChannelType(const QString& channelType)
535{
536 m_pModel->setFilterChannelType(channelType);
537}
538
539//=============================================================================================================
540
541void RtFiffRawView::triggerInfoChanged(const QMap<double, QColor>& colorMap,
542 bool active,
543 const QString& triggerCh,
544 double threshold)
545{
546 m_pModel->triggerInfoChanged(colorMap, active, triggerCh, threshold);
547}
548
549//=============================================================================================================
550
552{
553 m_iDistanceTimeSpacer = value;
554 m_pModel->distanceTimeSpacerChanged(value);
555}
556
557//=============================================================================================================
558
563
564//=============================================================================================================
565
567{
568 m_pModel->resetTriggerCounter();
569}
570
571//=============================================================================================================
572
574{
575 if (m_sSettingsPath.isEmpty()) {
576 return;
577 }
578
579 QSettings settings("MNECPP");
580}
581
582//=============================================================================================================
583
585{
586 if (m_sSettingsPath.isEmpty()) {
587 return;
588 }
589
590 QSettings settings("MNECPP");
591}
592
593//=============================================================================================================
594
596{
597 switch (mode) {
599 break;
600 default: // default is research mode
601 break;
602 }
603}
604
605//=============================================================================================================
606
608{
609 switch (mode) {
611 break;
612 default: // default is realtime mode
613 break;
614 }
615}
616
617//=============================================================================================================
618
620{
621 m_iClickPosX = pos.x();
622
623 //obtain index where index was clicked
624 QModelIndex index = m_pTableView->indexAt(pos);
625
626 //get selected items
627 QModelIndexList selected = m_pTableView->selectionModel()->selectedIndexes();
628
629 //create custom context menu and actions
630 QMenu* menu = new QMenu(this);
631 menu->setAttribute(Qt::WA_DeleteOnClose);
632
633 menu->addSection("Events");
634
635 QAction* addEventMarker = menu->addAction(tr("Add event"));
636 connect(addEventMarker, &QAction::triggered,
638
639 //Marking
640
641 menu->addSection("Channel Marking");
642
643 if (!m_qListBadChannels.contains(index.row())) {
644 QAction* doMarkChBad = menu->addAction(tr("Mark as bad"));
645 connect(doMarkChBad, &QAction::triggered,
647 } else {
648 QAction* doMarkChGood = menu->addAction(tr("Mark as good"));
649 connect(doMarkChGood, &QAction::triggered,
651 }
652
653 // non C++11 alternative
655 for (qint32 i = 0; i < selected.size(); ++i)
656 if (selected[i].column() == 1)
657 m_qListCurrentSelection.append(m_pModel->getIdxSelMap()[selected[i].row()]);
658
659 menu->addSection("Selection");
660
661 QAction* doSelection = menu->addAction(tr("Only show selection"));
662 connect(doSelection, &QAction::triggered,
664
665 //select channels
666 QAction* hideSelection = menu->addAction(tr("Hide selection"));
667 connect(hideSelection, &QAction::triggered, this,
669
670 //undo selection
671 QAction* resetAppliedSelection = menu->addAction(tr("Reset selection"));
672 connect(resetAppliedSelection, &QAction::triggered,
674 connect(resetAppliedSelection, &QAction::triggered,
676
677 //show context menu
678 menu->popup(m_pTableView->viewport()->mapToGlobal(pos));
679}
680
681//=============================================================================================================
682
684{
685 //Hide non selected channels/rows in the data views
686 for (int i = 0; i < m_pModel->rowCount(); i++) {
687 //if channel is a bad channel and bad channels are to be hidden -> do not show
688 if (m_qListCurrentSelection.contains(i)) {
689 m_pTableView->showRow(i);
690 } else {
691 m_pTableView->hideRow(i);
692 }
693 }
694
695 //Update the visible channel list which are to be filtered
696 //visibleRowsChanged();
697
698 //m_pModel->selectRows(m_qListCurrentSelection);
699}
700
701//=============================================================================================================
702
704{
705 for (int i = 0; i < m_qListCurrentSelection.size(); i++) {
707 }
708
709 //Update the visible channel list which are to be filtered
710 //visibleRowsChanged();
711}
712
713//=============================================================================================================
714
716{
717 // non C++11 alternative
718 for (qint32 i = 0; i < m_pFiffInfo->chs.size(); ++i) {
719 if (m_qListBadChannels.contains(i)) {
720 if (!m_bHideBadChannels) {
721 m_pTableView->showRow(i);
722 }
723 } else {
724 m_pTableView->showRow(i);
725 }
726 }
727
728 //Update the visible channel list which are to be filtered
729 //visibleRowsChanged();
730}
731
732//=============================================================================================================
733
735{
736 if (!m_pTableView || !m_pModel || !m_pDelegate) {
737 return;
738 }
739
740 int from = m_pTableView->rowAt(0);
741 // if(from != 0){
742 // from--;
743
744 int to = m_pTableView->rowAt(m_pTableView->height() - 1);
745 if (to != m_pModel->rowCount() - 1)
746 to++;
747
748 if (from > to)
749 to = m_pModel->rowCount() - 1;
750
751 // //Update visible rows in order to only filter the visible rows
752 // QStringList channelNames;
753
754 // for(int i = from; i<=to; i++) {
755 // channelNames << m_pModel->data(m_pModel->index(i, 0), Qt::DisplayRole).toString();
756 // }
757
758 // m_pModel->createFilterChannelList(channelNames);
759
760 m_pDelegate->setUpperItemIndex(from /*+1*/);
761
762 //qDebug() <<"RtFiffRawView::visibleRowsChanged - from "<< from << " to" << to;
763}
764
765//=============================================================================================================
766
768{
769 QModelIndexList selected = m_pTableView->selectionModel()->selectedIndexes();
770
771 for (int i = 0; i < selected.size(); i++) {
772 if (m_qListBadChannels.contains(selected[i].row())) { //mark as good
773 m_pModel->markChBad(selected[i], false);
774 m_qListBadChannels.removeAll(selected[i].row());
775 } else {
776 m_pModel->markChBad(selected[i], true);
777 m_qListBadChannels.append(selected[i].row());
778 }
779 }
780
781 m_pModel->updateProjection(m_pFiffInfo->projs);
782
783 //Hide non selected channels/rows in the data views
784 for (int i = 0; i < m_qListBadChannels.size(); i++) {
785 if (m_bHideBadChannels) {
786 m_pTableView->hideRow(m_qListBadChannels.at(i));
787 } else {
788 m_pTableView->showRow(m_qListBadChannels.at(i));
789 }
790 }
791
793}
794
795//=============================================================================================================
796
800
801//=============================================================================================================
802
803void RtFiffRawView::onAddEvent(bool bChecked)
804{
805 Q_UNUSED(bChecked)
806
807 // No events on the blank space before the first sweep has filled the window
808 const int iSample = m_pModel->getSampleAtColumn(columnAt(m_iClickPosX));
809 if (iSample >= 0) {
810 emit addSampleAsEvent(iSample);
811 }
812}
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 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)
void takeScreenshot(const QString &fileName)
void updateGuiMode(GuiMode mode)
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
int columnAt(int iX) const
void markerMoved(QPoint position, int activeRow)
void updateProcessingMode(ProcessingMode mode)
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)
void setSettingsPath(const QString &sSettingsPath)
QPointer< DISPLIB::RtFiffRawViewDelegate > m_pDelegate
void updateCrosshair(const QPoint &position)
void onAddEvent(bool bChecked)
void setFilterActive(bool state)
void setFilter(const UTILSLIB::FilterKernel &filterData)
QList< qint32 > m_qListCurrentSelection
void updateProjection(const QList< FIFFLIB::FiffProj > &projs)
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)