]> cloud.milkyroute.net Git - dolphin.git/commitdiff
Add setting to select filename eliding behavior
authorGleb Kasachou <gkosachov99@gmail.com>
Tue, 17 Jun 2025 05:58:45 +0000 (05:58 +0000)
committerMéven Car <meven@kde.org>
Tue, 17 Jun 2025 05:58:45 +0000 (05:58 +0000)
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

src/kitemviews/kstandarditemlistwidget.cpp
src/kitemviews/kstandarditemlistwidget.h
src/settings/dolphin_contentdisplaysettings.kcfg
src/settings/viewmodes/contentdisplaytab.cpp
src/settings/viewmodes/contentdisplaytab.h

index 566c4dec2ad356d909bcbcd725cc564eb7f16231..49d2f26bfd945db1feedf96f15607abe8487541b 100644 (file)
@@ -6,6 +6,7 @@
 
 #include "kstandarditemlistwidget.h"
 
 
 #include "kstandarditemlistwidget.h"
 
+#include "dolphin_contentdisplaysettings.h"
 #include "kfileitemlistview.h"
 #include "private/kfileitemclipboard.h"
 #include "private/kitemlistroleeditor.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);
 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());
                 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);
 
                     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) {
             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") {
                 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;
         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);
         }
 
         textInfo->pos = QPointF(x, y);
@@ -1506,7 +1537,11 @@ void KStandardItemListWidget::updateDetailsLayoutTextCache()
         }
 
         if (requiredWidth > availableTextWidth) {
         }
 
         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);
         }
 
             requiredWidth = m_customizedFontMetrics.horizontalAdvance(text);
         }
 
index 18f86dbcb4934110fc3cf71b54a73140afc0c851..594d3e492806d5aa977da86dc3d3213a3b4aa21d 100644 (file)
@@ -224,6 +224,8 @@ private:
 
     QRectF roleEditingRect(const QByteArray &role) const;
 
 
     QRectF roleEditingRect(const QByteArray &role) const;
 
+    QString elideText(QString text, qreal elidingWidth) const;
+
     /**
      * Escapes text for display purposes.
      *
     /**
      * Escapes text for display purposes.
      *
index 31c6f75df8840c2fdcebf854744e2d0a3381d4ec..6e8f8e9d54b67816650de5110da1e3f106f46816 100644 (file)
             </choices>
             <default>0</default>
         </entry>
             </choices>
             <default>0</default>
         </entry>
+        <entry name="ElidingMode" type="Enum">
+            <label>Eliding Mode</label>
+            <choices name="ElidingMode">
+                <choice name="Right"/>
+                <choice name="Middle"/>
+            </choices>
+            <default>Middle</default>
+        </entry>
     </group>
 </kcfg>
     </group>
 </kcfg>
index c08c4c1919a7c396c814625a36823aff8ac24d3e..939faf7e216618b84f786b09c094157105090a45 100644 (file)
@@ -31,6 +31,8 @@ ContentDisplayTab::ContentDisplayTab(QWidget *parent)
     , m_useSymbolicPermissions(nullptr)
     , m_useNumericPermissions(nullptr)
     , m_useCombinedPermissions(nullptr)
     , m_useSymbolicPermissions(nullptr)
     , m_useNumericPermissions(nullptr)
     , m_useCombinedPermissions(nullptr)
+    , m_elideMiddle(nullptr)
+    , m_elideEnding(nullptr)
 {
     QFormLayout *topLayout = new QFormLayout(this);
 
 {
     QFormLayout *topLayout = new QFormLayout(this);
 
@@ -103,6 +105,16 @@ ContentDisplayTab::ContentDisplayTab(QWidget *parent)
     permissionsFormatGroup->addButton(m_useNumericPermissions);
     permissionsFormatGroup->addButton(m_useCombinedPermissions);
 
     permissionsFormatGroup->addButton(m_useNumericPermissions);
     permissionsFormatGroup->addButton(m_useCombinedPermissions);
 
+    m_elideMiddle = new QRadioButton(i18nc("@option:radio Long file names", "Elide in the middle (e.g. ’Some very… name.txt')"));
+    m_elideEnding = new QRadioButton(i18nc("@option:radio Long file names", "Elide at the end (e.g. ’Some very long….txt')"));
+
+    topLayout->addRow(i18nc("@title:group", "Long file names:"), m_elideMiddle);
+    topLayout->addRow(QString(), m_elideEnding);
+
+    QButtonGroup *elidingModeGroup = new QButtonGroup(this);
+    elidingModeGroup->addButton(m_elideMiddle);
+    elidingModeGroup->addButton(m_elideEnding);
+
 #ifndef Q_OS_WIN
     connect(m_recursiveDirectorySizeLimit, &QSpinBox::valueChanged, this, &SettingsPageBase::changed);
     connect(m_numberOfItems, &QRadioButton::toggled, this, &SettingsPageBase::changed);
 #ifndef Q_OS_WIN
     connect(m_recursiveDirectorySizeLimit, &QSpinBox::valueChanged, this, &SettingsPageBase::changed);
     connect(m_numberOfItems, &QRadioButton::toggled, this, &SettingsPageBase::changed);
@@ -120,6 +132,8 @@ ContentDisplayTab::ContentDisplayTab(QWidget *parent)
     connect(m_naturalSorting, &QRadioButton::toggled, this, &SettingsPageBase::changed);
     connect(m_caseInsensitiveSorting, &QRadioButton::toggled, this, &SettingsPageBase::changed);
     connect(m_caseSensitiveSorting, &QRadioButton::toggled, this, &SettingsPageBase::changed);
     connect(m_naturalSorting, &QRadioButton::toggled, this, &SettingsPageBase::changed);
     connect(m_caseInsensitiveSorting, &QRadioButton::toggled, this, &SettingsPageBase::changed);
     connect(m_caseSensitiveSorting, &QRadioButton::toggled, this, &SettingsPageBase::changed);
+    connect(m_elideMiddle, &QRadioButton::toggled, this, &SettingsPageBase::changed);
+    connect(m_elideEnding, &QRadioButton::toggled, this, &SettingsPageBase::changed);
 
     loadSettings();
 }
 
     loadSettings();
 }
@@ -148,6 +162,11 @@ void ContentDisplayTab::applySettings()
     } else if (m_useCombinedPermissions->isChecked()) {
         settings->setUsePermissionsFormat(ContentDisplaySettings::EnumUsePermissionsFormat::CombinedFormat);
     }
     } else if (m_useCombinedPermissions->isChecked()) {
         settings->setUsePermissionsFormat(ContentDisplaySettings::EnumUsePermissionsFormat::CombinedFormat);
     }
+    if (m_elideMiddle->isChecked()) {
+        settings->setElidingMode(ContentDisplaySettings::ElidingMode::Middle);
+    } else if (m_elideEnding->isChecked()) {
+        settings->setElidingMode(ContentDisplaySettings::ElidingMode::Right);
+    }
     settings->save();
 }
 
     settings->save();
 }
 
@@ -166,6 +185,8 @@ void ContentDisplayTab::loadSettings()
     m_useNumericPermissions->setChecked(settings->usePermissionsFormat() == ContentDisplaySettings::EnumUsePermissionsFormat::NumericFormat);
     m_useCombinedPermissions->setChecked(settings->usePermissionsFormat() == ContentDisplaySettings::EnumUsePermissionsFormat::CombinedFormat);
     loadSortingChoiceSettings();
     m_useNumericPermissions->setChecked(settings->usePermissionsFormat() == ContentDisplaySettings::EnumUsePermissionsFormat::NumericFormat);
     m_useCombinedPermissions->setChecked(settings->usePermissionsFormat() == ContentDisplaySettings::EnumUsePermissionsFormat::CombinedFormat);
     loadSortingChoiceSettings();
+    m_elideMiddle->setChecked(settings->elidingMode() == ContentDisplaySettings::ElidingMode::Middle);
+    m_elideEnding->setChecked(settings->elidingMode() == ContentDisplaySettings::ElidingMode::Right);
 }
 
 void ContentDisplayTab::setSortingChoiceValue()
 }
 
 void ContentDisplayTab::setSortingChoiceValue()
index 05e8414e1f7065b10dc72c28e5afd934e7939e11..2bae5a87c37d5ac91015551279a6977716e56565 100644 (file)
@@ -43,6 +43,8 @@ private:
     QRadioButton *m_useSymbolicPermissions;
     QRadioButton *m_useNumericPermissions;
     QRadioButton *m_useCombinedPermissions;
     QRadioButton *m_useSymbolicPermissions;
     QRadioButton *m_useNumericPermissions;
     QRadioButton *m_useCombinedPermissions;
+    QRadioButton *m_elideMiddle;
+    QRadioButton *m_elideEnding;
 };
 
 #endif // GENERALTAB_H
 };
 
 #endif // GENERALTAB_H