diff --git a/src/plugins/axivion/axivion.qrc b/src/plugins/axivion/axivion.qrc index 96fafb01dd9..3b730d38c34 100644 --- a/src/plugins/axivion/axivion.qrc +++ b/src/plugins/axivion/axivion.qrc @@ -14,6 +14,8 @@ images/button-MV@2x.png images/button-SV.png images/button-SV@2x.png + images/error.png + images/error@2x.png images/nodata.png images/nodata@2x.png images/sortAsc.png diff --git a/src/plugins/axivion/axivionoutputpane.cpp b/src/plugins/axivion/axivionoutputpane.cpp index b6133fd4a58..5cb9ddc9e31 100644 --- a/src/plugins/axivion/axivionoutputpane.cpp +++ b/src/plugins/axivion/axivionoutputpane.cpp @@ -136,6 +136,8 @@ public: const std::optional currentTableInfo() const { return m_currentTableInfo; } IssueListSearch searchFromUi() const; + + void showOverlay(const QString &errorMessage = {}); private: void updateTable(); void addIssues(const Dto::IssueTableDto &dto, int startRow); @@ -145,8 +147,7 @@ private: void fetchTable(); void fetchIssues(const IssueListSearch &search); void onFetchRequested(int startRow, int limit); - void showNoDataOverlay(); - void hideNoDataOverlay(); + void hideOverlay(); QString m_currentPrefix; QString m_currentProject; @@ -168,7 +169,7 @@ private: QStringList m_userNames; QStringList m_versionDates; TaskTreeRunner m_taskTreeRunner; - OverlayWidget *m_noDataOverlay = nullptr; + OverlayWidget *m_overlay = nullptr; }; IssuesWidget::IssuesWidget(QWidget *parent) @@ -436,7 +437,7 @@ void IssuesWidget::addIssues(const Dto::IssueTableDto &dto, int startRow) } m_issuesModel->setItems(items); if (items.isEmpty() && m_totalRowCount == 0) - showNoDataOverlay(); + showOverlay(); } void IssuesWidget::onSearchParameterChanged() @@ -611,7 +612,7 @@ void IssuesWidget::fetchTable() void IssuesWidget::fetchIssues(const IssueListSearch &search) { - hideNoDataOverlay(); + hideOverlay(); const auto issuesHandler = [this, startRow = search.offset](const Dto::IssueTableDto &dto) { addIssues(dto, startRow); }; @@ -631,33 +632,40 @@ void IssuesWidget::onFetchRequested(int startRow, int limit) fetchIssues(search); } -void IssuesWidget::showNoDataOverlay() +void IssuesWidget::showOverlay(const QString &errorMessage) { - if (!m_noDataOverlay) { + if (!m_overlay) { QTC_ASSERT(m_issuesView, return); - m_noDataOverlay = new OverlayWidget(this); - m_noDataOverlay->setPaintFunction([](QWidget *that, QPainter &p, QPaintEvent *) { - static const QIcon icon = Icon({{":/axivion/images/nodata.png", - Theme::IconsDisabledColor}}, - Utils::Icon::Tint).icon(); - QRect iconRect(0, 0, 32, 32); - iconRect.moveCenter(that->rect().center()); - icon.paint(&p, iconRect); - p.save(); - p.setPen(Utils::creatorColor(Theme::TextColorDisabled)); - p.drawText(iconRect.bottomRight() + QPoint{10, p.fontMetrics().height() / 2 - 16}, - Tr::tr("No Data")); - p.restore(); - }); - m_noDataOverlay->attachToWidget(m_issuesView); + m_overlay = new OverlayWidget(this); + m_overlay->attachToWidget(m_issuesView); } - m_noDataOverlay->show(); + + m_overlay->setPaintFunction([errorMessage](QWidget *that, QPainter &p, QPaintEvent *) { + static const QIcon noData = Icon({{":/axivion/images/nodata.png", Theme::IconsDisabledColor}}, + Utils::Icon::Tint).icon(); + static const QIcon error = Icon({{":/axivion/images/error.png", Theme::IconsErrorColor}}, + Utils::Icon::Tint).icon(); + QRect iconRect(0, 0, 32, 32); + iconRect.moveCenter(that->rect().center()); + if (errorMessage.isEmpty()) + noData.paint(&p, iconRect); + else + error.paint(&p, iconRect); + p.save(); + p.setPen(Utils::creatorColor(Theme::TextColorDisabled)); + const QFontMetrics &fm = p.fontMetrics(); + p.drawText(iconRect.bottomRight() + QPoint{10, fm.height() / 2 - 16 - fm.descent()}, + errorMessage.isEmpty() ? Tr::tr("No Data") : errorMessage); + p.restore(); + }); + + m_overlay->show(); } -void IssuesWidget::hideNoDataOverlay() +void IssuesWidget::hideOverlay() { - if (m_noDataOverlay) - m_noDataOverlay->hide(); + if (m_overlay) + m_overlay->hide(); } class AxivionOutputPane final : public IOutputPane @@ -736,6 +744,13 @@ public: issues->updateUi(kind); } + void handleShowFilterException(const QString &errorMessage) + { + QTC_ASSERT(m_outputWidget, return); + if (auto issues = static_cast(m_outputWidget->widget(0))) + issues->showOverlay(errorMessage); + } + bool handleContextMenu(const QString &issue, const ItemViewEvent &e) { auto issues = static_cast(m_outputWidget->widget(0)); @@ -810,4 +825,10 @@ static bool issueListContextMenuEvent(const ItemViewEvent &ev) return theAxivionOutputPane->handleContextMenu(issue, ev); } +void showFilterException(const QString &errorMessage) +{ + QTC_ASSERT(theAxivionOutputPane, return); + theAxivionOutputPane->handleShowFilterException(errorMessage); +} + } // Axivion::Internal diff --git a/src/plugins/axivion/axivionoutputpane.h b/src/plugins/axivion/axivionoutputpane.h index a13b125c183..6e8f34df4da 100644 --- a/src/plugins/axivion/axivionoutputpane.h +++ b/src/plugins/axivion/axivionoutputpane.h @@ -9,5 +9,6 @@ namespace Axivion::Internal { void setupAxivionOutputPane(QObject *guard); void updateDashboard(); +void showFilterException(const QString &errorMessage); } // Axivion::Internal diff --git a/src/plugins/axivion/axivionplugin.cpp b/src/plugins/axivion/axivionplugin.cpp index e82b3f37099..345c328097c 100644 --- a/src/plugins/axivion/axivionplugin.cpp +++ b/src/plugins/axivion/axivionplugin.cpp @@ -501,6 +501,12 @@ static Group dtoRecipe(const Storage> &dtoStorage) } } + if (statusCode == 400 && error->type == "InvalidFilterException" + && !error->message.isEmpty()) { + // handle error.. + showFilterException(error->message); + return DoneResult::Error; + } errorString = Error(DashboardError(reply->url(), statusCode, reply->attribute(QNetworkRequest::HttpReasonPhraseAttribute).toString(), *error)).message(); diff --git a/src/plugins/axivion/images/error.png b/src/plugins/axivion/images/error.png new file mode 100644 index 00000000000..01fc67a6ce7 Binary files /dev/null and b/src/plugins/axivion/images/error.png differ diff --git a/src/plugins/axivion/images/error@2x.png b/src/plugins/axivion/images/error@2x.png new file mode 100644 index 00000000000..e104fa041ca Binary files /dev/null and b/src/plugins/axivion/images/error@2x.png differ diff --git a/src/tools/icons/qtcreatoricons.svg b/src/tools/icons/qtcreatoricons.svg index d816b3da3de..3144f1e2a39 100644 --- a/src/tools/icons/qtcreatoricons.svg +++ b/src/tools/icons/qtcreatoricons.svg @@ -4130,6 +4130,27 @@ sodipodi:nodetypes="ccccccc" /> + + + +