From: Gleb Kasachou Date: Tue, 17 Jun 2025 05:58:45 +0000 (+0000) Subject: Add setting to select filename eliding behavior X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/commitdiff_plain/e0d9f9b9aad9313434597658d38c9b2c18382770 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 --- 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); } diff --git a/src/kitemviews/kstandarditemlistwidget.h b/src/kitemviews/kstandarditemlistwidget.h index 18f86dbcb..594d3e492 100644 --- a/src/kitemviews/kstandarditemlistwidget.h +++ b/src/kitemviews/kstandarditemlistwidget.h @@ -224,6 +224,8 @@ private: QRectF roleEditingRect(const QByteArray &role) const; + QString elideText(QString text, qreal elidingWidth) const; + /** * Escapes text for display purposes. * diff --git a/src/settings/dolphin_contentdisplaysettings.kcfg b/src/settings/dolphin_contentdisplaysettings.kcfg index 31c6f75df..6e8f8e9d5 100644 --- a/src/settings/dolphin_contentdisplaysettings.kcfg +++ b/src/settings/dolphin_contentdisplaysettings.kcfg @@ -38,5 +38,13 @@ 0 + + + + + + + Middle + diff --git a/src/settings/viewmodes/contentdisplaytab.cpp b/src/settings/viewmodes/contentdisplaytab.cpp index c08c4c191..939faf7e2 100644 --- a/src/settings/viewmodes/contentdisplaytab.cpp +++ b/src/settings/viewmodes/contentdisplaytab.cpp @@ -31,6 +31,8 @@ ContentDisplayTab::ContentDisplayTab(QWidget *parent) , m_useSymbolicPermissions(nullptr) , m_useNumericPermissions(nullptr) , m_useCombinedPermissions(nullptr) + , m_elideMiddle(nullptr) + , m_elideEnding(nullptr) { QFormLayout *topLayout = new QFormLayout(this); @@ -103,6 +105,16 @@ ContentDisplayTab::ContentDisplayTab(QWidget *parent) 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); @@ -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_elideMiddle, &QRadioButton::toggled, this, &SettingsPageBase::changed); + connect(m_elideEnding, &QRadioButton::toggled, this, &SettingsPageBase::changed); loadSettings(); } @@ -148,6 +162,11 @@ void ContentDisplayTab::applySettings() } 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(); } @@ -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_elideMiddle->setChecked(settings->elidingMode() == ContentDisplaySettings::ElidingMode::Middle); + m_elideEnding->setChecked(settings->elidingMode() == ContentDisplaySettings::ElidingMode::Right); } void ContentDisplayTab::setSortingChoiceValue() diff --git a/src/settings/viewmodes/contentdisplaytab.h b/src/settings/viewmodes/contentdisplaytab.h index 05e8414e1..2bae5a87c 100644 --- a/src/settings/viewmodes/contentdisplaytab.h +++ b/src/settings/viewmodes/contentdisplaytab.h @@ -43,6 +43,8 @@ private: QRadioButton *m_useSymbolicPermissions; QRadioButton *m_useNumericPermissions; QRadioButton *m_useCombinedPermissions; + QRadioButton *m_elideMiddle; + QRadioButton *m_elideEnding; }; #endif // GENERALTAB_H