diff --git a/src/plugins/memcheck/memcheckerrorview.cpp b/src/plugins/memcheck/memcheckerrorview.cpp index 37542b916288424d42bedf7632e0269b59c45188..754a1159ba99f6e9696e94f33eee1fd81de1d04d 100644 --- a/src/plugins/memcheck/memcheckerrorview.cpp +++ b/src/plugins/memcheck/memcheckerrorview.cpp @@ -429,6 +429,14 @@ MemcheckErrorView::MemcheckErrorView(QWidget *parent) m_copyAction->setShortcutContext(Qt::WidgetWithChildrenShortcut); connect(m_copyAction, SIGNAL(triggered()), itemDelegate(), SLOT(copy())); addAction(m_copyAction); + + m_suppressAction = new QAction(this); + m_suppressAction->setText(tr("Suppress Error")); + m_suppressAction->setIcon(QIcon(QLatin1String(":/qmldesigner/images/eye_crossed.png"))); + m_suppressAction->setShortcut(QKeySequence(Qt::Key_Delete)); + m_suppressAction->setShortcutContext(Qt::WidgetWithChildrenShortcut); + connect(m_suppressAction, SIGNAL(triggered()), this, SLOT(suppressError())); + addAction(m_suppressAction); } MemcheckErrorView::~MemcheckErrorView() @@ -474,9 +482,9 @@ void MemcheckErrorView::settingsChanged(AnalyzerSettings *settings) void MemcheckErrorView::contextMenuEvent(QContextMenuEvent *e) { const QModelIndexList indizes = selectionModel()->selectedRows(); - if (indizes.isEmpty()) { + if (indizes.isEmpty()) return; - } + QList<Error> errors; foreach(const QModelIndex &index, indizes) { @@ -488,16 +496,19 @@ void MemcheckErrorView::contextMenuEvent(QContextMenuEvent *e) QMenu menu; menu.addAction(m_copyAction); menu.addSeparator(); - QAction *suppress = menu.addAction(tr("Suppress Error(s)", "", errors.size())); - suppress->setIcon(QIcon(QLatin1String(":/qmldesigner/images/eye_crossed.png"))); - suppress->setEnabled(!errors.isEmpty()); - - if (QAction *executed = menu.exec(e->globalPos())) { - if (executed == suppress) { - SuppressionDialog *dialog = new SuppressionDialog(this); - dialog->setModal(true); - dialog->show(); - dialog->setAttribute(Qt::WA_DeleteOnClose, true); - } + menu.addAction(m_suppressAction); + m_suppressAction->setEnabled(!errors.isEmpty()); + menu.exec(e->globalPos()); +} + +void MemcheckErrorView::suppressError() +{ + SuppressionDialog *dialog = new SuppressionDialog(this); + if (dialog->shouldShow()) { + dialog->setModal(true); + dialog->show(); + dialog->setAttribute(Qt::WA_DeleteOnClose, true); + } else { + delete dialog; } } diff --git a/src/plugins/memcheck/memcheckerrorview.h b/src/plugins/memcheck/memcheckerrorview.h index cf04447de7f2138aa432689aaf9209da4f4b343d..b303164cc8c124cb634753d1601460e45249c5d8 100644 --- a/src/plugins/memcheck/memcheckerrorview.h +++ b/src/plugins/memcheck/memcheckerrorview.h @@ -111,12 +111,16 @@ signals: public slots: void settingsChanged(AnalyzerSettings *settings); +private slots: + void suppressError(); + protected: void resizeEvent(QResizeEvent *e); void contextMenuEvent(QContextMenuEvent *e); private: QAction *m_copyAction; + QAction *m_suppressAction; QString m_defaultSuppFile; AnalyzerSettings *m_settings; }; diff --git a/src/plugins/memcheck/suppressiondialog.cpp b/src/plugins/memcheck/suppressiondialog.cpp index 07024ae058096c7fe55e15496b42997fd81ead54..2ffb57b30b03f9a8783f95e2d27ab16b33b69cd4 100644 --- a/src/plugins/memcheck/suppressiondialog.cpp +++ b/src/plugins/memcheck/suppressiondialog.cpp @@ -156,7 +156,12 @@ SuppressionDialog::SuppressionDialog(MemcheckErrorView *view, QWidget *parent, Q SLOT(validate())); QString suppressions; - foreach(const QModelIndex &index, m_view->selectionModel()->selectedRows()) { + QModelIndexList indizes = m_view->selectionModel()->selectedRows(); + if (indizes.isEmpty() && m_view->selectionModel()->currentIndex().isValid()) { + // can happen when using arrow keys to navigate and shortcut to trigger suppression + indizes << m_view->selectionModel()->currentIndex(); + } + foreach(const QModelIndex &index, indizes) { Error error = m_view->model()->data(index, ErrorListModel::ErrorRole).value<Error>(); if (!error.suppression().isNull()) m_errors << error; @@ -170,6 +175,11 @@ SuppressionDialog::SuppressionDialog(MemcheckErrorView *view, QWidget *parent, Q setWindowTitle(tr("Save Suppression")); } +bool SuppressionDialog::shouldShow() const +{ + return !m_errors.isEmpty(); +} + void SuppressionDialog::accept() { const QString path = m_ui->fileChooser->path(); diff --git a/src/plugins/memcheck/suppressiondialog.h b/src/plugins/memcheck/suppressiondialog.h index 89c504c56a456ddd11716386e6841a714a919b7d..7223ef2b3fb34d4017574c702382c70c34790d65 100644 --- a/src/plugins/memcheck/suppressiondialog.h +++ b/src/plugins/memcheck/suppressiondialog.h @@ -65,6 +65,8 @@ public: virtual void accept(); virtual void reject(); + bool shouldShow() const; + private slots: void validate();