diff options
| author | Gleb Kasachou <[email protected]> | 2025-06-17 05:58:45 +0000 |
|---|---|---|
| committer | Méven Car <[email protected]> | 2025-06-17 05:58:45 +0000 |
| commit | e0d9f9b9aad9313434597658d38c9b2c18382770 (patch) | |
| tree | a6f9d5cdc054d094f3cb960379877e47698e5063 /src/kitemviews/kstandarditemlistwidget.cpp | |
| parent | 9281664e5b1e492087604264b145b390e8880e81 (diff) | |
Add setting to select filename eliding behavior
Introduces a setting in Content Display Tab that allows to choose how
filenames are truncated when they do not fit in the maximum filename
length, i.e elide.
BUG: 504795
Diffstat (limited to 'src/kitemviews/kstandarditemlistwidget.cpp')
| -rw-r--r-- | src/kitemviews/kstandarditemlistwidget.cpp | 45 |
1 files changed, 40 insertions, 5 deletions
diff --git a/src/kitemviews/kstandarditemlistwidget.cpp b/src/kitemviews/kstandarditemlistwidget.cpp index 566c4dec2..49d2f26bf 100644 --- a/src/kitemviews/kstandarditemlistwidget.cpp +++ b/src/kitemviews/kstandarditemlistwidget.cpp @@ -6,6 +6,7 @@ #include "kstandarditemlistwidget.h" +#include "dolphin_contentdisplaysettings.h" #include "kfileitemlistview.h" #include "private/kfileitemclipboard.h" #include "private/kitemlistroleeditor.h" @@ -1286,6 +1287,31 @@ void KStandardItemListWidget::updateTextsCache() } } +QString KStandardItemListWidget::elideText(QString text, qreal maxWidth) const +{ + if (ContentDisplaySettings::elidingMode() == ContentDisplaySettings::ElidingMode::Middle) { + return m_customizedFontMetrics.elidedText(text, Qt::ElideMiddle, maxWidth); + } + + if (ContentDisplaySettings::elidingMode() == ContentDisplaySettings::ElidingMode::Right) { + qsizetype lastDotPosition = text.lastIndexOf("."); + QString extension = text.mid(lastDotPosition); + + if (m_customizedFontMetrics.horizontalAdvance(QStringLiteral("…") + extension) > maxWidth) { + extension = ""; + lastDotPosition = text.size(); + } + + maxWidth -= m_customizedFontMetrics.horizontalAdvance(extension); + QString leftPart = m_customizedFontMetrics.elidedText(text.left(lastDotPosition), Qt::ElideRight, maxWidth); + + return leftPart + extension; + } + + Q_UNREACHABLE(); + return text; +} + QString KStandardItemListWidget::escapeString(const QString &text) const { QString escaped(text); @@ -1346,7 +1372,7 @@ void KStandardItemListWidget::updateIconsLayoutTextCache() qreal lastLineWidth; do { QString lastTextLine = nameText.mid(line.textStart()); - lastTextLine = m_customizedFontMetrics.elidedText(lastTextLine, Qt::ElideMiddle, elidingWidth); + lastTextLine = elideText(lastTextLine, elidingWidth); const QString elidedText = nameText.left(line.textStart()) + lastTextLine; nameTextInfo->staticText.setText(elidedText); @@ -1394,7 +1420,7 @@ void KStandardItemListWidget::updateIconsLayoutTextCache() textLine.setLineWidth(maxWidth); requiredWidth = textLine.naturalTextWidth(); if (requiredWidth > maxWidth) { - const QString elidedText = m_customizedFontMetrics.elidedText(text, Qt::ElideMiddle, maxWidth); + const QString elidedText = m_customizedFontMetrics.elidedText(text, Qt::ElideRight, maxWidth); textInfo->staticText.setText(elidedText); requiredWidth = m_customizedFontMetrics.horizontalAdvance(elidedText); } else if (role == "rating") { @@ -1446,8 +1472,13 @@ void KStandardItemListWidget::updateCompactLayoutTextCache() qreal requiredWidth = m_customizedFontMetrics.horizontalAdvance(text); if (requiredWidth > maxWidth) { requiredWidth = maxWidth; - const QString elidedText = m_customizedFontMetrics.elidedText(text, Qt::ElideMiddle, maxWidth); - textInfo->staticText.setText(elidedText); + if (role == "text") { + const QString elidedText = elideText(text, maxWidth); + textInfo->staticText.setText(elidedText); + } else { + const QString elidedText = m_customizedFontMetrics.elidedText(text, Qt::ElideRight, maxWidth); + textInfo->staticText.setText(elidedText); + } } textInfo->pos = QPointF(x, y); @@ -1506,7 +1537,11 @@ void KStandardItemListWidget::updateDetailsLayoutTextCache() } if (requiredWidth > availableTextWidth) { - text = m_customizedFontMetrics.elidedText(text, Qt::ElideMiddle, availableTextWidth); + if (isTextRole) { + text = elideText(text, availableTextWidth); + } else { + text = m_customizedFontMetrics.elidedText(text, Qt::ElideRight, availableTextWidth); + } requiredWidth = m_customizedFontMetrics.horizontalAdvance(text); } |
