diff options
| author | Peter Penz <[email protected]> | 2008-11-20 21:50:17 +0000 |
|---|---|---|
| committer | Peter Penz <[email protected]> | 2008-11-20 21:50:17 +0000 |
| commit | 2b187ed1ab6918130effd53a36e95d9ad660b0ce (patch) | |
| tree | d3ea3093117a94fea3672fcf495ff41ca571a884 /src | |
| parent | ab9fed96187724680f19e706168b8f22d7b46609 (diff) | |
assure that the meta information labels get not clipped vertically when using larger fonts
BUG: 168505
svn path=/trunk/KDE/kdebase/apps/; revision=887030
Diffstat (limited to 'src')
| -rw-r--r-- | src/metatextlabel.cpp | 132 | ||||
| -rw-r--r-- | src/metatextlabel.h | 27 |
2 files changed, 109 insertions, 50 deletions
diff --git a/src/metatextlabel.cpp b/src/metatextlabel.cpp index f62a9a6a1..66f12db90 100644 --- a/src/metatextlabel.cpp +++ b/src/metatextlabel.cpp @@ -21,16 +21,18 @@ #include <kglobalsettings.h> #include <klocale.h> -#include <kvbox.h> -#include <QHBoxLayout> -#include <QLabel> +#include <QPainter> +#include <QTextLayout> +#include <QTextLine> +#include <kdebug.h> MetaTextLabel::MetaTextLabel(QWidget* parent) : QWidget(parent), - m_lines(0), - m_layout(0) + m_minimumHeight(0), + m_metaInfos() { + setFont(KGlobalSettings::smallestReadableFont()); } MetaTextLabel::~MetaTextLabel() @@ -39,53 +41,95 @@ MetaTextLabel::~MetaTextLabel() void MetaTextLabel::clear() { - if (m_layout != 0) { - m_layout->removeWidget(m_lines); - } - - delete m_lines; - m_lines = 0; - - delete m_layout; - m_layout = 0; + m_minimumHeight = 0; + m_metaInfos.clear(); + update(); } void MetaTextLabel::add(const QString& labelText, const QString& infoText) { - if (m_lines == 0) { - Q_ASSERT(m_layout == 0); - - m_lines = new KVBox(this); - m_layout = new QHBoxLayout(); - m_layout->addWidget(m_lines); - setLayout(m_layout); + MetaInfo metaInfo; + metaInfo.label = labelText; + metaInfo.info = infoText; + + m_metaInfos.append(metaInfo); + + m_minimumHeight += requiredHeight(metaInfo); + setMinimumHeight(m_minimumHeight); + + update(); +} - m_lines->show(); +void MetaTextLabel::paintEvent(QPaintEvent* event) +{ + QWidget::paintEvent(event); + + QPainter painter(this); + + const QColor infoColor = palette().color(QPalette::Foreground); + QColor labelColor = infoColor; + labelColor.setAlpha(128); + + int y = 0; + const int infoWidth = width() / 2; + const int labelWidth = infoWidth - 2 * Spacing; + const int infoX = infoWidth; + const int maxHeight = fontMetrics().height() * 5; + + QRect boundingRect; + foreach (const MetaInfo& metaInfo, m_metaInfos) { + // draw label (e. g. "Date:") + painter.setPen(labelColor); + painter.drawText(0, y, labelWidth, maxHeight, + Qt::AlignTop | Qt::AlignRight | Qt::TextWordWrap, + metaInfo.label); + + // draw information (e. g. "2008-11-09 20:12") + painter.setPen(infoColor); + painter.drawText(infoX, y, infoWidth, maxHeight, + Qt::AlignTop | Qt::AlignLeft | Qt::TextWordWrap, + metaInfo.info, + &boundingRect); + + y += boundingRect.height() + Spacing; } +} - QWidget* line = new QWidget(m_lines); - - QLabel* label = new QLabel(labelText, line); - label->setFont(KGlobalSettings::smallestReadableFont()); - label->setAlignment(Qt::AlignRight | Qt::AlignTop); - - QPalette palette = label->palette(); - QColor foreground = palette.color(QPalette::Foreground); - foreground.setAlpha(128); - palette.setColor(QPalette::Foreground, foreground); - label->setPalette(palette); - - QLabel* info = new QLabel(infoText, line); - info->setFont(KGlobalSettings::smallestReadableFont()); - info->setAlignment(Qt::AlignLeft | Qt::AlignTop); - info->setWordWrap(true); - - QHBoxLayout* layout = new QHBoxLayout(line); - layout->setMargin(2); - layout->addWidget(label, 50); - layout->addWidget(info, 50); +void MetaTextLabel::resizeEvent(QResizeEvent* event) +{ + QWidget::resizeEvent(event); + + m_minimumHeight = 0; + foreach (const MetaInfo& metaInfo, m_metaInfos) { + m_minimumHeight += requiredHeight(metaInfo); + } + setMinimumHeight(m_minimumHeight); +} - line->show(); +int MetaTextLabel::requiredHeight(const MetaInfo& metaInfo) const +{ + QTextOption textOption; + textOption.setWrapMode(QTextOption::WrapAtWordBoundaryOrAnywhere); + + qreal height = 0; + const int leading = fontMetrics().leading(); + const int availableWidth = width() / 2; + + QTextLayout textLayout(metaInfo.info); + textLayout.setFont(font()); + textLayout.setTextOption(textOption); + + textLayout.beginLayout(); + QTextLine line = textLayout.createLine(); + while (line.isValid()) { + line.setLineWidth(availableWidth); + height += leading; + height += line.height(); + line = textLayout.createLine(); + } + textLayout.endLayout(); + + return static_cast<int>(height) + Spacing; } #include "metatextlabel.moc" diff --git a/src/metatextlabel.h b/src/metatextlabel.h index f4b4ee8e1..f70d29d8e 100644 --- a/src/metatextlabel.h +++ b/src/metatextlabel.h @@ -22,9 +22,6 @@ #include <QWidget> -class KVBox; -class QHBoxLayout; - /** * @brief Displays general meta in several lines. * @@ -35,15 +32,33 @@ class MetaTextLabel : public QWidget Q_OBJECT public: - MetaTextLabel(QWidget* parent = 0); + explicit MetaTextLabel(QWidget* parent = 0); virtual ~MetaTextLabel(); void clear(); void add(const QString& labelText, const QString& infoText); + +protected: + virtual void paintEvent(QPaintEvent* event); + virtual void resizeEvent(QResizeEvent* event); private: - KVBox* m_lines; - QHBoxLayout* m_layout; + enum { Spacing = 2 }; + + struct MetaInfo + { + QString label; + QString info; + }; + + int m_minimumHeight; + QList<MetaInfo> m_metaInfos; + + /** + * Returns the required height in pixels for \a metaInfo to + * fit into the available width of the widget. + */ + int requiredHeight(const MetaInfo& metaInfo) const; }; #endif |
