From bcfe2bc25aefcae29598a7376b130614cdf00e10 Mon Sep 17 00:00:00 2001 From: Marcus Tillmanns Date: Wed, 6 Apr 2022 14:45:34 +0200 Subject: [PATCH] utils: Add additional tooltip to ElidingLabel In case you want to set a real Tooltip for an eliding label Added tests in tst_manual_widgets_infolabel Change-Id: I72bcbf672415ce439c14e260e364fcd2f85fc733 Reviewed-by: Eike Ziller --- src/libs/utils/elidinglabel.cpp | 42 +++++++++++++++++-- src/libs/utils/elidinglabel.h | 11 +++++ .../tst_manual_widgets_infolabel.cpp | 34 +++++++++++---- 3 files changed, 77 insertions(+), 10 deletions(-) diff --git a/src/libs/utils/elidinglabel.cpp b/src/libs/utils/elidinglabel.cpp index 24299bd8cc3..4d4eebfefae 100644 --- a/src/libs/utils/elidinglabel.cpp +++ b/src/libs/utils/elidinglabel.cpp @@ -57,7 +57,7 @@ void ElidingLabel::setElideMode(const Qt::TextElideMode &elideMode) { m_elideMode = elideMode; if (elideMode == Qt::ElideNone) - setToolTip({}); + updateToolTip({}); setSizePolicy(QSizePolicy( m_elideMode == Qt::ElideNone ? QSizePolicy::Preferred : QSizePolicy::Ignored, @@ -66,10 +66,21 @@ void ElidingLabel::setElideMode(const Qt::TextElideMode &elideMode) update(); } +QString ElidingLabel::additionalToolTip() +{ + return m_additionalToolTip; +} + +void ElidingLabel::setAdditionalToolTip(const QString &additionalToolTip) +{ + m_additionalToolTip = additionalToolTip; +} + void ElidingLabel::paintEvent(QPaintEvent *) { if (m_elideMode == Qt::ElideNone) { QLabel::paintEvent(nullptr); + updateToolTip({}); return; } @@ -78,10 +89,10 @@ void ElidingLabel::paintEvent(QPaintEvent *) QFontMetrics fm = fontMetrics(); QString txt = text(); if (txt.length() > 4 && fm.horizontalAdvance(txt) > contents.width()) { - setToolTip(txt); + updateToolTip(txt); txt = fm.elidedText(txt, m_elideMode, contents.width()); } else { - setToolTip(QString()); + updateToolTip(QString()); } int flags = QStyle::visualAlignment(layoutDirection(), alignment()) | Qt::TextSingleLine; @@ -90,4 +101,29 @@ void ElidingLabel::paintEvent(QPaintEvent *) painter.drawText(contents, flags, txt); } +void ElidingLabel::updateToolTip(const QString &elidedText) +{ + if (m_additionalToolTip.isEmpty()) { + setToolTip(elidedText); + return; + } + + if (elidedText.isEmpty()) { + setToolTip(m_additionalToolTip); + return; + } + + setToolTip(elidedText + m_additionalToolTipSeparator + m_additionalToolTip); +} + +QString ElidingLabel::additionalToolTipSeparator() const +{ + return m_additionalToolTipSeparator; +} + +void ElidingLabel::setAdditionalToolTipSeparator(const QString &newAdditionalToolTipSeparator) +{ + m_additionalToolTipSeparator = newAdditionalToolTipSeparator; +} + } // namespace Utils diff --git a/src/libs/utils/elidinglabel.h b/src/libs/utils/elidinglabel.h index 6a8bd231954..936727be703 100644 --- a/src/libs/utils/elidinglabel.h +++ b/src/libs/utils/elidinglabel.h @@ -34,6 +34,8 @@ class QTCREATOR_UTILS_EXPORT ElidingLabel : public QLabel { Q_OBJECT Q_PROPERTY(Qt::TextElideMode elideMode READ elideMode WRITE setElideMode DESIGNABLE true) + Q_PROPERTY(QString additionalToolTip READ additionalToolTip WRITE setAdditionalToolTip DESIGNABLE true) + Q_PROPERTY(QString additionalToolTipSeparator READ additionalToolTipSeparator WRITE setAdditionalToolTipSeparator DESIGNABLE true) public: explicit ElidingLabel(QWidget *parent = nullptr); @@ -42,11 +44,20 @@ public: Qt::TextElideMode elideMode() const; void setElideMode(const Qt::TextElideMode &elideMode); + QString additionalToolTip(); + void setAdditionalToolTip(const QString& additionalToolTip); + + QString additionalToolTipSeparator() const; + void setAdditionalToolTipSeparator(const QString &newAdditionalToolTipSeparator); + protected: void paintEvent(QPaintEvent *event) override; + void updateToolTip(const QString& elidedText); private: Qt::TextElideMode m_elideMode; + QString m_additionalToolTip; + QString m_additionalToolTipSeparator{"\n\n"}; }; } // namespace Utils diff --git a/tests/manual/widgets/infolabel/tst_manual_widgets_infolabel.cpp b/tests/manual/widgets/infolabel/tst_manual_widgets_infolabel.cpp index 67e406c5884..803125fc48c 100644 --- a/tests/manual/widgets/infolabel/tst_manual_widgets_infolabel.cpp +++ b/tests/manual/widgets/infolabel/tst_manual_widgets_infolabel.cpp @@ -54,13 +54,15 @@ int main(int argc, char *argv[]) const static struct { const InfoLabel::InfoType type; const char *text; + const char *tooltip; + const char *tooltipSeparator; } labels[] = { - {InfoLabel::Information, "Information"}, - {InfoLabel::Warning, "Warning"}, - {InfoLabel::Error, "Error"}, - {InfoLabel::Ok, "Ok"}, - {InfoLabel::NotOk, "NotOk"}, - {InfoLabel::None, "None"}, + {InfoLabel::Information, "Information", "This is an informative Tooltip for you", "\n\n"}, + {InfoLabel::Warning, "Warning", "This is a warning Tooltip for you", " - "}, + {InfoLabel::Error, "Error", "This is an erroneous Tooltip for you", " | "}, + {InfoLabel::Ok, "Ok", "This is an ok Tooltip for you", " :) "}, + {InfoLabel::NotOk, "NotOk", "This Tooltip is just not ok", ""}, + {InfoLabel::None, "None", "", "----"}, }; int gridRow = 0; @@ -72,6 +74,8 @@ int main(int argc, char *argv[]) + QLatin1String(enabled ? "" : " (disabled)"), label.type); infoLabel->setEnabled(enabled); infoLabel->setFilled(filled); + infoLabel->setAdditionalToolTip(label.tooltip); + infoLabel->setAdditionalToolTipSeparator(label.tooltipSeparator); variationsLayout->addWidget(infoLabel, gridRow, enabled ? 0 : 1); } gridRow++; @@ -102,11 +106,27 @@ int main(int argc, char *argv[]) "ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation " "ullamco laboris nisi ut aliquid ex ea commodi consequat."; - mainLayout->addWidget(new Utils::InfoLabel("Qt::ElideRight: " + lorem, InfoLabel::Information)); + auto elideRight = new Utils::InfoLabel("Qt::ElideRight: " + lorem, InfoLabel::Information); + elideRight->setAdditionalToolTip("This control will elide the right side and show an Information Icon to its left. The Elided text will be separated from this text by two \\n"); + mainLayout->addWidget(elideRight); + + auto elideLeft = new Utils::InfoLabel("Qt::ElideLeft: " + lorem, InfoLabel::Warning); + elideLeft->setElideMode(Qt::ElideLeft); + elideLeft->setAdditionalToolTip("This control will elide the left side and show a Warning Icon to its left. The Elided text will be separated from this text by \" :) \""); + elideLeft->setAdditionalToolTipSeparator(" :) "); + mainLayout->addWidget(elideLeft); + + auto elideMid= new Utils::InfoLabel("Qt::ElideMiddle: " + lorem, InfoLabel::Ok); + elideMid->setElideMode(Qt::ElideMiddle); + elideMid->setAdditionalToolTip("This control will elide the middle and show an Ok Icon to its left. The Elided text will be separated from this text by \" -> \""); + elideMid->setAdditionalToolTipSeparator(" -> "); + mainLayout->addWidget(elideMid); + auto elideNone = new Utils::InfoLabel("Qt::ElideNone: " + lorem, InfoLabel::Information); elideNone->setElideMode(Qt::ElideNone); elideNone->setWordWrap(true); + elideNone->setAdditionalToolTip("This control is never elided due to setElideMode(Qt::ElideNone) being used"); mainLayout->addWidget(elideNone); widget->resize(350, 500);