X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/428a5cacceb9944b0ad803608de663cc84fcdadc..148282e2d856b47ceb191eeef4c834118c8cdffd:/src/metatextlabel.cpp diff --git a/src/metatextlabel.cpp b/src/metatextlabel.cpp index 594c408fc..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) : - QGroupBox(i18nc("@title:group General metadata", "General"), parent), - m_lines(0), - m_layout(0) + QWidget(parent), + m_minimumHeight(0), + m_metaInfos() { + setFont(KGlobalSettings::smallestReadableFont()); } MetaTextLabel::~MetaTextLabel() @@ -39,52 +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->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"