]> cloud.milkyroute.net Git - dolphin.git/commitdiff
Add case sensitive sorting mode
authorArnav Dhamija <arnav.dhamija@gmail.com>
Wed, 16 Mar 2016 19:53:52 +0000 (20:53 +0100)
committerEmmanuel Pescosta <emmanuelpescosta099@gmail.com>
Wed, 16 Mar 2016 19:53:52 +0000 (20:53 +0100)
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
src/kitemviews/kfileitemmodel.h
src/settings/dolphin_generalsettings.kcfg
src/settings/general/behaviorsettingspage.cpp
src/settings/general/behaviorsettingspage.h

index b8b39603c306046a1a84edd694f29f6d830c7aac..8626f947d949bbf5b2d54b6753706882231c6c25 100644 (file)
@@ -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();
 }
 
index e06313aa92de2943ef1a38c72fc2c3c9340d076b..8a0df72b921cf933278ef7b7cd0a923080b08777 100644 (file)
@@ -273,7 +273,7 @@ private slots:
     void slotItemsDeleted(const KFileItemList& items);
     void slotRefreshItems(const QList<QPair<KFileItem, KFileItem> >& 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.
index 9ff14d1f78d9c8f577e12fb12092845715e24739..de7390bbd26161296725de64f72d8d56249d6008 100644 (file)
@@ -8,7 +8,7 @@
     <include>QUrl</include>
     <include>KCompletion</include>
     <kcfgfile name="dolphinrc"/>
-    <signal name="naturalSortingChanged" />
+    <signal name="sortingChoiceChanged" />
     <group name="General">
         <entry name="EditableUrl" type="Bool">
             <label>Should the URL be editable for the user</label>
             <label>Enlarge Small Previews</label>
             <default>true</default>
         </entry>
-        <entry name="NaturalSorting" type="Bool">
-            <label>Natural sorting of items</label>
-            <default>true</default>
-            <emit signal="naturalSortingChanged" />
+        <entry name="SortingChoice" type="Enum">
+            <choices>
+                <choice name="NaturalSorting" />
+                <choice name="CaseInsensitiveSorting" />
+                <choice name="CaseSensitiveSorting" />
+            </choices>
+            <label>Choose Natural, Case Sensitive, or Case Insensitive order of sorting the items</label>
+            <default>0</default>
+            <emit signal="sortingChoiceChanged" />
         </entry>
     </group>
 </kcfg>
index 093a1f4e160a1c84f7d2104df7b360e809f66b3d..86a4ad3bbcabd03e19bd1237f0bb95324da3c1d7 100644 (file)
@@ -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();
+    }
+}
index 6e491696c8b9298311e82455c975cf544be690c0..6213734f1e5146856639aa78c0268c793735403c 100644 (file)
@@ -22,6 +22,7 @@
 
 #include <settings/settingspagebase.h>
 #include <QUrl>
+#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;
 };