From af3c3a43281db7d7b6a3045c94836a746b031f51 Mon Sep 17 00:00:00 2001 From: Peter Penz Date: Sun, 2 Oct 2011 17:33:41 +0200 Subject: [PATCH] Elide the texts if the user shrinks the column-widths --- src/kitemviews/kfileitemlistwidget.cpp | 37 ++++++++++++++++++++++---- src/kitemviews/kitemlistheader.cpp | 2 +- src/kitemviews/kitemlistview.cpp | 9 ++++--- 3 files changed, 38 insertions(+), 10 deletions(-) diff --git a/src/kitemviews/kfileitemlistwidget.cpp b/src/kitemviews/kfileitemlistwidget.cpp index 7cf1b4df1..3d4728521 100644 --- a/src/kitemviews/kfileitemlistwidget.cpp +++ b/src/kitemviews/kfileitemlistwidget.cpp @@ -119,12 +119,29 @@ void KFileItemListWidget::paint(QPainter* painter, const QStyleOptionGraphicsIte painter->setPen(textColor()); painter->drawStaticText(m_textPos[Name], m_text[Name]); + bool clipAdditionalInfoBounds = false; + if (m_layout == DetailsLayout) { + // Prevent a possible overlapping of the additional-information texts + // with the icon. This can happen if the user has minimized the width + // of the name-column to a very small value. + const qreal minX = m_pixmapPos.x() + m_pixmap.width() + 4 * itemListStyleOption.margin; + if (m_textPos[Name + 1].x() < minX) { + clipAdditionalInfoBounds = true; + painter->save(); + painter->setClipRect(minX, 0, size().width() - minX, size().height(), Qt::IntersectClip); + } + } + painter->setPen(m_additionalInfoTextColor); painter->setFont(itemListStyleOption.font); for (int i = Name + 1; i < TextIdCount; ++i) { painter->drawStaticText(m_textPos[i], m_text[i]); } + if (clipAdditionalInfoBounds) { + painter->restore(); + } + #ifdef KFILEITEMLISTWIDGET_DEBUG painter->setPen(Qt::red); painter->setBrush(Qt::NoBrush); @@ -631,13 +648,23 @@ void KFileItemListWidget::updateDetailsLayoutTextCache() foreach (const QByteArray& role, m_sortedVisibleRoles) { const TextId textId = roleTextId(role); - const QString text = roleText(role, values); - m_text[textId].setText(text); - - const qreal requiredWidth = option.fontMetrics.width(text); - m_textPos[textId] = QPointF(x + columnMargin, y); + QString text = roleText(role, values); + // Elide the text in case it does not fit into the available column-width + qreal requiredWidth = option.fontMetrics.width(text); const qreal columnWidth = visibleRolesSizes().value(role, QSizeF(0, 0)).width(); + qreal availableTextWidth = columnWidth - 2 * columnMargin; + if (textId == Name) { + availableTextWidth -= firstColumnInc; + } + + if (requiredWidth > availableTextWidth) { + text = option.fontMetrics.elidedText(text, Qt::ElideRight, availableTextWidth); + requiredWidth = option.fontMetrics.width(text); + } + + m_text[textId].setText(text); + m_textPos[textId] = QPointF(x + columnMargin, y); x += columnWidth; switch (textId) { diff --git a/src/kitemviews/kitemlistheader.cpp b/src/kitemviews/kitemlistheader.cpp index 09b9bf08f..f9b976369 100644 --- a/src/kitemviews/kitemlistheader.cpp +++ b/src/kitemviews/kitemlistheader.cpp @@ -337,7 +337,7 @@ bool KItemListHeader::isAboveRoleGrip(const QPointF& pos, int roleIndex) const qreal KItemListHeader::minimumRoleWidth() const { QFontMetricsF fontMetrics(font()); - return fontMetrics.averageCharWidth() * 5; + return fontMetrics.averageCharWidth() * 8; } #include "kitemlistheader_p.moc" diff --git a/src/kitemviews/kitemlistview.cpp b/src/kitemviews/kitemlistview.cpp index 83008518e..612b6fd65 100644 --- a/src/kitemviews/kitemlistview.cpp +++ b/src/kitemviews/kitemlistview.cpp @@ -227,16 +227,17 @@ void KItemListView::setVisibleRoles(const QList& roles) m_sizeHintResolver->clearCache(); m_layouter->markAsDirty(); - onVisibleRolesChanged(roles, previousRoles); - - updateVisibleRolesSizes(); - updateLayout(); if (m_header) { m_header->setVisibleRoles(roles); m_header->setVisibleRolesWidths(headerRolesWidths()); m_useHeaderWidths = false; } + + updateVisibleRolesSizes(); + updateLayout(); + + onVisibleRolesChanged(roles, previousRoles); } QList KItemListView::visibleRoles() const -- 2.47.3