From d023afcb538dfba3ded42fb407836792e8cb2c0a Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Wed, 4 Sep 2024 11:20:50 +0200 Subject: [PATCH] Axivion: Improve handling for invalid filters Change-Id: Ic18a3037e9225016ae73075ce089c21c2f8d2f89 Reviewed-by: Jarek Kobus --- src/plugins/axivion/axivion.qrc | 2 + src/plugins/axivion/axivionoutputpane.cpp | 73 ++++++++++++++-------- src/plugins/axivion/axivionoutputpane.h | 1 + src/plugins/axivion/axivionplugin.cpp | 6 ++ src/plugins/axivion/images/error.png | Bin 0 -> 234 bytes src/plugins/axivion/images/error@2x.png | Bin 0 -> 427 bytes src/tools/icons/qtcreatoricons.svg | 21 +++++++ 7 files changed, 77 insertions(+), 26 deletions(-) create mode 100644 src/plugins/axivion/images/error.png create mode 100644 src/plugins/axivion/images/error@2x.png 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 0000000000000000000000000000000000000000..01fc67a6ce785b111af0623618ec0369f854bafc GIT binary patch literal 234 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4h9AWhA=@@4F(2=jh-%!Ar`%RCvW6sGURc! zl~WIEoW*uz>cj-58w_dT;8vfpK*6~ zC(7yb7FQ`hTYc;*4DRn&r7QMC+T;qo$<-NzJe1omERO&%Gp^lI16_+gisB5N~`8iZw*-8D+=ZJ^V8DDo+FYdhSQ6V?uPWy+XCrzhM lFXWY*zLB3#{@3fBAKAVeXTNy6v?&JU2~Sr)mvv4FO#tm)UJU>M literal 0 HcmV?d00001 diff --git a/src/plugins/axivion/images/error@2x.png b/src/plugins/axivion/images/error@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..e104fa041ca6aa9b9b9dff7be93f220a35d3a48c GIT binary patch literal 427 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4h9AWhJGeJCI$w^B2O2`kch)?r#t!`G2n5n zcev9O$#34m+M%a>koN%-b4Mb#d4uo)&Vry=90~X9gB~m2X1?)H{z}z(KgP0u)~5G2Su`Ad@Ame(&ZLBo_Tk4RcXMy}Z5?`^ zbGPq?-}YhG1y8rjH%v8Ue|0N8wIOWDg(@D6%&!p+8HH`kZt@Ss%O@}w+~<72^ZeOz zW`*e9sqB{48TS|-Y?Zus>(xDpZwyZP92Gn_PIVoWpUuDL>D`@C>!%kN*L6H+ZZ?SS z>{yf5c28@S;X|d+5bfP-+*`KZV!pUtx_djL>BaJ>==KdEubW=%KD*U-#{P~Dn|$Hg zEBCBhP78>I$n#6gd+vMH{?QMmy{0KYh4xxL`^mJ|Hse=KZPJymH-E7lPzq5!yv@<$ g#Zlk?y}}F!#LwC#e5(q!`wNN%Pgg&ebxsLQ03oxyb^rhX literal 0 HcmV?d00001 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" /> + + + +