diff --git a/src/plugins/axivion/axivionoutputpane.cpp b/src/plugins/axivion/axivionoutputpane.cpp index 80dd5103c14..d3043a12751 100644 --- a/src/plugins/axivion/axivionoutputpane.cpp +++ b/src/plugins/axivion/axivionoutputpane.cpp @@ -51,6 +51,8 @@ using namespace Utils; namespace Axivion::Internal { +void showIssuesFromDashboard(const QString &kind); // impl at bottom + class DashboardWidget : public QScrollArea { public: @@ -147,14 +149,24 @@ void DashboardWidget::updateUi() } return prefix; }; - auto addValuesWidgets = [this, &toolTip](const QString &issueKind, qint64 total, qint64 added, qint64 removed, int row) { + auto linked = [this](const QString &text, const QString &href, bool link) { + return link ? QString("%2").arg(href).arg(text) + : text; + }; + auto addValuesWidgets = [this, &toolTip, &linked](const QString &issueKind, qint64 total, + qint64 added, qint64 removed, int row, bool link) { const QString currentToolTip = toolTip(issueKind); QLabel *label = new QLabel(issueKind, this); label->setToolTip(currentToolTip); m_gridLayout->addWidget(label, row, 0); - label = new QLabel(QString::number(total), this); + label = new QLabel(linked(QString::number(total), issueKind, link), this); label->setToolTip(currentToolTip); label->setAlignment(Qt::AlignRight); + if (link) { + connect(label, &QLabel::linkActivated, this, [](const QString &issueKind) { + showIssuesFromDashboard(issueKind); + }); + } m_gridLayout->addWidget(label, row, 1); label = new QLabel(this); label->setPixmap(trendIcon(added, removed)); @@ -190,12 +202,12 @@ void DashboardWidget::updateUi() allAdded += added; qint64 removed = extract_value(counts, QStringLiteral("Removed")); allRemoved += removed; - addValuesWidgets(issueCount.first, total, added, removed, row); + addValuesWidgets(issueCount.first, total, added, removed, row, true); ++row; } } } - addValuesWidgets(Tr::tr("Total:"), allTotal, allAdded, allRemoved, row); + addValuesWidgets(Tr::tr("Total:"), allTotal, allAdded, allRemoved, row, false); } struct LinkWithColumns @@ -263,7 +275,7 @@ class IssuesWidget : public QScrollArea { public: explicit IssuesWidget(QWidget *parent = nullptr); - void updateUi(); + void updateUi(const QString &kind); const std::optional currentTableInfo() const { return m_currentTableInfo; } IssueListSearch searchFromUi() const; @@ -378,7 +390,7 @@ IssuesWidget::IssuesWidget(QWidget *parent) setWidgetResizable(true); } -void IssuesWidget::updateUi() +void IssuesWidget::updateUi(const QString &kind) { setFiltersEnabled(false); const std::optional projectInfo = Internal::projectInfo(); @@ -392,11 +404,30 @@ void IssuesWidget::updateUi() setFiltersEnabled(true); // avoid refetching existing data - if (!m_currentPrefix.isEmpty() || m_issuesModel->rowCount()) + if (kind.isEmpty() && (!m_currentPrefix.isEmpty() || m_issuesModel->rowCount())) return; - if (info.issueKinds.size()) - m_currentPrefix = info.issueKinds.front().prefix; + if (!kind.isEmpty()) { + const int index + = Utils::indexOf( info.issueKinds, [kind](const Dto::IssueKindInfoDto &dto) { + return dto.prefix == kind; }); + if (index != -1) { + m_currentPrefix = kind; + auto kindButton = m_typesButtonGroup->button(index + 1); + if (QTC_GUARD(kindButton)) + kindButton->setChecked(true); + // reset filters - if kind is not empty we get triggered from dashboard overview + if (!m_userNames.isEmpty()) + m_ownerFilter->setCurrentIndex(0); + m_pathGlobFilter->clear(); + if (m_versionDates.size() > 1) { + m_versionStart->setCurrentIndex(m_versionDates.count() - 1); + m_versionEnd->setCurrentIndex(0); + } + } + } + if (m_currentPrefix.isEmpty()) + m_currentPrefix = info.issueKinds.size() ? info.issueKinds.front().prefix : QString{}; fetchTable(); } @@ -767,12 +798,7 @@ public: m_showIssues->setIcon(Icons::ZOOM_TOOLBAR.icon()); m_showIssues->setToolTip(Tr::tr("Search for issues")); m_showIssues->setCheckable(true); - connect(m_showIssues, &QToolButton::clicked, this, [this] { - QTC_ASSERT(m_outputWidget, return); - m_outputWidget->setCurrentIndex(1); - if (auto issues = static_cast(m_outputWidget->widget(1))) - issues->updateUi(); - }); + connect(m_showIssues, &QToolButton::clicked, this, [this] { handleShowIssues({}); }); auto *butonGroup = new QButtonGroup(this); butonGroup->addButton(m_showDashboard); butonGroup->addButton(m_showIssues); @@ -814,6 +840,14 @@ public: void goToNext() final {} void goToPrev() final {} + void handleShowIssues(const QString &kind) + { + QTC_ASSERT(m_outputWidget, return); + m_outputWidget->setCurrentIndex(1); + if (auto issues = static_cast(m_outputWidget->widget(1))) + issues->updateUi(kind); + } + void updateDashboard() { if (auto dashboard = static_cast(m_outputWidget->widget(0))) { @@ -897,4 +931,10 @@ static bool issueListContextMenuEvent(const ItemViewEvent &ev) return theAxivionOutputPane->handleContextMenu(issue, ev); } +void showIssuesFromDashboard(const QString &kind) +{ + QTC_ASSERT(theAxivionOutputPane, return); + theAxivionOutputPane->handleShowIssues(kind); +} + } // Axivion::Internal