From 2b187ed1ab6918130effd53a36e95d9ad660b0ce Mon Sep 17 00:00:00 2001 From: Peter Penz Date: Thu, 20 Nov 2008 21:50:17 +0000 Subject: [PATCH] assure that the meta information labels get not clipped vertically when using larger fonts BUG: 168505 svn path=/trunk/KDE/kdebase/apps/; revision=887030 --- src/metatextlabel.cpp | 132 ++++++++++++++++++++++++++++-------------- 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 #include -#include -#include -#include +#include +#include +#include +#include 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(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 -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 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 -- 2.47.3