diff --git a/src/plugins/axivion/axivionoutputpane.cpp b/src/plugins/axivion/axivionoutputpane.cpp index c4e2ab6a0b8..42c124bd4b4 100644 --- a/src/plugins/axivion/axivionoutputpane.cpp +++ b/src/plugins/axivion/axivionoutputpane.cpp @@ -12,6 +12,8 @@ #include #include +#include + #include #include #include @@ -32,6 +34,7 @@ #include +using namespace Tasking; using namespace Utils; namespace Axivion::Internal { @@ -219,6 +222,7 @@ public: private: void updateTableView(); + void fetchIssues(const IssueListSearch &search); void fetchMoreIssues(); QString m_currentPrefix; @@ -236,6 +240,7 @@ private: TreeModel<> *m_issuesModel = nullptr; int m_totalRowCount = 0; int m_lastRequestedOffset = 0; + TaskTreeRunner m_issuesRunner; }; IssuesWidget::IssuesWidget(QWidget *parent) @@ -484,6 +489,12 @@ void IssuesWidget::updateTableView() fetchIssueTableLayout(m_currentPrefix); } +void IssuesWidget::fetchIssues(const IssueListSearch &search) +{ + const auto issuesHandler = [this](const Dto::IssueTableDto &dto) { addIssues(dto); }; + m_issuesRunner.start(issueTableRecipe(search, issuesHandler)); +} + void IssuesWidget::fetchMoreIssues() { if (m_lastRequestedOffset == m_issuesModel->rowCount()) @@ -609,12 +620,6 @@ void AxivionOutputPane::setTableDto(const Dto::TableInfoDto &dto) issues->setTableDto(dto); } -void AxivionOutputPane::addIssues(const Dto::IssueTableDto &dto) -{ - if (auto issues = static_cast(m_outputWidget->widget(1))) - issues->addIssues(dto); -} - void AxivionOutputPane::updateAndShowRule(const QString &ruleHtml) { if (auto browser = static_cast(m_outputWidget->widget(2))) { diff --git a/src/plugins/axivion/axivionoutputpane.h b/src/plugins/axivion/axivionoutputpane.h index 93e7d8f62c5..58df206091d 100644 --- a/src/plugins/axivion/axivionoutputpane.h +++ b/src/plugins/axivion/axivionoutputpane.h @@ -12,7 +12,6 @@ QT_END_NAMESPACE namespace Axivion::Internal { namespace Dto { -class IssueTableDto; class TableInfoDto; } @@ -39,7 +38,6 @@ public: void updateDashboard(); void updateAndShowRule(const QString &ruleHtml); void setTableDto(const Dto::TableInfoDto &dto); - void addIssues(const Dto::IssueTableDto &dto); private: QStackedWidget *m_outputWidget = nullptr; }; diff --git a/src/plugins/axivion/axivionplugin.cpp b/src/plugins/axivion/axivionplugin.cpp index 61e321c5f97..f35fb4f4d88 100644 --- a/src/plugins/axivion/axivionplugin.cpp +++ b/src/plugins/axivion/axivionplugin.cpp @@ -87,7 +87,6 @@ public: void onStartupProjectChanged(); void fetchProjectInfo(const QString &projectName); void fetchIssueTableLayout(const QString &prefix); - void fetchIssues(const IssueListSearch &search); void handleOpenedDocs(ProjectExplorer::Project *project); void onDocumentOpened(Core::IDocument *doc); void onDocumentClosed(Core::IDocument * doc); @@ -146,12 +145,6 @@ void fetchIssueTableLayout(const QString &prefix) dd->fetchIssueTableLayout(prefix); } -void fetchIssues(const IssueListSearch &search) -{ - QTC_ASSERT(dd, return); - dd->fetchIssues(search); -} - std::optional projectInfo() { QTC_ASSERT(dd, return {}); @@ -373,6 +366,20 @@ Group dashboardInfoRecipe(const DashboardInfoHandler &handler) return root; } +Group issueTableRecipe(const IssueListSearch &search, const IssueTableHandler &handler) +{ + QTC_ASSERT(dd->m_currentProjectInfo, return {}); // TODO: Call handler with unexpected? + + const QString query = search.toQuery(); + if (query.isEmpty()) + return {}; // TODO: Call handler with unexpected? + + const QUrl url = urlForProject(dd->m_currentProjectInfo.value().name + '/') + .resolved(QString("issues" + query)); + + return fetchDataRecipe(url, handler); +} + void AxivionPluginPrivate::fetchProjectInfo(const QString &projectName) { if (m_taskTreeRunner.isRunning()) { // TODO: cache in queue and run when task tree finished @@ -437,28 +444,6 @@ void AxivionPluginPrivate::fetchIssueTableLayout(const QString &prefix) m_taskTreeRunner.start(fetchDataRecipe(url, handler)); } -void AxivionPluginPrivate::fetchIssues(const IssueListSearch &search) -{ - QTC_ASSERT(m_currentProjectInfo.has_value(), return); - if (m_taskTreeRunner.isRunning()) { - QTimer::singleShot(3000, this, [this, search] { fetchIssues(search); }); - return; - } - - const QString query = search.toQuery(); - if (query.isEmpty()) - return; - - const QUrl url = urlForProject(m_currentProjectInfo.value().name + '/') - .resolved(QString("issues" + query)); - - const auto handler = [this](const Dto::IssueTableDto &data) { - m_axivionOutputPane.addIssues(data); - }; - - m_taskTreeRunner.start(fetchDataRecipe(url, handler)); -} - void AxivionPluginPrivate::fetchRuleInfo(const QString &id) { if (m_runningQuery) { diff --git a/src/plugins/axivion/axivionplugin.h b/src/plugins/axivion/axivionplugin.h index 5dd9afd0b3a..9e29969934e 100644 --- a/src/plugins/axivion/axivionplugin.h +++ b/src/plugins/axivion/axivionplugin.h @@ -51,10 +51,13 @@ public: using DashboardInfoHandler = std::function &)>; Tasking::Group dashboardInfoRecipe(const DashboardInfoHandler &handler = {}); +// TODO: Wrap data into expected_str<>? +using IssueTableHandler = std::function; +Tasking::Group issueTableRecipe(const IssueListSearch &search, const IssueTableHandler &handler); + void fetchProjectInfo(const QString &projectName); std::optional projectInfo(); void fetchIssueTableLayout(const QString &prefix); -void fetchIssues(const IssueListSearch &search); bool handleCertificateIssue(); QIcon iconForIssue(const QString &prefix);