#include "kstandarditemlistwidget.h"
+#include "dolphin_contentdisplaysettings.h"
#include "kfileitemlistview.h"
#include "private/kfileitemclipboard.h"
#include "private/kitemlistroleeditor.h"
}
}
+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);
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);
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") {
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);
}
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);
}
QRectF roleEditingRect(const QByteArray &role) const;
+ QString elideText(QString text, qreal elidingWidth) const;
+
/**
* Escapes text for display purposes.
*
</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>
, m_useSymbolicPermissions(nullptr)
, m_useNumericPermissions(nullptr)
, m_useCombinedPermissions(nullptr)
+ , m_elideMiddle(nullptr)
+ , m_elideEnding(nullptr)
{
QFormLayout *topLayout = new QFormLayout(this);
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);
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();
}
} 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();
}
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()
QRadioButton *m_useSymbolicPermissions;
QRadioButton *m_useNumericPermissions;
QRadioButton *m_useCombinedPermissions;
+ QRadioButton *m_elideMiddle;
+ QRadioButton *m_elideEnding;
};
#endif // GENERALTAB_H