From 5fb06bdeb9f883b95be66e86561611616411fcb7 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Fri, 13 Jan 2023 14:38:39 +0100 Subject: [PATCH] Add possibility to fetch rule details for issues Allows to fetch further information of an issue and display it inside the output pane. Change-Id: I94ec27b9c060dca9f9523d763b8628a2fce7ca59 Reviewed-by: David Schulz --- plugins/axivion/axivionoutputpane.cpp | 14 +++++++++++ plugins/axivion/axivionoutputpane.h | 1 + plugins/axivion/axivionplugin.cpp | 31 +++++++++++++++++++++++++ plugins/axivion/axivionquery.cpp | 7 +++++- plugins/axivion/axivionquery.h | 2 +- plugins/axivion/axivionresultparser.cpp | 9 +++++++ plugins/axivion/axivionresultparser.h | 1 + 7 files changed, 63 insertions(+), 2 deletions(-) diff --git a/plugins/axivion/axivionoutputpane.cpp b/plugins/axivion/axivionoutputpane.cpp index c48326863f4..0021f03dc40 100644 --- a/plugins/axivion/axivionoutputpane.cpp +++ b/plugins/axivion/axivionoutputpane.cpp @@ -13,6 +13,7 @@ #include #include #include +#include namespace Axivion::Internal { @@ -98,6 +99,8 @@ AxivionOutputPane::AxivionOutputPane(QObject *parent) m_outputWidget = new QStackedWidget; DashboardWidget *dashboardWidget = new DashboardWidget(m_outputWidget); m_outputWidget->addWidget(dashboardWidget); + QTextBrowser *browser = new QTextBrowser(m_outputWidget); + m_outputWidget->addWidget(browser); } AxivionOutputPane::~AxivionOutputPane() @@ -182,4 +185,15 @@ void AxivionOutputPane::updateDashboard() } } +void AxivionOutputPane::updateAndShowRule(const QString &ruleHtml) +{ + if (auto browser = static_cast(m_outputWidget->widget(1))) { + browser->setText(ruleHtml); + if (!ruleHtml.isEmpty()) { + m_outputWidget->setCurrentIndex(1); + popup(Core::IOutputPane::NoModeSwitch); + } + } +} + } // Axivion::Internal diff --git a/plugins/axivion/axivionoutputpane.h b/plugins/axivion/axivionoutputpane.h index 81b1647154c..aea4354e02e 100644 --- a/plugins/axivion/axivionoutputpane.h +++ b/plugins/axivion/axivionoutputpane.h @@ -34,6 +34,7 @@ public: void goToPrev() override; void updateDashboard(); + void updateAndShowRule(const QString &ruleHtml); private: QStackedWidget *m_outputWidget = nullptr; }; diff --git a/plugins/axivion/axivionplugin.cpp b/plugins/axivion/axivionplugin.cpp index c431af66e7a..9f626656437 100644 --- a/plugins/axivion/axivionplugin.cpp +++ b/plugins/axivion/axivionplugin.cpp @@ -24,11 +24,13 @@ #include #include #include +#include #ifdef LICENSECHECKER # include #endif +#include #include #include @@ -48,6 +50,7 @@ public: void onDocumentClosed(Core::IDocument * doc); void clearAllMarks(); void handleIssuesForFile(const IssuesList &issues); + void fetchRuleInfo(const QString &id); AxivionSettings m_axivionSettings; AxivionSettingsPage m_axivionSettingsPage{&m_axivionSettings}; @@ -78,6 +81,14 @@ AxivionTextMark::AxivionTextMark(const Utils::FilePath &filePath, const ShortIss setToolTip(issue.errorNumber + " " + markText); setPriority(TextEditor::TextMark::NormalPriority); setLineAnnotation(markText); + setActionsProvider([this]{ + auto action = new QAction; + action->setIcon(Utils::Icons::INFO.icon()); + action->setToolTip(Tr::tr("Show rule details")); + QObject::connect(action, &QAction::triggered, + dd, [this]{ dd->fetchRuleInfo(m_id); }); + return QList{action}; + }); } AxivionPlugin::AxivionPlugin() @@ -222,6 +233,26 @@ void AxivionPluginPrivate::fetchProjectInfo(const QString &projectName) runner->start(); } +void AxivionPluginPrivate::fetchRuleInfo(const QString &id) +{ + if (m_runningQuery) { + QTimer::singleShot(3000, [this, id]{ fetchRuleInfo(id); }); + return; + } + + const QStringList args = id.split(':'); + QTC_ASSERT(args.size() == 2, return); + m_runningQuery = true; + AxivionQuery query(AxivionQuery::RuleInfo, args); + AxivionQueryRunner *runner = new AxivionQueryRunner(query, this); + connect(runner, &AxivionQueryRunner::resultRetrieved, this, [this](const QByteArray &result){ + m_runningQuery = false; + m_axivionOutputPane.updateAndShowRule(ResultParser::parseRuleInfo(result)); + }); + connect(runner, &AxivionQueryRunner::finished, [runner]{ runner->deleteLater(); }); + runner->start(); +} + void AxivionPluginPrivate::handleOpenedDocs(ProjectExplorer::Project *project) { if (project && ProjectExplorer::SessionManager::startupProject() != project) diff --git a/plugins/axivion/axivionquery.cpp b/plugins/axivion/axivionquery.cpp index 090b5c7194a..fbf0ec61936 100644 --- a/plugins/axivion/axivionquery.cpp +++ b/plugins/axivion/axivionquery.cpp @@ -23,7 +23,7 @@ AxivionQuery::AxivionQuery(QueryType type, const QStringList ¶meters) QString AxivionQuery::toString() const { - QString query = "/api"; // common for all + QString query = "/api"; // common for all except RuleInfo switch (m_type) { case NoQuery: return {}; @@ -40,6 +40,11 @@ QString AxivionQuery::toString() const + "/issues?kind=" + m_parameters.at(1) + "&filter_path=" + QUrl::toPercentEncoding(m_parameters.at(2)) + "&format=csv"; return query; + case RuleInfo: + QTC_ASSERT(m_parameters.size() == 2, return {}); + query = "/projects/" + QUrl::toPercentEncoding(m_parameters.first()) + + "/issues/" + m_parameters.at(1) + "/rule"; + return query; } return {}; diff --git a/plugins/axivion/axivionquery.h b/plugins/axivion/axivionquery.h index 6cf5ac07ae3..63b64a52f9b 100644 --- a/plugins/axivion/axivionquery.h +++ b/plugins/axivion/axivionquery.h @@ -12,7 +12,7 @@ namespace Axivion::Internal { class AxivionQuery { public: - enum QueryType {NoQuery, DashboardInfo, ProjectInfo, IssuesForFileList}; + enum QueryType {NoQuery, DashboardInfo, ProjectInfo, IssuesForFileList, RuleInfo}; explicit AxivionQuery(QueryType type, const QStringList ¶meters = {}); QString toString() const; diff --git a/plugins/axivion/axivionresultparser.cpp b/plugins/axivion/axivionresultparser.cpp index e2b9713f576..ba483e8f72e 100644 --- a/plugins/axivion/axivionresultparser.cpp +++ b/plugins/axivion/axivionresultparser.cpp @@ -333,6 +333,15 @@ IssuesList parseIssuesList(const QByteArray &input) return result; } +QString parseRuleInfo(const QByteArray &input) // html result! +{ + auto [header, body] = splitHeaderAndBody(input); + BaseResult headerResult = prehandleHeader(header, body); + if (!headerResult.error.isEmpty()) + return QString(); + return QString::fromLocal8Bit(body); +} + } // ResultParser } // Axivion::Internal diff --git a/plugins/axivion/axivionresultparser.h b/plugins/axivion/axivionresultparser.h index c4b0c376f75..090b05d10af 100644 --- a/plugins/axivion/axivionresultparser.h +++ b/plugins/axivion/axivionresultparser.h @@ -94,6 +94,7 @@ namespace ResultParser { DashboardInfo parseDashboardInfo(const QByteArray &input); ProjectInfo parseProjectInfo(const QByteArray &input); IssuesList parseIssuesList(const QByteArray &input); +QString parseRuleInfo(const QByteArray &input); } // ResultParser