diff --git a/plugins/problemreporter/problemreporterplugin.h b/plugins/problemreporter/problemreporterplugin.h --- a/plugins/problemreporter/problemreporterplugin.h +++ b/plugins/problemreporter/problemreporterplugin.h @@ -64,6 +64,7 @@ void updateReady(const KDevelop::IndexedString& url, const KDevelop::ReferencedTopDUContext&); void updateHighlight(const KDevelop::IndexedString& url); void textDocumentCreated(KDevelop::IDocument* document); + void showModel(const QString& name); private: class ProblemReporterFactory* m_factory; diff --git a/plugins/problemreporter/problemreporterplugin.cpp b/plugins/problemreporter/problemreporterplugin.cpp --- a/plugins/problemreporter/problemreporterplugin.cpp +++ b/plugins/problemreporter/problemreporterplugin.cpp @@ -98,6 +98,7 @@ this, &ProblemReporterPlugin::updateReady); connect(ICore::self()->languageController()->staticAssistantsManager(), &StaticAssistantsManager::problemsChanged, this, &ProblemReporterPlugin::updateHighlight); + connect(pms, &ProblemModelSet::showRequested, this, &ProblemReporterPlugin::showModel); } ProblemReporterPlugin::~ProblemReporterPlugin() @@ -150,6 +151,13 @@ } } +void ProblemReporterPlugin::showModel(const QString& name) +{ + auto w = dynamic_cast(core()->uiController()->findToolView(i18n("Problems"), m_factory)); + if (w) + w->showModel(name); +} + KDevelop::ContextMenuExtension ProblemReporterPlugin::contextMenuExtension(KDevelop::Context* context) { KDevelop::ContextMenuExtension extension; diff --git a/plugins/problemreporter/problemsview.h b/plugins/problemreporter/problemsview.h --- a/plugins/problemreporter/problemsview.h +++ b/plugins/problemreporter/problemsview.h @@ -71,6 +71,9 @@ /// Triggered when a view changes (happens when the model data changes) void onViewChanged(); + /// Open tab for selected model + void showModel(const QString& name); + void selectNextItem() override; void selectPreviousItem() override; diff --git a/plugins/problemreporter/problemsview.cpp b/plugins/problemreporter/problemsview.cpp --- a/plugins/problemreporter/problemsview.cpp +++ b/plugins/problemreporter/problemsview.cpp @@ -352,16 +352,28 @@ return txt; } -void ProblemsView::onModelRemoved(const QString& name) +int tabIndexForName(const QTabWidget* tabWidget, const QString& name) { - int c = m_tabWidget->count(); - int idx = 0; - for (idx = 0; idx < c; ++idx) { - if (nameFromLabel(m_tabWidget->tabText(idx)) == name) - break; + for (int idx = 0; idx < tabWidget->count(); ++idx) { + if (nameFromLabel(tabWidget->tabText(idx)) == name) { + return idx; + } } - if (idx < c) { + return -1; +} + +void ProblemsView::showModel(const QString& name) +{ + int idx = tabIndexForName(m_tabWidget, name); + if (idx >= 0) + m_tabWidget->setCurrentIndex(idx); +} + +void ProblemsView::onModelRemoved(const QString& name) +{ + int idx = tabIndexForName(m_tabWidget, name); + if (idx >= 0) { QWidget* w = m_tabWidget->widget(idx); m_tabWidget->removeTab(idx); delete w; diff --git a/shell/problemmodelset.h b/shell/problemmodelset.h --- a/shell/problemmodelset.h +++ b/shell/problemmodelset.h @@ -73,6 +73,9 @@ /// Removes a model void removeModel(const QString &name); + /// Show model in ProblemsView + void showModel(const QString &name); + /// Retrieves a list of models stored QVector models() const; @@ -83,6 +86,9 @@ /// Emitted when a model is removed void removed(const QString &name); + /// Emitted when showModel() is called + void showRequested(const QString &name); + private: QScopedPointer d; diff --git a/shell/problemmodelset.cpp b/shell/problemmodelset.cpp --- a/shell/problemmodelset.cpp +++ b/shell/problemmodelset.cpp @@ -75,10 +75,19 @@ emit removed(name); } +void ProblemModelSet::showModel(const QString &name) +{ + for (const ModelData &data : d->data) { + if (data.name == name) { + emit showRequested(name); + return; + } + } +} + QVector ProblemModelSet::models() const { return d->data; } } -