┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Penz <[email protected]>2008-11-20 21:50:17 +0000
committerPeter Penz <[email protected]>2008-11-20 21:50:17 +0000
commit2b187ed1ab6918130effd53a36e95d9ad660b0ce (patch)
treed3ea3093117a94fea3672fcf495ff41ca571a884
parentab9fed96187724680f19e706168b8f22d7b46609 (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
-rw-r--r--src/metatextlabel.cpp132
-rw-r--r--src/metatextlabel.h27
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