MNE-CPP  beta 1.0
mainwindow.cpp
1 //=============================================================================================================
38 //*************************************************************************************************************
39 //=============================================================================================================
40 // INCLUDES
41 //=============================================================================================================
42 
43 #include "mainwindow.h"
44 
45 
46 //*************************************************************************************************************
47 //=============================================================================================================
48 // USED NAMESPACES
49 //=============================================================================================================
50 
51 using namespace MNEBrowseRawQt;
52 
53 
54 //*************************************************************************************************************
55 //=============================================================================================================
56 // DEFINE MEMBER METHODS
57 //=============================================================================================================
58 
59 MainWindow::MainWindow(QWidget *parent)
60 : QMainWindow(parent)
61 , m_qFileRaw("./MNE-sample-data/MEG/sample/sample_audvis_raw.fif")
62 , m_qEventFile("./MNE-sample-data/MEG/sample/sample_audvis_raw-eve.fif")
63 , m_qEvokedFile("./MNE-sample-data/MEG/sample/sample_audvis-ave.fif")
64 , m_qSettings()
65 , m_rawSettings()
66 , ui(new Ui::MainWindowWidget)
67 {
68  ui->setupUi(this);
69 
70  //The following functions and their point of calling should NOT be changed
71  //Setup the windows first - this NEEDS to be done here because important pointers (window pointers) which are needed for further processing are generated in this function
72  setupWindowWidgets();
73  setupMainWindow();
74 
75  // Setup rest of the GUI
76  connectMenus();
77  setWindowStatus();
78 
79  //Set standard LogLevel
80  setLogLevel(_LogLvMax);
81 }
82 
83 
84 //*************************************************************************************************************
85 
86 MainWindow::~MainWindow()
87 {
88 }
89 
90 
91 //*************************************************************************************************************
92 
93 void MainWindow::setupWindowWidgets()
94 {
95  //Create data window
96  m_pDataWindow = new DataWindow(this);
97 
98  //Create dockble event window - QTDesigner used - see / FormFiles
99  m_pEventWindow = new EventWindow(this);
100  addDockWidget(Qt::LeftDockWidgetArea, m_pEventWindow);
101  m_pEventWindow->hide();
102 
103  //Create dockable information window - QTDesigner used - see / FormFiles
104  m_pInformationWindow = new InformationWindow(this);
105  addDockWidget(Qt::BottomDockWidgetArea, m_pInformationWindow);
106  m_pInformationWindow->hide();
107 
108  //Create about window - QTDesigner used - see / FormFiles
109  m_pAboutWindow = new AboutWindow(this);
110  m_pAboutWindow->hide();
111 
112  //Create channel info window - QTDesigner used - see / FormFiles
113  m_pChInfoWindow = new ChInfoWindow(this);
114  addDockWidget(Qt::BottomDockWidgetArea, m_pChInfoWindow);
115  m_pChInfoWindow->hide();
116 
117  //Create selection manager window - QTDesigner used - see / FormFiles
118  m_pSelectionManagerWindow = new SelectionManagerWindow(this, m_pChInfoWindow->getDataModel());
119  addDockWidget(Qt::BottomDockWidgetArea, m_pSelectionManagerWindow);
120  m_pSelectionManagerWindow->hide();
121 
122  //Create average manager window - QTDesigner used - see / FormFiles
123  m_pAverageWindow = new AverageWindow(this, m_qEvokedFile);
124  addDockWidget(Qt::BottomDockWidgetArea, m_pAverageWindow);
125  m_pAverageWindow->hide();
126 
127  //Create scale window - QTDesigner used - see / FormFiles
128  m_pScaleWindow = new ScaleWindow(this);
129  addDockWidget(Qt::LeftDockWidgetArea, m_pScaleWindow);
130  m_pScaleWindow->hide();
131 
132  //Create filter window - QTDesigner used - see / FormFiles
133  m_pFilterWindow = new FilterWindow(this, this);
134  addDockWidget(Qt::BottomDockWidgetArea, m_pFilterWindow);
135  m_pFilterWindow->hide();
136 
137  //Create filter window - QTDesigner used - see / FormFiles
138  m_pProjectionWindow = new ProjectionWindow(this);
139  addDockWidget(Qt::LeftDockWidgetArea, m_pProjectionWindow);
140  m_pProjectionWindow->hide();
141 
142  //Init windows - TODO: get rid of this here, do this inside the window classes
143  m_pDataWindow->init();
144  m_pEventWindow->init();
145  m_pScaleWindow->init();
146 
147  //Create the toolbar after all indows have been initiliased
148  createToolBar();
149 
150  //Connect window signals
151  //Change scaling of the data and averaged data whenever a spinbox value changed or the user performs a pinch gesture on the view
152  connect(m_pScaleWindow, &ScaleWindow::scalingChannelValueChanged,
153  m_pDataWindow, &DataWindow::scaleData);
154 
155  connect(m_pScaleWindow, &ScaleWindow::scalingViewValueChanged,
156  m_pDataWindow, &DataWindow::changeRowHeight);
157 
158  connect(m_pDataWindow, &DataWindow::scaleChannels,
159  m_pScaleWindow, &ScaleWindow::scaleAllChannels);
160 
161  connect(m_pScaleWindow, &ScaleWindow::scalingChannelValueChanged,
162  m_pAverageWindow, &AverageWindow::scaleAveragedData);
163 
164  //Hide non selected channels in the data view
165  connect(m_pSelectionManagerWindow, &SelectionManagerWindow::showSelectedChannelsOnly,
166  m_pDataWindow, &DataWindow::showSelectedChannelsOnly);
167 
168  //Connect selection manager with average manager
169  connect(m_pSelectionManagerWindow, &SelectionManagerWindow::selectionChanged,
171 
172  //Connect channel info window with raw data model, layout manager and the data window
173  connect(m_pDataWindow->getDataModel(), &RawModel::fileLoaded,
174  m_pChInfoWindow->getDataModel(), &ChInfoModel::fiffInfoChanged);
175 
176  connect(m_pDataWindow->getDataModel(), &RawModel::assignedOperatorsChanged,
178 
179  connect(m_pSelectionManagerWindow, &SelectionManagerWindow::loadedLayoutMap,
180  m_pChInfoWindow->getDataModel(), &ChInfoModel::layoutChanged);
181 
182  connect(m_pChInfoWindow->getDataModel(), &ChInfoModel::channelsMappedToLayout,
183  m_pSelectionManagerWindow, &SelectionManagerWindow::setCurrentlyMappedFiffChannels);
184 
185  //Connect selection manager with a new file loaded signal
186  connect(m_pDataWindow->getDataModel(), &RawModel::fileLoaded,
187  m_pSelectionManagerWindow, &SelectionManagerWindow::newFiffFileLoaded);
188 
189  //Connect filter window with new file loaded signal
190  connect(m_pDataWindow->getDataModel(), &RawModel::fileLoaded,
191  m_pFilterWindow, &FilterWindow::newFileLoaded);
192 
193  //Connect projection manager with fif file loading
194  connect(m_pDataWindow->getDataModel(), &RawModel::fileLoaded,
195  m_pProjectionWindow->getDataModel(), static_cast<void (ProjectionModel::*)(const FiffInfo&)>(&ProjectionModel::addProjections));
196 
197  //If a default file has been specified on startup -> call hideSpinBoxes and set laoded fiff channels - TODO: dirty move get rid of this here
198  if(m_pDataWindow->getDataModel()->m_bFileloaded) {
199  m_pScaleWindow->hideSpinBoxes(m_pDataWindow->getDataModel()->m_fiffInfo);
200  m_pChInfoWindow->getDataModel()->fiffInfoChanged(m_pDataWindow->getDataModel()->m_fiffInfo);
201  m_pChInfoWindow->getDataModel()->layoutChanged(m_pSelectionManagerWindow->getLayoutMap());
202  m_pSelectionManagerWindow->setCurrentlyMappedFiffChannels(m_pChInfoWindow->getDataModel()->getMappedChannelsList());
203  m_pSelectionManagerWindow->newFiffFileLoaded();
204  m_pFilterWindow->newFileLoaded();
205  m_pProjectionWindow->getDataModel()->addProjections(m_pDataWindow->getDataModel()->m_fiffInfo);
206  }
207 }
208 
209 
210 //*************************************************************************************************************
211 
212 void MainWindow::createToolBar()
213 {
214  //Create toolbar
215  QToolBar *toolBar = new QToolBar(this);
216  toolBar->setOrientation(Qt::Vertical);
217  toolBar->setMovable(true);
218 
219  //Add DC removal action
220  m_pRemoveDCAction = new QAction(QIcon(":/Resources/Images/removeDC.png"),tr("Remove DC component"), this);
221  m_pRemoveDCAction->setStatusTip(tr("Remove the DC component by subtracting the channel mean"));
222  connect(m_pRemoveDCAction,&QAction::triggered, [=](){
223  if(m_pDataWindow->getDataDelegate()->m_bRemoveDC) {
224  m_pRemoveDCAction->setIcon(QIcon(":/Resources/Images/removeDC.png"));
225  m_pRemoveDCAction->setToolTip("Remove DC component");
226  m_pDataWindow->setStatusTip(tr("Remove the DC component by subtracting the channel mean"));
227  m_pDataWindow->getDataDelegate()->m_bRemoveDC = false;
228  }
229  else {
230  m_pRemoveDCAction->setIcon(QIcon(":/Resources/Images/addDC.png"));
231  m_pRemoveDCAction->setToolTip("Add DC component");
232  m_pRemoveDCAction->setStatusTip(tr("Add the DC component"));
233  m_pDataWindow->getDataDelegate()->m_bRemoveDC = true;
234  }
235 
236  m_pDataWindow->updateDataTableViews();
237  });
238  toolBar->addAction(m_pRemoveDCAction);
239 
240  //Add show/hide bad channel button
241  m_pHideBadAction = new QAction(QIcon(":/Resources/Images/hideBad.png"),tr("Hide all bad channels"), this);
242  m_pHideBadAction->setStatusTip(tr("Hide all bad channels"));
243  connect(m_pHideBadAction,&QAction::triggered, [=](){
244  if(m_pHideBadAction->toolTip() == "Show all bad channels") {
245  m_pHideBadAction->setIcon(QIcon(":/Resources/Images/hideBad.png"));
246  m_pHideBadAction->setToolTip("Hide all bad channels");
247  m_pDataWindow->setStatusTip(tr("Hide all bad channels"));
248  m_pDataWindow->hideBadChannels(false);
249  }
250  else {
251  m_pHideBadAction->setIcon(QIcon(":/Resources/Images/showBad.png"));
252  m_pHideBadAction->setToolTip("Show all bad channels");
253  m_pHideBadAction->setStatusTip(tr("Show all bad channels"));
254  m_pDataWindow->hideBadChannels(true);
255  }
256  });
257  toolBar->addAction(m_pHideBadAction);
258 
259  toolBar->addSeparator();
260 
261  //Toggle visibility of the event manager
262  QAction* showEventManager = new QAction(QIcon(":/Resources/Images/showEventManager.png"),tr("Toggle event manager"), this);
263  showEventManager->setStatusTip(tr("Toggle the event manager"));
264  connect(showEventManager, &QAction::triggered, this, [=](){
265  showWindow(m_pEventWindow);
266  });
267  toolBar->addAction(showEventManager);
268 
269  //Toggle visibility of the filter window
270  QAction* showFilterWindow = new QAction(QIcon(":/Resources/Images/showFilterWindow.png"),tr("Toggle filter window"), this);
271  showFilterWindow->setStatusTip(tr("Toggle filter window"));
272  connect(showFilterWindow, &QAction::triggered, this, [=](){
273  showWindow(m_pFilterWindow);
274  });
275  toolBar->addAction(showFilterWindow);
276 
277  //Toggle visibility of the Selection manager
278  QAction* showSelectionManager = new QAction(QIcon(":/Resources/Images/showSelectionManager.png"),tr("Toggle selection manager"), this);
279  showSelectionManager->setStatusTip(tr("Toggle the selection manager"));
280  connect(showSelectionManager, &QAction::triggered, this, [=](){
281  showWindow(m_pSelectionManagerWindow);
282  });
283  toolBar->addAction(showSelectionManager);
284 
285  //Toggle visibility of the scaling window
286  QAction* showScalingWindow = new QAction(QIcon(":/Resources/Images/showScalingWindow.png"),tr("Toggle scaling window"), this);
287  showScalingWindow->setStatusTip(tr("Toggle the scaling window"));
288  connect(showScalingWindow, &QAction::triggered, this, [=](){
289  showWindow(m_pScaleWindow);
290  });
291  toolBar->addAction(showScalingWindow);
292 
293  //Toggle visibility of the average manager
294  QAction* showAverageManager = new QAction(QIcon(":/Resources/Images/showAverageManager.png"),tr("Toggle average manager"), this);
295  showAverageManager->setStatusTip(tr("Toggle the average manager"));
296  connect(showAverageManager, &QAction::triggered, this, [=](){
297  showWindow(m_pAverageWindow);
298  });
299  toolBar->addAction(showAverageManager);
300 
301  //Toggle visibility of the projection manager
302  QAction* showProjectionManager = new QAction(QIcon(":/Resources/Images/showProjectionWindow.png"),tr("Toggle projection manager"), this);
303  showProjectionManager->setStatusTip(tr("Toggle the projection manager"));
304  connect(showProjectionManager, &QAction::triggered, this, [=](){
305  showWindow(m_pProjectionWindow);
306  });
307  toolBar->addAction(showProjectionManager);
308 
309  toolBar->addSeparator();
310 
311  //Toggle visibility of the channel information window manager
312  QAction* showChInfo = new QAction(QIcon(":/Resources/Images/showChInformationWindow.png"),tr("Channel info"), this);
313  showChInfo->setStatusTip(tr("Toggle channel info window"));
314  connect(showChInfo, &QAction::triggered, this, [=](){
315  showWindow(m_pChInfoWindow);
316  });
317  toolBar->addAction(showChInfo);
318 
319  //Toggle visibility of the information window
320 // QAction* showInformationWindow = new QAction(QIcon(":/Resources/Images/showInformationWindow.png"),tr("Toggle information window"), this);
321 // showInformationWindow->setStatusTip(tr("Toggle the information window"));
322 // connect(showInformationWindow, &QAction::triggered, this, [=](){
323 // showWindow(m_pInformationWindow);
324 // });
325 // toolBar->addAction(showInformationWindow);
326 
327  this->addToolBar(Qt::RightToolBarArea,toolBar);
328 }
329 
330 
331 //*************************************************************************************************************
332 
333 void MainWindow::connectMenus()
334 {
335  //File
336  connect(ui->m_openAction, SIGNAL(triggered()), this, SLOT(openFile()));
337  connect(ui->m_writeAction, SIGNAL(triggered()), this, SLOT(writeFile()));
338  connect(ui->m_loadEvents, SIGNAL(triggered()), this, SLOT(loadEvents()));
339  connect(ui->m_saveEvents, SIGNAL(triggered()), this, SLOT(saveEvents()));
340  connect(ui->m_loadEvokedAction, SIGNAL(triggered()), this, SLOT(loadEvoked()));
341  connect(ui->m_quitAction, SIGNAL(triggered()), qApp, SLOT(quit()));
342 
343  //Adjust
344  connect(ui->m_filterAction, &QAction::triggered, this, [=](){
345  showWindow(m_pFilterWindow);
346  });
347 
348  //Windows
349  connect(ui->m_eventAction, &QAction::triggered, this, [=](){
350  showWindow(m_pEventWindow);
351  });
352  connect(ui->m_informationAction, &QAction::triggered, this, [=](){
353  showWindow(m_pInformationWindow);
354  });
355  connect(ui->m_channelSelectionManagerAction, &QAction::triggered, this, [=](){
356  showWindow(m_pSelectionManagerWindow);
357  });
358  connect(ui->m_averageWindowAction, &QAction::triggered, this, [=](){
359  showWindow(m_pAverageWindow);
360  });
361  connect(ui->m_scalingAction, &QAction::triggered, this, [=](){
362  showWindow(m_pScaleWindow);
363  });
364  connect(ui->m_ChInformationAction, &QAction::triggered, this, [=](){
365  showWindow(m_pChInfoWindow);
366  });
367  connect(ui->m_projectionManagerAction, &QAction::triggered, this, [=](){
368  showWindow(m_pProjectionWindow);
369  });
370 
371  //Help
372  connect(ui->m_aboutAction, &QAction::triggered, this, [=](){
373  showWindow(m_pAboutWindow);
374  });
375 }
376 
377 
378 //*************************************************************************************************************
379 
380 void MainWindow::setupMainWindow()
381 {
382  //set Window functions
383  resize(m_qSettings.value("MainWindow/size", QSize(MAINWINDOW_WINDOW_SIZE_W, MAINWINDOW_WINDOW_SIZE_H)).toSize()); //Resize to predefined default size
384  move(m_qSettings.value("MainWindow/position", QPoint(MAINWINDOW_WINDOW_POSITION_X, MAINWINDOW_WINDOW_POSITION_Y)).toPoint()); // Move this main window to position 50/50 on the screen
385 
386  //Set data window as central widget - This is needed because we are using QDockWidgets
387  setCentralWidget(m_pDataWindow);
388 }
389 
390 
391 //*************************************************************************************************************
392 
393 void MainWindow::setWindowStatus()
394 {
395  //Set window title
396  QString title;
397  //title = QString("%1").arg(CInfo::AppNameShort());
398  title = QString("Visualize and Process");
399  setWindowTitle(title);
400 
401  //Set status bar
402  //Set data file informations
403  if(m_pDataWindow->getDataModel()->m_bFileloaded) {
404  int idx = m_qFileRaw.fileName().lastIndexOf("/");
405  QString filename = m_qFileRaw.fileName().remove(0,idx+1);
406  title = QString("Data file: %1 / First sample: %2 / Sample frequency: %3Hz").arg(filename).arg(m_pDataWindow->getDataModel()->firstSample()).arg(m_pDataWindow->getDataModel()->m_fiffInfo.sfreq);
407  }
408  else
409  title = QString("No data file");
410 
411  //Set event file informations
412  if(m_pEventWindow->getEventModel()->m_bFileloaded) {
413  int idx = m_qEventFile.fileName().lastIndexOf("/");
414  QString filename = m_qEventFile.fileName().remove(0,idx+1);
415 
416  title.append(QString(" - Event file: %1").arg(filename));
417  }
418  else
419  title.append(" - No event file");
420 
421  //Set evoked file informations
422  if(m_pAverageWindow->getAverageModel()->m_bFileloaded) {
423  int idx = m_qEvokedFile.fileName().lastIndexOf("/");
424  QString filename = m_qEvokedFile.fileName().remove(0,idx+1);
425 
426  title.append(QString(" - Evoked file: %1").arg(filename));
427  }
428  else
429  title.append(" - No evoked file");
430 
431  //Add permanent widget to status bar after deleting old one
432  QObjectList cildrenList = statusBar()->children();
433 
434  for(int i = 0; i< cildrenList.size(); i++)
435  statusBar()->removeWidget((QWidget*)cildrenList.at(i));
436 
437  QLabel* label = new QLabel(title);
438  statusBar()->addWidget(label);
439 }
440 
441 
442 //*************************************************************************************************************
443 //Log
444 void MainWindow::writeToLog(const QString& logMsg, LogKind lgknd, LogLevel lglvl)
445 {
446  m_pInformationWindow->writeToLog(logMsg, lgknd, lglvl);
447 }
448 
449 
450 //*************************************************************************************************************
451 
452 void MainWindow::setLogLevel(LogLevel lvl)
453 {
454  m_pInformationWindow->setLogLevel(lvl);
455 }
456 
457 
458 //*************************************************************************************************************
459 // SLOTS
460 void MainWindow::openFile()
461 {
462  QString filename = QFileDialog::getOpenFileName(this,
463  QString("Open fiff data file"),
464  QString("./MNE-sample-data/MEG/sample/"),
465  tr("fif data files (*.fif)"));
466 
467  if(filename.isEmpty())
468  {
469  qDebug("User aborted opening of fiff data file");
470  return;
471  }
472 
473  if(m_qFileRaw.isOpen())
474  m_qFileRaw.close();
475 
476  m_qFileRaw.setFileName(filename);
477 
478  //Clear projection manager model
479  m_pProjectionWindow->getDataModel()->clearModel();
480 
481  //Clear event model
482  m_pEventWindow->getEventModel()->clearModel();
483 
484  // This thread based opening code does not properly work because the .exec blocks all other windows and their threads.
485  // However, the function loadFiffData communicates with these windows and their threads. Therefore chrashes occur.
486 // QFutureWatcher<bool> writeFileFutureWatcher;
487 // QProgressDialog progressDialog("Loading fif file...", QString(), 0, 0, this, Qt::Dialog);
488 
489 // //Connect future watcher and dialog
490 // connect(&writeFileFutureWatcher, &QFutureWatcher<bool>::finished,
491 // &progressDialog, &QProgressDialog::reset);
492 
493 // connect(&progressDialog, &QProgressDialog::canceled,
494 // &writeFileFutureWatcher, &QFutureWatcher<bool>::cancel);
495 
496 // connect(&writeFileFutureWatcher, &QFutureWatcher<bool>::progressRangeChanged,
497 // &progressDialog, &QProgressDialog::setRange);
498 
499 // connect(&writeFileFutureWatcher, &QFutureWatcher<bool>::progressValueChanged,
500 // &progressDialog, &QProgressDialog::setValue);
501 
502 // //Run the file writing in seperate thread
503 // writeFileFutureWatcher.setFuture(QtConcurrent::run(m_pDataWindow->getDataModel(),
504 // &RawModel::loadFiffData,
505 // &m_qFileRaw));
506 
507 // progressDialog.exec();
508 
509 // writeFileFutureWatcher.waitForFinished();
510 
511 // if(!writeFileFutureWatcher.future().result())
512 // qDebug() << "Fiff data file" << filename << "loaded.";
513 // else
514 // qDebug("ERROR loading fiff data file %s",filename.toLatin1().data());
515 
516  if(!m_pDataWindow->getDataModel()->loadFiffData(&m_qFileRaw))
517  qDebug() << "Fiff data file" << filename << "loaded.";
518  else
519  qDebug("ERROR loading fiff data file %s",filename.toLatin1().data());
520 
521  //set position of QScrollArea
522  m_pDataWindow->getDataTableView()->horizontalScrollBar()->setValue(0);
523  m_pDataWindow->initMVCSettings();
524 
525  //Set fiffInfo in event model
526  m_pEventWindow->getEventModel()->setFiffInfo(m_pDataWindow->getDataModel()->m_fiffInfo);
527  m_pEventWindow->getEventModel()->setFirstLastSample(m_pDataWindow->getDataModel()->firstSample(),
528  m_pDataWindow->getDataModel()->lastSample());
529 
530  //resize columns to contents - needs to be done because the new data file can be shorter than the old one
531  m_pDataWindow->updateDataTableViews();
532  m_pDataWindow->getDataTableView()->resizeColumnsToContents();
533 
534  //Update status bar
535  setWindowStatus();
536 
537  //Hide not presented channel types and their spin boxes in the scale window
538  m_pScaleWindow->hideSpinBoxes(m_pDataWindow->getDataModel()->m_fiffInfo);
539 
540  m_qFileRaw.close();
541 }
542 
543 
544 //*************************************************************************************************************
545 
546 void MainWindow::writeFile()
547 {
548  QString filename = QFileDialog::getSaveFileName(this,
549  QString("Write fiff data file"),
550  QString("./MNE-sample-data/MEG/sample/"),
551  tr("fif data files (*.fif)"));
552 
553  if(filename.isEmpty()) {
554  qDebug("User aborted saving to fiff data file");
555  return;
556  }
557 
558  if(filename == m_qFileRaw.fileName()) {
559  QMessageBox msgBox;
560  msgBox.setText("You are trying to write to the file you are currently loading the data from. Please choose another file to write to.");
561  msgBox.exec();
562  return;
563  }
564 
565  //Create output file, progress dialog and future watcher
566  QFile qFileOutput (filename);
567  if(qFileOutput.isOpen())
568  qFileOutput.close();
569 
570  QFutureWatcher<bool> writeFileFutureWatcher;
571  QProgressDialog progressDialog("Writing to fif file...", QString(), 0, 0, this, Qt::Dialog);
572 
573  //Connect future watcher and dialog
574  connect(&writeFileFutureWatcher, &QFutureWatcher<bool>::finished,
575  &progressDialog, &QProgressDialog::reset);
576 
577  connect(&progressDialog, &QProgressDialog::canceled,
578  &writeFileFutureWatcher, &QFutureWatcher<bool>::cancel);
579 
580  connect(m_pDataWindow->getDataModel(), &RawModel::writeProgressRangeChanged,
581  &progressDialog, &QProgressDialog::setRange);
582 
583  connect(m_pDataWindow->getDataModel(), &RawModel::writeProgressChanged,
584  &progressDialog, &QProgressDialog::setValue);
585 
586  //Run the file writing in seperate thread
587  writeFileFutureWatcher.setFuture(QtConcurrent::run(m_pDataWindow->getDataModel(),
589  &qFileOutput));
590 
591  progressDialog.exec();
592 
593  writeFileFutureWatcher.waitForFinished();
594 
595  if(!writeFileFutureWatcher.future().result())
596  qDebug() << "MainWindow: ERROR writing fiff data file" << qFileOutput.fileName() << "!";
597  else
598  qDebug() << "MainWindow: Successfully written to" << qFileOutput.fileName() << "!";
599 }
600 
601 
602 //*************************************************************************************************************
603 
604 void MainWindow::loadEvents()
605 {
606  QString filename = QFileDialog::getOpenFileName(this,
607  QString("Open fiff event data file"),
608  QString("./MNE-sample-data/MEG/sample/"),
609  tr("fif event data files (*-eve.fif);;fif data files (*.fif)"));
610 
611  if(filename.isEmpty())
612  {
613  qDebug("User aborted loading fiff event file");
614  return;
615  }
616 
617  if(m_qEventFile.isOpen())
618  m_qEventFile.close();
619 
620  m_qEventFile.setFileName(filename);
621 
622  if(m_pEventWindow->getEventModel()->loadEventData(m_qEventFile))
623  qDebug() << "Fiff event data file" << filename << "loaded.";
624  else
625  qDebug("ERROR loading fiff event data file %s",filename.toLatin1().data());
626 
627  //Update status bar
628  setWindowStatus();
629 
630  //Show event window
631  if(!m_pEventWindow->isVisible())
632  m_pEventWindow->show();
633 }
634 
635 
636 //*************************************************************************************************************
637 
638 void MainWindow::saveEvents()
639 {
640  QString filename = QFileDialog::getSaveFileName(this,
641  QString("Save fiff event data file"),
642  QString("./MNE-sample-data/MEG/sample/"),
643  tr("fif event data files (*-eve.fif);;fif data files (*.fif)"));
644  if(filename.isEmpty())
645  {
646  qDebug("User aborted saving to fiff event data file");
647  return;
648  }
649 
650  if(m_qEventFile.isOpen())
651  m_qEventFile.close();
652  m_qEventFile.setFileName(filename);
653 
654  if(m_pEventWindow->getEventModel()->saveEventData(m_qEventFile)) {
655  qDebug() << "Fiff event data file" << filename << "saved.";
656  }
657  else
658  qDebug("ERROR saving fiff event data file %s",filename.toLatin1().data());
659 }
660 
661 
662 //*************************************************************************************************************
663 
664 void MainWindow::loadEvoked()
665 {
666  QString filename = QFileDialog::getOpenFileName(this,QString("Open evoked fiff data file"),QString("./MNE-sample-data/MEG/sample/"),tr("fif evoked data files (*-ave.fif);;fif data files (*.fif)"));
667 
668  if(filename.isEmpty())
669  {
670  qDebug("User aborted loading fiff evoked file");
671  return;
672  }
673 
674  if(m_qEvokedFile.isOpen())
675  m_qEvokedFile.close();
676 
677  m_qEvokedFile.setFileName(filename);
678 
679  if(m_pAverageWindow->getAverageModel()->loadEvokedData(m_qEvokedFile))
680  qDebug() << "Fiff evoked data file" << filename << "loaded.";
681  else
682  qDebug("ERROR loading evoked data file %s",filename.toLatin1().data());
683 
684  //Update status bar
685  setWindowStatus();
686 
687  //Show average window
688  if(!m_pAverageWindow->isVisible())
689  m_pAverageWindow->show();
690 }
691 
692 
693 //*************************************************************************************************************
694 
695 void MainWindow::showWindow(QWidget *window)
696 {
697  //Note: A widget that happens to be obscured by other windows on the screen is considered to be visible.
698  if(!window->isVisible())
699  {
700  window->show();
701  window->raise();
702  }
703  else // if visible raise the widget to be sure that it is not obscured by other windows
704  window->hide();
705 }
AverageModel * getAverageModel()
The EventWindow class provides the event dock window.
Definition: eventwindow.h:80
void writeToLog(const QString &logMsg, LogKind lgknd, LogLevel lglvl)
bool loadEvokedData(QFile &qFile)
void fiffInfoChanged(const FiffInfo &fiffInfo)
void fileLoaded(const FiffInfo &)
void scaleData(const QMap< QString, double > &scaleMap)
Definition: datawindow.cpp:123
FIFF measurement file information.
Definition: fiff_info.h:96
void channelSelectionManagerChanged(const QList< QGraphicsItem * > &selectedChannelItems)
The ChInfoWindow class provides a dock window for informations about every loaded channel...
Definition: chinfowindow.h:85
The AboutWindow class provides the about window.
Definition: aboutwindow.h:69
Definition: aboutwindow.h:52
The SelectionManagerWindow class provides a channel selection window.
void setFirstLastSample(int firstSample, int lastSample)
Definition: eventmodel.cpp:423
void layoutChanged(const QMap< QString, QPointF > &layoutMap)
void assignedOperatorsChanged(const QMap< int, QSharedPointer< MNEOperator > > &assignedOperators)
void selectionChanged(const QList< QGraphicsItem * > &selectedChannelItems)
The ProjectionWindow class provides a dock window for managing SSP operator projcetions.
void scaleAllChannels(double scaleValue)
QTableView * getDataTableView()
Definition: datawindow.cpp:99
void showSelectedChannelsOnly(QStringList selectedChannels)
The DataWindow class provides the data dock window.
Definition: datawindow.h:85
void writeToLog(const QString &logMsg, LogKind lgknd, LogLevel lglvl)
Definition: mainwindow.cpp:444
bool writeFiffData(QIODevice *p_IODevice)
Definition: rawmodel.cpp:411
The FilterWindow class provides the filter window.
Definition: filterwindow.h:82
void scalingChannelValueChanged(QMap< QString, double >)
The InformationWindow class provides a dockable InformationWindow window.
RawDelegate * getDataDelegate()
Definition: datawindow.cpp:115
const QStringList & getMappedChannelsList()
void assignedOperatorsChanged(const QMap< int, QSharedPointer< MNEOperator > > &)
void scaleAveragedData(const QMap< QString, double > &scaleMap)
qint32 firstSample() const
Definition: rawmodel.h:512
bool saveEventData(QFile &qFile)
Definition: eventmodel.cpp:399
The AverageWindow class provides a dock window for plotting averages.
Definition: averagewindow.h:88
void hideBadChannels(bool hideChannels)
Definition: datawindow.cpp:176
void loadedLayoutMap(const QMap< QString, QPointF > &layoutMap)
bool loadEventData(QFile &qFile)
Definition: eventmodel.cpp:352
void addProjections(const QList< FiffProj > &dataProjs)
void hideSpinBoxes(FiffInfo currentFiffInfo)
void setFiffInfo(FiffInfo &fiffInfo)
Definition: eventmodel.cpp:415
The ScaleWindow class provides the scale window.
Definition: scalewindow.h:84
bool loadFiffData(QFile *qFile)
Definition: rawmodel.cpp:362
void showSelectedChannelsOnly(QStringList selectedChannels)
Definition: datawindow.cpp:140
void changeRowHeight(int height)
Definition: datawindow.cpp:165
void channelsMappedToLayout(const QStringList &mappedLayoutChNames)
qint32 lastSample() const
Definition: rawmodel.h:521
void setCurrentlyMappedFiffChannels(const QStringList &mappedLayoutChNames)