diff options
Diffstat (limited to 'src/widgets/elidedlabel')
-rw-r--r-- | src/widgets/elidedlabel/elidedlabel.cpp | 52 | ||||
-rw-r--r-- | src/widgets/elidedlabel/elidedlabel.h | 49 |
2 files changed, 101 insertions, 0 deletions
diff --git a/src/widgets/elidedlabel/elidedlabel.cpp b/src/widgets/elidedlabel/elidedlabel.cpp new file mode 100644 index 0000000..e870959 --- /dev/null +++ b/src/widgets/elidedlabel/elidedlabel.cpp @@ -0,0 +1,52 @@ +#include "elidedlabel.h" + +#include <QDebug> +#include <QPainter> +#include <QResizeEvent> +#include <QStyle> + +ElidedLabel::ElidedLabel(QWidget *parent) + : QLabel(parent), m_elide_mode(Qt::ElideRight) { + setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Preferred); +} + +ElidedLabel::ElidedLabel(const QString &txt, QWidget *parent) + : QLabel(txt, parent), m_elide_mode(Qt::ElideRight) { + setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Preferred); +} + +ElidedLabel::ElidedLabel(const QString &txt, Qt::TextElideMode elideMode, + QWidget *parent) + : QLabel(txt, parent), m_elide_mode(elideMode) { + setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Preferred); +} + +void ElidedLabel::setText(const QString &txt) { + QLabel::setText(txt); + cacheElidedText(geometry().width()); + setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Preferred); +} + +void ElidedLabel::cacheElidedText(int w) { + m_cached_elided_text = fontMetrics().elidedText( + text(), m_elide_mode, w, (buddy() == nullptr) ? 0 : Qt::TextShowMnemonic); +} + +void ElidedLabel::resizeEvent(QResizeEvent *e) { + QLabel::resizeEvent(e); + cacheElidedText(e->size().width()); +} + +void ElidedLabel::paintEvent(QPaintEvent *e) { + if (m_elide_mode == Qt::ElideNone) { + QLabel::paintEvent(e); + } else { + QPainter p(this); + p.drawText(0, 0, geometry().width(), geometry().height(), + QStyle::visualAlignment(text().isRightToLeft() ? Qt::RightToLeft + : Qt::LeftToRight, + alignment()) | + ((buddy() == nullptr) ? 0 : Qt::TextShowMnemonic), + m_cached_elided_text); + } +} diff --git a/src/widgets/elidedlabel/elidedlabel.h b/src/widgets/elidedlabel/elidedlabel.h new file mode 100644 index 0000000..7dc610a --- /dev/null +++ b/src/widgets/elidedlabel/elidedlabel.h @@ -0,0 +1,49 @@ +#pragma once +#include <QLabel> +#include <QPainter> +#include <QResizeEvent> +#include <QString> +#include <QFont> + +// A label that elides its text when not enough geometry is available to show all of the text. +// Currently only capable of one-line. +class ElidedLabel : public QLabel { + Q_OBJECT + +private: + Qt::TextElideMode m_elide_mode; + QString m_cached_elided_text; + + +public: + ElidedLabel(QWidget* parent = NULL); + ElidedLabel(const QString& txt, QWidget* parent = NULL); + ElidedLabel(const QString& txt, Qt::TextElideMode elideMode = Qt::ElideRight, QWidget* parent = NULL); + +public: + // Set the elide mode used for displaying text. + inline void setElideMode(Qt::TextElideMode elideMode) { + m_elide_mode = elideMode; + updateGeometry(); + } + + // Get the elide mode currently used to display text. + inline Qt::TextElideMode elideMode() const { + return m_elide_mode; + } + + + +public: // QLabel overrides + void setText(const QString&); // note: not virtual so no polymorphism ... + + +protected: // QLabel overrides + virtual void paintEvent(QPaintEvent*) override; + virtual void resizeEvent(QResizeEvent*) override; + +protected: + // Cache the elided text so as to not recompute it every paint event + void cacheElidedText(int w); + +}; |