60 , ui(new
Ui::DataWindowDockWidget)
61 , m_pMainWindow(static_cast<
MainWindow*>(parent))
63 , m_pCurrentDataMarkerLabel(new QLabel(this))
64 , m_iCurrentMarkerSample(0)
65 , m_bHideBadChannels(false)
72 if(m_pMainWindow->m_qFileRaw.exists())
73 m_pRawModel =
new RawModel(m_pMainWindow->m_qFileRaw,
this);
101 return ui->m_tableView_rawTableView;
117 return m_pRawDelegate;
134 ui->m_tableView_rawTableView->viewport()->update();
142 m_slSelectedChannels = selectedChannels;
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);
149 if(!selectedChannels.contains(channel))
150 ui->m_tableView_rawTableView->hideRow(i);
152 ui->m_tableView_rawTableView->showRow(i);
155 if(v.canConvert<QBrush>() && m_bHideBadChannels)
156 ui->m_tableView_rawTableView->hideRow(i);
167 for(
int i = 0; i<ui->m_tableView_rawTableView->verticalHeader()->count(); i++)
168 ui->m_tableView_rawTableView->setRowHeight(i, height);
178 m_bHideBadChannels = hideChannels;
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();
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);
204 ui->m_tableView_rawTableView->setModel(m_pRawModel);
208 ui->m_tableView_rawTableView->setItemDelegate(m_pRawDelegate);
211 ui->m_tableView_rawTableView->verticalHeader()->setDefaultSectionSize(m_pRawDelegate->
m_iDefaultPlotHeight);
212 ui->m_tableView_rawTableView->setColumnHidden(0,
true);
213 ui->m_tableView_rawTableView->setColumnHidden(2,
true);
214 ui->m_tableView_rawTableView->resizeColumnsToContents();
217 ui->m_tableView_rawTableView->setContextMenuPolicy(Qt::CustomContextMenu);
218 connect(ui->m_tableView_rawTableView,&QWidget::customContextMenuRequested,
222 QScroller::grabGesture(ui->m_tableView_rawTableView, QScroller::LeftMouseButtonGesture);
223 m_pKineticScroller = QScroller::scroller(ui->m_tableView_rawTableView);
224 m_pKineticScroller->setSnapPositionsX(100,100);
228 connect(ui->m_tableView_rawTableView->horizontalScrollBar(), &QScrollBar::valueChanged,
232 connect(ui->m_tableView_rawTableView->selectionModel(), &QItemSelectionModel::selectionChanged,
236 connect(ui->m_tableView_rawTableView->selectionModel(), &QItemSelectionModel::selectionChanged,
242 ui->m_tableView_rawTableView);
245 ui->m_tableView_rawTableView->horizontalScrollBar()->installEventFilter(
this);
246 ui->m_tableView_rawTableView->verticalScrollBar()->installEventFilter(
this);
247 ui->m_tableView_rawTableView->verticalHeader()->installEventFilter(
this);
250 ui->m_tableView_rawTableView->grabGesture(Qt::PinchGesture);
251 ui->m_tableView_rawTableView->installEventFilter(
this);
254 ui->m_tableView_rawTableView->viewport()->installEventFilter(
this);
260 void DataWindow::initMarker()
263 m_pDataMarker->raise();
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;
269 boundingRect.setLeft(boundingLeft);
270 boundingRect.setRight(boundingRight);
273 m_pDataMarker->move(boundingRect.x(), boundingRect.y() + 1);
276 QRegion region(boundingRect);
280 m_pDataMarker->resize(DATA_MARKER_WIDTH,
281 boundingRect.height() - ui->m_tableView_rawTableView->horizontalScrollBar()->height()-1);
289 m_pDataMarker->hide();
290 m_pCurrentDataMarkerLabel->hide();
291 ui->m_label_sampleMin->hide();
292 ui->m_label_sampleMax->hide();
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);
303 m_pDataMarker->show();
304 m_pCurrentDataMarkerLabel->show();
306 ui->m_label_sampleMin->show();
307 ui->m_label_sampleMax->show();
310 m_pDataMarker->hide();
311 m_pCurrentDataMarkerLabel->hide();
313 ui->m_label_sampleMin->hide();
314 ui->m_label_sampleMax->hide();
322 void DataWindow::initLabels()
326 connect(ui->m_tableView_rawTableView->horizontalScrollBar(),&QScrollBar::valueChanged,
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")));
339 QColor textColor = m_qSettings.value(
"DataMarker/data_marker_color", QColor(93,177,47)).value<QColor>();
341 palette.setColor(QPalette::WindowText, textColor);
344 windowColor.setAlpha(0);
345 palette.setColor(QPalette::Window, windowColor);
347 m_pCurrentDataMarkerLabel->setAutoFillBackground(
true);
348 m_pCurrentDataMarkerLabel->setPalette(palette);
355 connect(ui->m_tableView_rawTableView->horizontalScrollBar(),&QScrollBar::valueChanged,
362 void DataWindow::resizeEvent(QResizeEvent * event)
370 return QWidget::resizeEvent(event);
376 void DataWindow::keyPressEvent(QKeyEvent* event)
378 QScrollBar* horizontalScrollBar = ui->m_tableView_rawTableView->horizontalScrollBar();
380 switch(event->key()) {
382 horizontalScrollBar->setValue(horizontalScrollBar->value() - 25);
385 horizontalScrollBar->setValue(horizontalScrollBar->value() + 25);
389 if((event->modifiers() == Qt::ControlModifier &&
event->key() == Qt::Key_D))
390 ui->m_tableView_rawTableView->clearSelection();
392 return QWidget::keyPressEvent(event);
398 bool DataWindow::eventFilter(QObject *
object, QEvent *event)
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());
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);
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);
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));
446 QModelIndexList selected = ui->m_tableView_rawTableView->selectionModel()->selectedIndexes();
449 QMenu *menu =
new QMenu(
this);
452 QMenu *markingSubMenu =
new QMenu(
"Mark channels",menu);
454 QAction* doMarkChBad = markingSubMenu->addAction(tr(
"Mark as bad"));
455 connect(doMarkChBad,&QAction::triggered, [=](){
459 QAction* doMarkChGood = markingSubMenu->addAction(tr(
"Mark as good"));
460 connect(doMarkChGood,&QAction::triggered, [=](){
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()) {
470 QAction* doApplyFilter = filtOpSubMenu->addAction(tr(
"%1").arg(it.key()));
472 connect(doApplyFilter,&QAction::triggered, [=](){
478 QMenu *filtOpAllSubMenu =
new QMenu(
"Apply FilterOperator to all channels",menu);
480 while(it.hasNext()) {
482 QAction* doApplyFilter = filtOpAllSubMenu->addAction(tr(
"%1").arg(it.key()));
484 connect(doApplyFilter,&QAction::triggered, [=](){
490 QMenu *undoFiltOpSubMenu =
new QMenu(
"Undo filtering",menu);
491 QMenu *undoFiltOpSelSubMenu =
new QMenu(
"to selected channels",undoFiltOpSubMenu);
495 while(it.hasNext()) {
497 QAction* undoApplyFilter = undoFiltOpSelSubMenu->addAction(tr(
"%1").arg(it.key()));
499 connect(undoApplyFilter,&QAction::triggered, [=](){
504 undoFiltOpSubMenu->addMenu(undoFiltOpSelSubMenu);
507 QAction* undoApplyFilterSel = undoFiltOpSubMenu->addAction(tr(
"Undo FilterOperators to selected channels"));
508 connect(undoApplyFilterSel,&QAction::triggered, [=](){
513 QAction* undoApplyFilterAll = undoFiltOpSubMenu->addAction(tr(
"Undo FilterOperators to all channels"));
514 connect(undoApplyFilterAll,&QAction::triggered, [=](){
519 menu->addMenu(markingSubMenu);
520 menu->addMenu(filtOpSubMenu);
521 menu->addMenu(filtOpAllSubMenu);
522 menu->addMenu(undoFiltOpSubMenu);
525 menu->popup(ui->m_tableView_rawTableView->viewport()->mapToGlobal(pos));
534 ui->m_horizontalSpacer_Min->setFixedWidth(ui->m_tableView_rawTableView->verticalHeader()->width());
535 ui->m_horizontalSpacer_Max->setFixedWidth(ui->m_tableView_rawTableView->verticalScrollBar()->width());
539 int minSampleRange = ui->m_tableView_rawTableView->horizontalScrollBar()->value();
540 int maxSampleRange = minSampleRange + ui->m_tableView_rawTableView->viewport()->width();
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')));
555 m_pCurrentDataMarkerLabel->raise();
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());
561 int currentSeconds = (m_iCurrentMarkerSample/m_pRawModel->
m_fiffInfo.
sfreq)*1000;
563 QString numberString = QString(
"%1 / %2 sec").arg(QString().number(m_iCurrentMarkerSample)).arg(QString().number((
double)currentSeconds/1000,
'g'));
564 m_pCurrentDataMarkerLabel->setText(numberString);
566 m_pCurrentDataMarkerLabel->move(m_pDataMarker->geometry().left() + (DATA_MARKER_WIDTH/2) - (m_pCurrentDataMarkerLabel->width()/2) + 1, m_pDataMarker->geometry().top() - 20);
578 QRect boundingRect = ui->m_tableView_rawTableView->geometry();
580 m_pDataMarker->move(m_pDataMarker->x(), boundingRect.y()+1);
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);
588 QRegion region(boundingRect);
592 if(m_pDataMarker->pos().x() < boundingRect.left()) {
593 m_pDataMarker->move(boundingRect.left(), boundingRect.y()+1);
597 if(m_pDataMarker->pos().x() > boundingRect.right()) {
598 m_pDataMarker->move(boundingRect.right()-2, boundingRect.y()+1);
603 m_pDataMarker->resize(DATA_MARKER_WIDTH,
604 boundingRect.height() - ui->m_tableView_rawTableView->horizontalScrollBar()->height()-1);
607 m_pCurrentDataMarkerLabel->move(m_pDataMarker->geometry().left() - (m_pCurrentDataMarkerLabel->width()/2) + 1, m_pDataMarker->geometry().top() - 20);
615 if(m_pMainWindow->m_pSelectionManagerWindow->isVisible()) {
616 QModelIndexList selectedIndexes = ui->m_tableView_rawTableView->selectionModel()->selectedIndexes();
625 bool DataWindow::gestureEvent(QGestureEvent *event)
628 if (QGesture *pinch = event->gesture(Qt::PinchGesture))
629 pinchTriggered(static_cast<QPinchGesture *>(pinch));
637 bool DataWindow::pinchTriggered(QPinchGesture *gesture)
639 QPinchGesture::ChangeFlags changeFlags = gesture->changeFlags();
640 if (changeFlags & QPinchGesture::ScaleFactorChanged) {
643 ui->m_tableView_rawTableView->setSelectionMode(QAbstractItemView::NoSelection);
644 QScroller::ungrabGesture(ui->m_tableView_rawTableView);
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);
void highlightChannelsInSelectionManager()
void fileLoaded(const FiffInfo &)
The DataWindow class provides the data dock window.
EventModel * getEventModel()
void scaleData(const QMap< QString, double > &scaleMap)
DataWindow(QWidget *parent=0)
void customContextMenuRequested(QPoint pos)
customContextMenuRequested
void setScaleMap(const QMap< QString, double > &scaleMap)
void updateScrollPos(int value)
RawModel * getDataModel()
virtual int rowCount(const QModelIndex &parent=QModelIndex()) const
void setMovementBoundary(QRegion rect)
void undoFilter(QModelIndexList chlist, const QSharedPointer< MNEOperator > &filterPtr)
Contains the implementation of the DataWindow class.
void setCurrentMarkerPos(int markerPos)
void applyOperator(QModelIndexList chlist, const QSharedPointer< MNEOperator > &operatorPtr, const QString &chType)
void markChBad(QModelIndexList chlist, bool status)
void scaleChannels(double)
QMap< QString, QSharedPointer< MNEOperator > > m_Operators
QTableView * getDataTableView()
void setRangeSampleLabels()
void highlightChannels(QModelIndexList channelIndexList)
RawDelegate * getDataDelegate()
void updateMarkerPosition()
void setMarkerSampleLabel()
void hideBadChannels(bool hideChannels)
void showSelectedChannelsOnly(QStringList selectedChannels)
void changeRowHeight(int height)
void updateDataTableViews()
void setModelView(EventModel *eventModel, QTableView *eventView, QTableView *rawView)
QTableView * getEventTableView()