MNE-CPP  beta 1.0
datawindow.cpp
1 //=============================================================================================================
37 //*************************************************************************************************************
38 //=============================================================================================================
39 // INCLUDES
40 //=============================================================================================================
41 
42 #include "datawindow.h"
43 
44 
45 //*************************************************************************************************************
46 //=============================================================================================================
47 // USED NAMESPACES
48 //=============================================================================================================
49 
50 using namespace MNEBrowseRawQt;
51 
52 
53 //*************************************************************************************************************
54 //=============================================================================================================
55 // DEFINE MEMBER METHODS
56 //=============================================================================================================
57 
58 DataWindow::DataWindow(QWidget *parent)
59 : QWidget(parent)
60 , ui(new Ui::DataWindowDockWidget)
61 , m_pMainWindow(static_cast<MainWindow*>(parent))
62 , m_pDataMarker(new DataMarker(this))
63 , m_pCurrentDataMarkerLabel(new QLabel(this))
64 , m_iCurrentMarkerSample(0)
65 , m_bHideBadChannels(false)
66 {
67  ui->setupUi(this);
68 
69  //------------------------
70  //--- Setup data model ---
71  //------------------------
72  if(m_pMainWindow->m_qFileRaw.exists())
73  m_pRawModel = new RawModel(m_pMainWindow->m_qFileRaw, this);
74  else
75  m_pRawModel = new RawModel(this);
76 }
77 
78 
79 //*************************************************************************************************************
80 
82 {
83  delete ui;
84 }
85 
86 
87 //*************************************************************************************************************
88 
90 {
92  initMarker();
93  initLabels();
94 }
95 
96 
97 //*************************************************************************************************************
98 
100 {
101  return ui->m_tableView_rawTableView;
102 }
103 
104 
105 //*************************************************************************************************************
106 
108 {
109  return m_pRawModel;
110 }
111 
112 
113 //*************************************************************************************************************
114 
116 {
117  return m_pRawDelegate;
118 }
119 
120 
121 //*************************************************************************************************************
122 
123 void DataWindow::scaleData(const QMap<QString,double> &scaleMap)
124 {
125  m_pRawDelegate->setScaleMap(scaleMap);
127 }
128 
129 
130 //*************************************************************************************************************
131 
133 {
134  ui->m_tableView_rawTableView->viewport()->update();
135 }
136 
137 
138 //*************************************************************************************************************
139 
140 void DataWindow::showSelectedChannelsOnly(QStringList selectedChannels)
141 {
142  m_slSelectedChannels = selectedChannels;
143 
144  //Hide non selected channels/rows in the data views
145  for(int i = 0; i<m_pRawModel->rowCount(); i++) {
146  QString channel = m_pRawModel->data(m_pRawModel->index(i, 0), Qt::DisplayRole).toString();
147  QVariant v = m_pRawModel->data(m_pRawModel->index(i,1), Qt::BackgroundRole);
148 
149  if(!selectedChannels.contains(channel))
150  ui->m_tableView_rawTableView->hideRow(i);
151  else
152  ui->m_tableView_rawTableView->showRow(i);
153 
154  //if channel is a bad channel and bad channels are to be hidden -> do not show
155  if(v.canConvert<QBrush>() && m_bHideBadChannels)
156  ui->m_tableView_rawTableView->hideRow(i);
157  }
158 
160 }
161 
162 
163 //*************************************************************************************************************
164 
166 {
167  for(int i = 0; i<ui->m_tableView_rawTableView->verticalHeader()->count(); i++)
168  ui->m_tableView_rawTableView->setRowHeight(i, height);
169 
171 }
172 
173 
174 //*************************************************************************************************************
175 
176 void DataWindow::hideBadChannels(bool hideChannels)
177 {
178  m_bHideBadChannels = hideChannels;
179 
180  //Hide non selected channels/rows in the data views
181  for(int i = 0; i<m_pRawModel->rowCount(); i++) {
182  QVariant v = m_pRawModel->data(m_pRawModel->index(i,1),Qt::BackgroundRole);
183  QString chName = m_pRawModel->data(m_pRawModel->index(i,0),Qt::DisplayRole).toString();
184 
185  //Check if channel is marked as bad
186  if(v.canConvert<QBrush>() && m_bHideBadChannels)
187  ui->m_tableView_rawTableView->hideRow(i);
188  else if(m_slSelectedChannels.contains(chName))
189  ui->m_tableView_rawTableView->showRow(i);
190  }
191 
193 }
194 
195 
196 //*************************************************************************************************************
197 
199 {
200  //-----------------------------------
201  //------ Init data window view ------
202  //-----------------------------------
203  //Set MVC model
204  ui->m_tableView_rawTableView->setModel(m_pRawModel);
205 
206  //Set MVC delegate
207  m_pRawDelegate = new RawDelegate(this);
208  ui->m_tableView_rawTableView->setItemDelegate(m_pRawDelegate);
209 
210  //set some settings for m_pRawTableView
211  ui->m_tableView_rawTableView->verticalHeader()->setDefaultSectionSize(m_pRawDelegate->m_iDefaultPlotHeight);
212  ui->m_tableView_rawTableView->setColumnHidden(0,true); //because content is plotted jointly with column=1
213  ui->m_tableView_rawTableView->setColumnHidden(2,true); //because we do not want to plot the mean values
214  ui->m_tableView_rawTableView->resizeColumnsToContents();
215 
216  //set context menu
217  ui->m_tableView_rawTableView->setContextMenuPolicy(Qt::CustomContextMenu);
218  connect(ui->m_tableView_rawTableView,&QWidget::customContextMenuRequested,
220 
221  //activate kinetic scrolling
222  QScroller::grabGesture(ui->m_tableView_rawTableView, QScroller::LeftMouseButtonGesture);
223  m_pKineticScroller = QScroller::scroller(ui->m_tableView_rawTableView);
224  m_pKineticScroller->setSnapPositionsX(100,100);
225  //m_pKineticScroller->setSnapPositionsY(100,100);
226 
227  //connect QScrollBar with model in order to reload data samples
228  connect(ui->m_tableView_rawTableView->horizontalScrollBar(), &QScrollBar::valueChanged,
229  m_pRawModel, &RawModel::updateScrollPos);
230 
231  //connect selection of a channel to selection manager
232  connect(ui->m_tableView_rawTableView->selectionModel(), &QItemSelectionModel::selectionChanged,
234 
235  //connect selection change to update data views
236  connect(ui->m_tableView_rawTableView->selectionModel(), &QItemSelectionModel::selectionChanged,
238 
239  //Set MVC in delegate
240  m_pRawDelegate->setModelView(m_pMainWindow->m_pEventWindow->getEventModel(),
241  m_pMainWindow->m_pEventWindow->getEventTableView(),
242  ui->m_tableView_rawTableView);
243 
244  //Install event filter to overcome QGrabGesture and QScrollBar/QHeader problem
245  ui->m_tableView_rawTableView->horizontalScrollBar()->installEventFilter(this);
246  ui->m_tableView_rawTableView->verticalScrollBar()->installEventFilter(this);
247  ui->m_tableView_rawTableView->verticalHeader()->installEventFilter(this);
248 
249  //Enable gestures for the view
250  ui->m_tableView_rawTableView->grabGesture(Qt::PinchGesture);
251  ui->m_tableView_rawTableView->installEventFilter(this);
252 
253  //Enable event fitlering for the viewport in order to intercept mouse events
254  ui->m_tableView_rawTableView->viewport()->installEventFilter(this);
255 }
256 
257 
258 //*************************************************************************************************************
259 
260 void DataWindow::initMarker()
261 {
262  //Set marker as front top-most widget
263  m_pDataMarker->raise();
264 
265  //Get boundary rect coordinates for table view
266  double boundingLeft = ui->m_tableView_rawTableView->verticalHeader()->geometry().right() + ui->m_tableView_rawTableView->geometry().left();
267  double boundingRight = ui->m_tableView_rawTableView->geometry().right() - ui->m_tableView_rawTableView->verticalScrollBar()->width() + 1;
268  QRect boundingRect;
269  boundingRect.setLeft(boundingLeft);
270  boundingRect.setRight(boundingRight);
271 
272  //Inital position of the marker
273  m_pDataMarker->move(boundingRect.x(), boundingRect.y() + 1);
274 
275  //Create Region from bounding rect - this region is used to restrain the marker inside the data view
276  QRegion region(boundingRect);
277  m_pDataMarker->setMovementBoundary(region);
278 
279  //Set marker size to table view size minus horizontal scroll bar height
280  m_pDataMarker->resize(DATA_MARKER_WIDTH,
281  boundingRect.height() - ui->m_tableView_rawTableView->horizontalScrollBar()->height()-1);
282 
283  //Connect current marker to marker move signal
284  connect(m_pDataMarker,&DataMarker::markerMoved,
286 
287  //If no file has been loaded yet dont show the marker and its label
288  if(!m_pRawModel->m_bFileloaded) {
289  m_pDataMarker->hide();
290  m_pCurrentDataMarkerLabel->hide();
291  ui->m_label_sampleMin->hide();
292  ui->m_label_sampleMax->hide();
293  }
294 
295  //Connect current marker to loading a fiff file - no loaded file - no visible marker
296  connect(m_pRawModel, &RawModel::fileLoaded,[this](){
297  bool state = m_pRawModel->m_bFileloaded;
298  if(state) {
299  //Inital position of the marker
300  m_pDataMarker->move(74, m_pDataMarker->y());
301  m_pCurrentDataMarkerLabel->move(m_pDataMarker->geometry().left() + (DATA_MARKER_WIDTH/2) - (m_pCurrentDataMarkerLabel->width()/2) + 1, m_pDataMarker->geometry().top() - 20);
302 
303  m_pDataMarker->show();
304  m_pCurrentDataMarkerLabel->show();
305 
306  ui->m_label_sampleMin->show();
307  ui->m_label_sampleMax->show();
308  }
309  else {
310  m_pDataMarker->hide();
311  m_pCurrentDataMarkerLabel->hide();
312 
313  ui->m_label_sampleMin->hide();
314  ui->m_label_sampleMax->hide();
315  }
316  });
317 }
318 
319 
320 //*************************************************************************************************************
321 
322 void DataWindow::initLabels()
323 {
324  //Setup range samples
325  //Connect range sample labels to horizontal sroll bar changes
326  connect(ui->m_tableView_rawTableView->horizontalScrollBar(),&QScrollBar::valueChanged,
328 
329  //Setup marker label
330  //Set current marker sample label to vertical spacer position and initalize text
331  m_pCurrentDataMarkerLabel->resize(150, m_pCurrentDataMarkerLabel->height());
332  m_pCurrentDataMarkerLabel->setAlignment(Qt::AlignHCenter);
333  m_pCurrentDataMarkerLabel->move(m_pDataMarker->geometry().left(), m_pDataMarker->geometry().top() + 5);
334  QString numberString = QString().number(m_iCurrentMarkerSample);
335  m_pCurrentDataMarkerLabel->setText(numberString.append(QString(" / %1").arg("0 sec")));
336 
337  //Set color
338  QPalette palette;
339  QColor textColor = m_qSettings.value("DataMarker/data_marker_color", QColor(93,177,47)).value<QColor>();
340  //textColor.setAlpha(DATA_MARKER_OPACITY);
341  palette.setColor(QPalette::WindowText, textColor);
342 
343  QColor windowColor;
344  windowColor.setAlpha(0); //make qlabel bounding rect fully transparent
345  palette.setColor(QPalette::Window, windowColor);
346 
347  m_pCurrentDataMarkerLabel->setAutoFillBackground(true);
348  m_pCurrentDataMarkerLabel->setPalette(palette);
349 
350  //Connect current marker sample label to marker move signal
351  connect(m_pDataMarker,&DataMarker::markerMoved,
353 
354  //Connect current marker sample label to horizontal scroll bar changes
355  connect(ui->m_tableView_rawTableView->horizontalScrollBar(),&QScrollBar::valueChanged,
357 }
358 
359 
360 //*************************************************************************************************************
361 
362 void DataWindow::resizeEvent(QResizeEvent * event)
363 {
364  //On every resize update marker position
366 
367  //On every resize set sample informaiton
369 
370  return QWidget::resizeEvent(event);
371 }
372 
373 
374 //*************************************************************************************************************
375 
376 void DataWindow::keyPressEvent(QKeyEvent* event)
377 {
378  QScrollBar* horizontalScrollBar = ui->m_tableView_rawTableView->horizontalScrollBar();
379 
380  switch(event->key()) {
381  case Qt::Key_Left:
382  horizontalScrollBar->setValue(horizontalScrollBar->value() - 25);
383  break;
384  case Qt::Key_Right:
385  horizontalScrollBar->setValue(horizontalScrollBar->value() + 25);
386  break;
387  }
388 
389  if((event->modifiers() == Qt::ControlModifier && event->key() == Qt::Key_D))
390  ui->m_tableView_rawTableView->clearSelection();
391 
392  return QWidget::keyPressEvent(event);
393 }
394 
395 
396 //*************************************************************************************************************
397 
398 bool DataWindow::eventFilter(QObject *object, QEvent *event)
399 {
400  //Detect double mouse clicks and move data marker to current mouse position
401  if (object == ui->m_tableView_rawTableView->viewport() && event->type() == QEvent::MouseButtonDblClick) {
402  QMouseEvent* mouseEventCast = static_cast<QMouseEvent*>(event);
403  if(mouseEventCast->button() == Qt::LeftButton) {
404  m_pDataMarker->move(mouseEventCast->localPos().x() + ui->m_tableView_rawTableView->verticalHeader()->width() + ui->m_tableView_rawTableView->x(), m_pDataMarker->y());
405 
406  //Deselect channel which was selected through the double click -> dirty hack
407  //ui->m_tableView_rawTableView->selectionModel()->select(ui->m_tableView_rawTableView->selectionModel()->currentIndex(), QItemSelectionModel::Deselect);
408  }
409  }
410 
411  //Deactivate grabbing gesture when scrollbars or vertical header are selected
412  if ((object == ui->m_tableView_rawTableView->horizontalScrollBar() ||
413  object == ui->m_tableView_rawTableView->verticalScrollBar() ||
414  object == ui->m_tableView_rawTableView->verticalHeader())
415  && event->type() == QEvent::Enter) {
416  QScroller::ungrabGesture(ui->m_tableView_rawTableView);
417  return true;
418  }
419 
420  //Activate grabbing gesture when scrollbars or vertical header are deselected
421  if ((object == ui->m_tableView_rawTableView->horizontalScrollBar() ||
422  object == ui->m_tableView_rawTableView->verticalScrollBar() ||
423  object == ui->m_tableView_rawTableView->verticalHeader())
424  && event->type() == QEvent::Leave) {
425  QScroller::grabGesture(ui->m_tableView_rawTableView, QScroller::LeftMouseButtonGesture);
426  return true;
427  }
428 
429  //Look for swipe gesture in order to scale the channels
430  if (object == ui->m_tableView_rawTableView && event->type() == QEvent::Gesture) {
431  QGestureEvent* gestureEventCast = static_cast<QGestureEvent*>(event);
432  return gestureEvent(static_cast<QGestureEvent*>(gestureEventCast));
433  }
434 
435  return false;
436 }
437 
438 //*************************************************************************************************************
439 
441 {
442  //obtain index where index was clicked
443  //QModelIndex index = m_pRawTableView->indexAt(pos);
444 
445  //get selected items
446  QModelIndexList selected = ui->m_tableView_rawTableView->selectionModel()->selectedIndexes();
447 
448  //create custom context menu and actions
449  QMenu *menu = new QMenu(this);
450 
451  //**************** Marking ****************
452  QMenu *markingSubMenu = new QMenu("Mark channels",menu);
453 
454  QAction* doMarkChBad = markingSubMenu->addAction(tr("Mark as bad"));
455  connect(doMarkChBad,&QAction::triggered, [=](){
456  m_pRawModel->markChBad(selected,1);
457  });
458 
459  QAction* doMarkChGood = markingSubMenu->addAction(tr("Mark as good"));
460  connect(doMarkChGood,&QAction::triggered, [=](){
461  m_pRawModel->markChBad(selected,0);
462  });
463 
464  //**************** FilterOperators ****************
465  //selected channels
466  QMenu *filtOpSubMenu = new QMenu("Apply FilterOperator to selected channel",menu);
467  QMutableMapIterator<QString,QSharedPointer<MNEOperator> > it(m_pRawModel->m_Operators);
468  while(it.hasNext()) {
469  it.next();
470  QAction* doApplyFilter = filtOpSubMenu->addAction(tr("%1").arg(it.key()));
471 
472  connect(doApplyFilter,&QAction::triggered, [=](){
473  m_pRawModel->applyOperator(selected,it.value());
474  });
475  }
476 
477  //all channels
478  QMenu *filtOpAllSubMenu = new QMenu("Apply FilterOperator to all channels",menu);
479  it.toFront();
480  while(it.hasNext()) {
481  it.next();
482  QAction* doApplyFilter = filtOpAllSubMenu->addAction(tr("%1").arg(it.key()));
483 
484  connect(doApplyFilter,&QAction::triggered, [=](){
485  m_pRawModel->applyOperator(QModelIndexList(),it.value());
486  });
487  }
488 
489  //undoing filtering
490  QMenu *undoFiltOpSubMenu = new QMenu("Undo filtering",menu);
491  QMenu *undoFiltOpSelSubMenu = new QMenu("to selected channels",undoFiltOpSubMenu);
492 
493  //undo certain FilterOperators to selected channels
494  it.toFront();
495  while(it.hasNext()) {
496  it.next();
497  QAction* undoApplyFilter = undoFiltOpSelSubMenu->addAction(tr("%1").arg(it.key()));
498 
499  connect(undoApplyFilter,&QAction::triggered, [=](){
500  m_pRawModel->undoFilter(selected,it.value());
501  });
502  }
503 
504  undoFiltOpSubMenu->addMenu(undoFiltOpSelSubMenu);
505 
506  //undo all filterting to selected channels
507  QAction* undoApplyFilterSel = undoFiltOpSubMenu->addAction(tr("Undo FilterOperators to selected channels"));
508  connect(undoApplyFilterSel,&QAction::triggered, [=](){
509  m_pRawModel->undoFilter(selected);
510  });
511 
512  //undo all filtering to all channels
513  QAction* undoApplyFilterAll = undoFiltOpSubMenu->addAction(tr("Undo FilterOperators to all channels"));
514  connect(undoApplyFilterAll,&QAction::triggered, [=](){
515  m_pRawModel->undoFilter();
516  });
517 
518  //add everything to main contextmenu
519  menu->addMenu(markingSubMenu);
520  menu->addMenu(filtOpSubMenu);
521  menu->addMenu(filtOpAllSubMenu);
522  menu->addMenu(undoFiltOpSubMenu);
523 
524  //show context menu
525  menu->popup(ui->m_tableView_rawTableView->viewport()->mapToGlobal(pos));
526 }
527 
528 
529 //*************************************************************************************************************
530 
532 {
533  //Set sapce width so that min sample and max sample are in line with the data plot
534  ui->m_horizontalSpacer_Min->setFixedWidth(ui->m_tableView_rawTableView->verticalHeader()->width());
535  ui->m_horizontalSpacer_Max->setFixedWidth(ui->m_tableView_rawTableView->verticalScrollBar()->width());
536 
537  //calculate sample range which is currently displayed in the view
538  //Note: the viewport holds the width of the area which is changed through scrolling
539  int minSampleRange = ui->m_tableView_rawTableView->horizontalScrollBar()->value()/* + m_pMainWindow->m_pRawModel->firstSample()*/;
540  int maxSampleRange = minSampleRange + ui->m_tableView_rawTableView->viewport()->width();
541 
542  //Set values as string
543  QString stringTemp;
544  int minSampleRangeSec = (minSampleRange/m_pRawModel->m_fiffInfo.sfreq)*1000;
545  ui->m_label_sampleMin->setText(QString("%1 / %2 sec").arg(stringTemp.number(minSampleRange)).arg(stringTemp.number((double)minSampleRangeSec/1000,'g')));
546  int maxSampleRangeSec = (maxSampleRange/m_pRawModel->m_fiffInfo.sfreq)*1000;
547  ui->m_label_sampleMax->setText(QString("%1 / %2 sec").arg(stringTemp.number(maxSampleRange)).arg(stringTemp.number((double)maxSampleRangeSec/1000,'g')));
548 }
549 
550 
551 //*************************************************************************************************************
552 
554 {
555  m_pCurrentDataMarkerLabel->raise();
556 
557  //Update the text and position in the current sample marker label
558  m_iCurrentMarkerSample = ui->m_tableView_rawTableView->horizontalScrollBar()->value() +
559  (m_pDataMarker->geometry().x() - ui->m_tableView_rawTableView->geometry().x() - ui->m_tableView_rawTableView->verticalHeader()->width());
560 
561  int currentSeconds = (m_iCurrentMarkerSample/m_pRawModel->m_fiffInfo.sfreq)*1000;
562 
563  QString numberString = QString("%1 / %2 sec").arg(QString().number(m_iCurrentMarkerSample)).arg(QString().number((double)currentSeconds/1000,'g'));
564  m_pCurrentDataMarkerLabel->setText(numberString);
565 
566  m_pCurrentDataMarkerLabel->move(m_pDataMarker->geometry().left() + (DATA_MARKER_WIDTH/2) - (m_pCurrentDataMarkerLabel->width()/2) + 1, m_pDataMarker->geometry().top() - 20);
567 
568  //Set current marker posisiton in event model
569  m_pMainWindow->m_pEventWindow->getEventModel()->setCurrentMarkerPos(m_iCurrentMarkerSample);
570 }
571 
572 
573 //*************************************************************************************************************
574 
576 {
577  //Get boundary rect coordinates for table view
578  QRect boundingRect = ui->m_tableView_rawTableView->geometry();
579 
580  m_pDataMarker->move(m_pDataMarker->x(), boundingRect.y()+1);
581 
582  double boundingLeft = ui->m_tableView_rawTableView->verticalHeader()->geometry().right() + ui->m_tableView_rawTableView->geometry().left();
583  double boundingRight = ui->m_tableView_rawTableView->geometry().right() - ui->m_tableView_rawTableView->verticalScrollBar()->width() + 1;
584  boundingRect.setLeft(boundingLeft);
585  boundingRect.setRight(boundingRight);
586 
587  //Create Region from bounding rect - this region is used to restrain the marker inside the data view
588  QRegion region(boundingRect);
589  m_pDataMarker->setMovementBoundary(region);
590 
591  //If marker is outside of the bounding rect move to edges of bounding rect
592  if(m_pDataMarker->pos().x() < boundingRect.left()) {
593  m_pDataMarker->move(boundingRect.left(), boundingRect.y()+1);
595  }
596 
597  if(m_pDataMarker->pos().x() > boundingRect.right()) {
598  m_pDataMarker->move(boundingRect.right()-2, boundingRect.y()+1);
600  }
601 
602  //Set marker size to table view size minus horizontal scroll bar height
603  m_pDataMarker->resize(DATA_MARKER_WIDTH,
604  boundingRect.height() - ui->m_tableView_rawTableView->horizontalScrollBar()->height()-1);
605 
606  //Update current marker sample lable
607  m_pCurrentDataMarkerLabel->move(m_pDataMarker->geometry().left() - (m_pCurrentDataMarkerLabel->width()/2) + 1, m_pDataMarker->geometry().top() - 20);
608 }
609 
610 
611 //*************************************************************************************************************
612 
614 {
615  if(m_pMainWindow->m_pSelectionManagerWindow->isVisible()) {
616  QModelIndexList selectedIndexes = ui->m_tableView_rawTableView->selectionModel()->selectedIndexes();
617 
618  m_pMainWindow->m_pSelectionManagerWindow->highlightChannels(selectedIndexes);
619  }
620 }
621 
622 
623 //*************************************************************************************************************
624 
625 bool DataWindow::gestureEvent(QGestureEvent *event)
626 {
627  //Pinch event
628  if (QGesture *pinch = event->gesture(Qt::PinchGesture))
629  pinchTriggered(static_cast<QPinchGesture *>(pinch));
630 
631  return true;
632 }
633 
634 
635 //*************************************************************************************************************
636 
637 bool DataWindow::pinchTriggered(QPinchGesture *gesture)
638 {
639  QPinchGesture::ChangeFlags changeFlags = gesture->changeFlags();
640  if (changeFlags & QPinchGesture::ScaleFactorChanged) {
641  emit scaleChannels(gesture->scaleFactor());
642  qDebug()<<"ungrab";
643  ui->m_tableView_rawTableView->setSelectionMode(QAbstractItemView::NoSelection);
644  QScroller::ungrabGesture(ui->m_tableView_rawTableView);
645  }
646 
647  if (gesture->state() == Qt::GestureFinished) {
648  qDebug()<<"Finished gesture - grab again";
649  ui->m_tableView_rawTableView->setSelectionMode(QAbstractItemView::ExtendedSelection);
650  QScroller::grabGesture(ui->m_tableView_rawTableView, QScroller::LeftMouseButtonGesture);
651  }
652 
653  return true;
654 }
void highlightChannelsInSelectionManager()
Definition: datawindow.cpp:613
void fileLoaded(const FiffInfo &)
The DataWindow class provides the data dock window.
Definition: datamarker.h:75
void scaleData(const QMap< QString, double > &scaleMap)
Definition: datawindow.cpp:123
DataWindow(QWidget *parent=0)
Definition: datawindow.cpp:58
void customContextMenuRequested(QPoint pos)
customContextMenuRequested
Definition: datawindow.cpp:440
void setScaleMap(const QMap< QString, double > &scaleMap)
void updateScrollPos(int value)
Definition: rawmodel.cpp:628
Definition: aboutwindow.h:52
virtual int rowCount(const QModelIndex &parent=QModelIndex()) const
Definition: rawmodel.cpp:152
void setMovementBoundary(QRegion rect)
Definition: datamarker.cpp:77
void undoFilter(QModelIndexList chlist, const QSharedPointer< MNEOperator > &filterPtr)
Definition: rawmodel.cpp:844
Contains the implementation of the DataWindow class.
void setCurrentMarkerPos(int markerPos)
Definition: eventmodel.cpp:432
void applyOperator(QModelIndexList chlist, const QSharedPointer< MNEOperator > &operatorPtr, const QString &chType)
Definition: rawmodel.cpp:681
void markChBad(QModelIndexList chlist, bool status)
Definition: rawmodel.cpp:656
QMap< QString, QSharedPointer< MNEOperator > > m_Operators
Definition: rawmodel.h:183
QTableView * getDataTableView()
Definition: datawindow.cpp:99
void highlightChannels(QModelIndexList channelIndexList)
RawDelegate * getDataDelegate()
Definition: datawindow.cpp:115
void hideBadChannels(bool hideChannels)
Definition: datawindow.cpp:176
void showSelectedChannelsOnly(QStringList selectedChannels)
Definition: datawindow.cpp:140
void changeRowHeight(int height)
Definition: datawindow.cpp:165
void setModelView(EventModel *eventModel, QTableView *eventView, QTableView *rawView)
QTableView * getEventTableView()