From 5d5e354b696060e2d65f894a80c7fd3946824602 Mon Sep 17 00:00:00 2001 From: Sandor Kertesz Date: Wed, 20 Mar 2024 16:40:41 +0000 Subject: [PATCH] Customise aviso rendering --- .gitignore | 1 + Viewer/ecflowUI/images/aviso.svg | 257 +++++++++++++++++++++++ Viewer/ecflowUI/src/NodeViewDelegate.cpp | 21 +- Viewer/ecflowUI/src/NodeViewDelegate.hpp | 1 + Viewer/ecflowUI/src/viewer.qrc | 1 + Viewer/libViewer/src/IconProvider.cpp | 30 +++ Viewer/libViewer/src/IconProvider.hpp | 3 + 7 files changed, 311 insertions(+), 3 deletions(-) create mode 100644 Viewer/ecflowUI/images/aviso.svg diff --git a/.gitignore b/.gitignore index 0f3f8cba4..3d7b81afa 100644 --- a/.gitignore +++ b/.gitignore @@ -21,6 +21,7 @@ ecflow_*.files ecflow_*.cflags ecflow_*.cxxflags CMakeLists.txt.user +.qtc_clangd/ #vscode .vscode diff --git a/Viewer/ecflowUI/images/aviso.svg b/Viewer/ecflowUI/images/aviso.svg new file mode 100644 index 000000000..131de3cbb --- /dev/null +++ b/Viewer/ecflowUI/images/aviso.svg @@ -0,0 +1,257 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + ECMWF + + + en-GB + + + Metview icon + + + Metview icon + + + + + + + + f + A + + F + + + + + + + + diff --git a/Viewer/ecflowUI/src/NodeViewDelegate.cpp b/Viewer/ecflowUI/src/NodeViewDelegate.cpp index 6a6691207..9bfa6feda 100644 --- a/Viewer/ecflowUI/src/NodeViewDelegate.cpp +++ b/Viewer/ecflowUI/src/NodeViewDelegate.cpp @@ -10,6 +10,8 @@ #include "NodeViewDelegate.hpp" +#include + #include #include #include @@ -84,6 +86,8 @@ NodeViewDelegate::NodeViewDelegate(QWidget* parent) : QStyledItemDelegate(parent errPix_ = QPixmap(QPixmap::fromImage(img)); } + avisoPixId_ = IconProvider::add(":/viewer/aviso.svg", "aviso"); + grad_.setCoordinateMode(QGradient::ObjectBoundingMode); grad_.setStart(0, 0); grad_.setFinalStop(0, 1); @@ -666,13 +670,14 @@ void NodeViewDelegate::renderAviso(QPainter* painter, QStringList data, const QStyleOptionViewItem& option, QSize& size) const { + int totalWidth = 0; size = QSize(totalWidth, attrBox_->fullHeight); if (data.count() < 2) return; - QString name = data.at(1) + ":"; + QString name = data.at(1); // + ":"; QString val; if (data.count() > 2) val = data.at(2); @@ -688,6 +693,7 @@ void NodeViewDelegate::renderAviso(QPainter* painter, int currentRight = contRect.x(); int multiCnt = val.count('\n'); + QRect avisoRect; QRect nameRect; QRect valRect, valRestRect; @@ -697,11 +703,16 @@ void NodeViewDelegate::renderAviso(QPainter* painter, QString valFirst, valRest; QString full; + auto avisoPix = IconProvider::pixmapToHeight(avisoPixId_, contRect.height()); + avisoRect = contRect.adjusted(attrBox_->leftPadding, 0, 0, 0); + avisoRect.setWidth(avisoPix.width()); + if (multiCnt == 0) { // The text rectangle QFontMetrics fm(nameFont); int nameWidth = ViewerUtil::textWidth(fm, name); - nameRect = contRect.adjusted(attrBox_->leftPadding, 0, 0, 0); + nameRect = contRect; + nameRect.setX(avisoRect.x() + avisoRect.width() + attrBox_->spacing); nameRect.setWidth(nameWidth); // The value rectangle @@ -718,7 +729,8 @@ void NodeViewDelegate::renderAviso(QPainter* painter, // The text rectangle QFontMetrics fm(nameFont); int nameWidth = ViewerUtil::textWidth(fm, name); - nameRect = contRect.adjusted(attrBox_->leftPadding, 0, 0, 0); + nameRect = contRect; + nameRect.setX(avisoRect.x() + avisoRect.width() + attrBox_->spacing); nameRect.setWidth(nameWidth); nameRect.setHeight(attrBox_->height - attrBox_->topPadding - attrBox_->bottomPadding); @@ -781,6 +793,9 @@ void NodeViewDelegate::renderAviso(QPainter* painter, } } + // aviso pixmap + painter->drawPixmap(avisoRect, avisoPix); + // Draw name painter->setPen(fontPen); painter->setFont(nameFont); diff --git a/Viewer/ecflowUI/src/NodeViewDelegate.hpp b/Viewer/ecflowUI/src/NodeViewDelegate.hpp index 2c60c52e1..e36724e46 100644 --- a/Viewer/ecflowUI/src/NodeViewDelegate.hpp +++ b/Viewer/ecflowUI/src/NodeViewDelegate.hpp @@ -246,6 +246,7 @@ class NodeViewDelegate : public QStyledItemDelegate, public VPropertyObserver { QPen holdingTimeFontPen_; QPen holdingDateFontPen_; + int avisoPixId_; int holdingTimePixId_; int holdingDatePixId_; diff --git a/Viewer/ecflowUI/src/viewer.qrc b/Viewer/ecflowUI/src/viewer.qrc index afb1bd856..a28b1b693 100644 --- a/Viewer/ecflowUI/src/viewer.qrc +++ b/Viewer/ecflowUI/src/viewer.qrc @@ -43,6 +43,7 @@ ../images/add_tab.svg ../images/add_variable_column.svg ../images/attribute.svg + ../images/aviso.svg ../images/autoscroll.svg ../images/autoscroll_off.svg ../images/chain.svg diff --git a/Viewer/libViewer/src/IconProvider.cpp b/Viewer/libViewer/src/IconProvider.cpp index 44e6b4ea8..3a04d750e 100644 --- a/Viewer/libViewer/src/IconProvider.cpp +++ b/Viewer/libViewer/src/IconProvider.cpp @@ -63,6 +63,32 @@ QPixmap IconItem::pixmap(int size) { return {}; } + +QPixmap IconItem::pixmapToHeight(int size) { + auto it = pixmapsByHeight_.find(size); + if (it != pixmapsByHeight_.end()) + return it->second; + else { + QPixmap pix; + QImageReader imgR(path_); + if (imgR.canRead()) { + int w = imgR.size().width(); + int h = imgR.size().height(); + float r = static_cast(w)/static_cast(h); + imgR.setScaledSize(QSize(size*r, size)); + QImage img = imgR.read(); + pix = QPixmap::fromImage(img); + } + else { + pix = unknown(size); + } + + pixmapsByHeight_[size] = pix; + return pix; + } + return {}; +} + QPixmap IconItem::unknown(int size) { return unknownIcon.pixmap(size); } @@ -126,6 +152,10 @@ QPixmap IconProvider::pixmap(int id, int size) { return icon(id)->pixmap(size); } +QPixmap IconProvider::pixmapToHeight(int id, int size) { + return icon(id)->pixmapToHeight(size); +} + QPixmap IconProvider::lockPixmap(int size) { return lockIcon.pixmap(size); } diff --git a/Viewer/libViewer/src/IconProvider.hpp b/Viewer/libViewer/src/IconProvider.hpp index 4bca01db1..0e4c7a601 100644 --- a/Viewer/libViewer/src/IconProvider.hpp +++ b/Viewer/libViewer/src/IconProvider.hpp @@ -21,6 +21,7 @@ class IconItem { virtual ~IconItem() = default; QPixmap pixmap(int); + QPixmap pixmapToHeight(int size); int id() const { return id_; } QString path() const { return path_; } @@ -29,6 +30,7 @@ class IconItem { QString path_; std::map pixmaps_; + std::map pixmapsByHeight_; int id_; }; @@ -49,6 +51,7 @@ class IconProvider { static QString path(int id); static QPixmap pixmap(QString name, int size); static QPixmap pixmap(int id, int size); + static QPixmap pixmapToHeight(int id, int size); static QPixmap lockPixmap(int); static QPixmap warningPixmap(int);