From 92c0ecde90f30061bef321f50fbea99616e852a7 Mon Sep 17 00:00:00 2001 From: Arnav Dhamija Date: Wed, 16 Mar 2016 20:53:52 +0100 Subject: [PATCH] Add case sensitive sorting mode Dolphin users can now choose between 3 different sorting modes: * natural sorting * case insensitive sorting * case sensitive sorting REVIEW: 126467 BUG: 148550 FIXED-IN: 16.04.0 --- src/kitemviews/kfileitemmodel.cpp | 32 ++++++++-- src/kitemviews/kfileitemmodel.h | 7 ++- src/settings/dolphin_generalsettings.kcfg | 15 +++-- src/settings/general/behaviorsettingspage.cpp | 59 ++++++++++++++++--- src/settings/general/behaviorsettingspage.h | 9 ++- 5 files changed, 101 insertions(+), 21 deletions(-) diff --git a/src/kitemviews/kfileitemmodel.cpp b/src/kitemviews/kfileitemmodel.cpp index b8b39603c..8626f947d 100644 --- a/src/kitemviews/kfileitemmodel.cpp +++ b/src/kitemviews/kfileitemmodel.cpp @@ -41,7 +41,6 @@ KFileItemModel::KFileItemModel(QObject* parent) : KItemModelBase("text", parent), m_dirLister(0), - m_naturalSorting(GeneralSettings::naturalSorting()), m_sortDirsFirst(true), m_sortRole(NameRole), m_sortingProgressPercent(-1), @@ -58,9 +57,10 @@ KFileItemModel::KFileItemModel(QObject* parent) : m_expandedDirs(), m_urlsToExpand() { - m_collator.setCaseSensitivity(Qt::CaseInsensitive); m_collator.setNumericMode(true); + loadSortingSettings(); + m_dirLister = new KFileItemModelDirLister(this); m_dirLister->setDelayedMimeTypes(true); @@ -106,8 +106,7 @@ KFileItemModel::KFileItemModel(QObject* parent) : m_resortAllItemsTimer->setSingleShot(true); connect(m_resortAllItemsTimer, &QTimer::timeout, this, &KFileItemModel::resortAllItems); - connect(GeneralSettings::self(), &GeneralSettings::naturalSortingChanged, - this, &KFileItemModel::slotNaturalSortingChanged); + connect(GeneralSettings::self(), &GeneralSettings::sortingChoiceChanged, this, &KFileItemModel::slotSortingChoiceChanged); } KFileItemModel::~KFileItemModel() @@ -783,6 +782,27 @@ void KFileItemModel::onSortOrderChanged(Qt::SortOrder current, Qt::SortOrder pre resortAllItems(); } +void KFileItemModel::loadSortingSettings() +{ + using Choice = GeneralSettings::EnumSortingChoice; + switch (GeneralSettings::sortingChoice()) { + case Choice::NaturalSorting: + m_naturalSorting = true; + m_collator.setCaseSensitivity(Qt::CaseInsensitive); + break; + case Choice::CaseSensitiveSorting: + m_naturalSorting = false; + m_collator.setCaseSensitivity(Qt::CaseSensitive); + break; + case Choice::CaseInsensitiveSorting: + m_naturalSorting = false; + m_collator.setCaseSensitivity(Qt::CaseInsensitive); + break; + default: + Q_UNREACHABLE(); + } +} + void KFileItemModel::resortAllItems() { m_resortAllItemsTimer->stop(); @@ -1103,9 +1123,9 @@ void KFileItemModel::slotClear() m_expandedDirs.clear(); } -void KFileItemModel::slotNaturalSortingChanged() +void KFileItemModel::slotSortingChoiceChanged() { - m_naturalSorting = GeneralSettings::naturalSorting(); + loadSortingSettings(); resortAllItems(); } diff --git a/src/kitemviews/kfileitemmodel.h b/src/kitemviews/kfileitemmodel.h index e06313aa9..8a0df72b9 100644 --- a/src/kitemviews/kfileitemmodel.h +++ b/src/kitemviews/kfileitemmodel.h @@ -273,7 +273,7 @@ private slots: void slotItemsDeleted(const KFileItemList& items); void slotRefreshItems(const QList >& items); void slotClear(); - void slotNaturalSortingChanged(); + void slotSortingChoiceChanged(); void dispatchPendingItemsToInsert(); @@ -415,6 +415,11 @@ private: */ void removeFilteredChildren(const KItemRangeList& parents); + /** + * Loads the selected choice of sorting method from Dolphin General Settings + */ + void loadSortingSettings(); + /** * Maps the QByteArray-roles to RoleTypes and provides translation- and * group-contexts. diff --git a/src/settings/dolphin_generalsettings.kcfg b/src/settings/dolphin_generalsettings.kcfg index 9ff14d1f7..de7390bbd 100644 --- a/src/settings/dolphin_generalsettings.kcfg +++ b/src/settings/dolphin_generalsettings.kcfg @@ -8,7 +8,7 @@ QUrl KCompletion - + @@ -93,10 +93,15 @@ true - - - true - + + + + + + + + 0 + diff --git a/src/settings/general/behaviorsettingspage.cpp b/src/settings/general/behaviorsettingspage.cpp index 093a1f4e1..86a4ad3bb 100644 --- a/src/settings/general/behaviorsettingspage.cpp +++ b/src/settings/general/behaviorsettingspage.cpp @@ -39,6 +39,8 @@ BehaviorSettingsPage::BehaviorSettingsPage(const QUrl& url, QWidget* parent) : m_showToolTips(0), m_showSelectionToggle(0), m_naturalSorting(0), + m_caseSensitiveSorting(0), + m_caseInsensitiveSorting(0), m_renameInline(0) { QVBoxLayout* topLayout = new QVBoxLayout(this); @@ -54,22 +56,32 @@ BehaviorSettingsPage::BehaviorSettingsPage(const QUrl& url, QWidget* parent) : viewPropsLayout->addWidget(m_localViewProps); viewPropsLayout->addWidget(m_globalViewProps); + // Sorting properties + QGroupBox* sortingPropsBox = new QGroupBox(i18nc("@title:group", "Sorting Mode"), this); + sortingPropsBox->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Maximum); + + m_naturalSorting = new QRadioButton(i18nc("option:radio", "Natural sorting"), sortingPropsBox); + m_caseInsensitiveSorting = new QRadioButton(i18nc("option:radio", "Alphabetical sorting, case insensitive"), sortingPropsBox); + m_caseSensitiveSorting = new QRadioButton(i18nc("option:radio", "Alphabetical sorting, case sensitive"), sortingPropsBox); + + QVBoxLayout* sortingPropsLayout = new QVBoxLayout(sortingPropsBox); + sortingPropsLayout->addWidget(m_naturalSorting); + sortingPropsLayout->addWidget(m_caseInsensitiveSorting); + sortingPropsLayout->addWidget(m_caseSensitiveSorting); + // 'Show tooltips' m_showToolTips = new QCheckBox(i18nc("@option:check", "Show tooltips"), this); // 'Show selection marker' m_showSelectionToggle = new QCheckBox(i18nc("@option:check", "Show selection marker"), this); - // 'Natural sorting of items' - m_naturalSorting = new QCheckBox(i18nc("option:check", "Natural sorting of items"), this); - // 'Inline renaming of items' m_renameInline = new QCheckBox(i18nc("option:check", "Rename inline"), this); topLayout->addWidget(viewPropsBox); + topLayout->addWidget(sortingPropsBox); topLayout->addWidget(m_showToolTips); topLayout->addWidget(m_showSelectionToggle); - topLayout->addWidget(m_naturalSorting); topLayout->addWidget(m_renameInline); topLayout->addStretch(); @@ -79,7 +91,9 @@ BehaviorSettingsPage::BehaviorSettingsPage(const QUrl& url, QWidget* parent) : connect(m_globalViewProps, &QRadioButton::toggled, this, &BehaviorSettingsPage::changed); connect(m_showToolTips, &QCheckBox::toggled, this, &BehaviorSettingsPage::changed); connect(m_showSelectionToggle, &QCheckBox::toggled, this, &BehaviorSettingsPage::changed); - connect(m_naturalSorting, &QCheckBox::toggled, this, &BehaviorSettingsPage::changed); + connect(m_naturalSorting, &QRadioButton::toggled, this, &BehaviorSettingsPage::changed); + connect(m_caseInsensitiveSorting, &QRadioButton::toggled, this, &BehaviorSettingsPage::changed); + connect(m_caseSensitiveSorting, &QRadioButton::toggled, this, &BehaviorSettingsPage::changed); connect(m_renameInline, &QCheckBox::toggled, this, &BehaviorSettingsPage::changed); } @@ -94,10 +108,9 @@ void BehaviorSettingsPage::applySettings() const bool useGlobalViewProps = m_globalViewProps->isChecked(); settings->setGlobalViewProps(useGlobalViewProps); - settings->setShowToolTips(m_showToolTips->isChecked()); settings->setShowSelectionToggle(m_showSelectionToggle->isChecked()); - settings->setNaturalSorting(m_naturalSorting->isChecked()); + setSortingChoiceValue(settings); settings->setRenameInline(m_renameInline->isChecked()); settings->save(); @@ -127,7 +140,37 @@ void BehaviorSettingsPage::loadSettings() m_showToolTips->setChecked(GeneralSettings::showToolTips()); m_showSelectionToggle->setChecked(GeneralSettings::showSelectionToggle()); - m_naturalSorting->setChecked(GeneralSettings::naturalSorting()); m_renameInline->setChecked(GeneralSettings::renameInline()); + + loadSortingChoiceSettings(); } +void BehaviorSettingsPage::setSortingChoiceValue(GeneralSettings *settings) +{ + using Choice = GeneralSettings::EnumSortingChoice; + if (m_naturalSorting->isChecked()) { + settings->setSortingChoice(Choice::NaturalSorting); + } else if (m_caseInsensitiveSorting->isChecked()) { + settings->setSortingChoice(Choice::CaseInsensitiveSorting); + } else if (m_caseSensitiveSorting->isChecked()) { + settings->setSortingChoice(Choice::CaseSensitiveSorting); + } +} + +void BehaviorSettingsPage::loadSortingChoiceSettings() +{ + using Choice = GeneralSettings::EnumSortingChoice; + switch (GeneralSettings::sortingChoice()) { + case Choice::NaturalSorting: + m_naturalSorting->setChecked(true); + break; + case Choice::CaseInsensitiveSorting: + m_caseInsensitiveSorting->setChecked(true); + break; + case Choice::CaseSensitiveSorting: + m_caseSensitiveSorting->setChecked(true); + break; + default: + Q_UNREACHABLE(); + } +} diff --git a/src/settings/general/behaviorsettingspage.h b/src/settings/general/behaviorsettingspage.h index 6e491696c..6213734f1 100644 --- a/src/settings/general/behaviorsettingspage.h +++ b/src/settings/general/behaviorsettingspage.h @@ -22,6 +22,7 @@ #include #include +#include "dolphin_generalsettings.h" class QCheckBox; class QLabel; @@ -46,6 +47,8 @@ public: private: void loadSettings(); + void setSortingChoiceValue(GeneralSettings* settings); + void loadSortingChoiceSettings(); private: QUrl m_url; @@ -56,7 +59,11 @@ private: QCheckBox* m_showToolTips; QLabel* m_configureToolTips; QCheckBox* m_showSelectionToggle; - QCheckBox* m_naturalSorting; + + QRadioButton* m_naturalSorting; + QRadioButton* m_caseSensitiveSorting; + QRadioButton* m_caseInsensitiveSorting; + QCheckBox* m_renameInline; };