From ae63802acb5270cbb3e4ab72f414d11ffecce132 Mon Sep 17 00:00:00 2001 From: Nate Graham Date: Wed, 10 Mar 2021 17:14:57 -0700 Subject: [PATCH] [kcms] Sort grid view KCMs case insensitively Since these KCMs can display user and distro provided content, we can't ensure that everything will begin with a capital letter. Accordingly, we should sort the grid case-insensitively to prevent the entries starting with lowercase letters from being shunted to the end. CCBUG: 404608 --- kcms/colors/colorsmodel.cpp | 2 ++ kcms/cursortheme/kcmcursortheme.cpp | 3 ++- kcms/cursortheme/xcursor/sortproxymodel.cpp | 2 +- kcms/desktoptheme/themesmodel.cpp | 2 ++ kcms/icons/iconsmodel.cpp | 8 ++++++-- kcms/lookandfeel/kcm.cpp | 11 +++++++++-- kcms/style/stylesmodel.cpp | 2 ++ 7 files changed, 24 insertions(+), 6 deletions(-) diff --git a/kcms/colors/colorsmodel.cpp b/kcms/colors/colorsmodel.cpp index e7ea4c155..7edcbe369 100644 --- a/kcms/colors/colorsmodel.cpp +++ b/kcms/colors/colorsmodel.cpp @@ -217,7 +217,9 @@ void ColorsModel::load() m_data.append(item); } + // Sort case-insensitively QCollator collator; + collator.setCaseSensitivity(Qt::CaseInsensitive); std::sort(m_data.begin(), m_data.end(), [&collator](const ColorsModelData &a, const ColorsModelData &b) { return collator.compare(a.display, b.display) < 0; }); diff --git a/kcms/cursortheme/kcmcursortheme.cpp b/kcms/cursortheme/kcmcursortheme.cpp index 78cb3dba0..ef7ac421a 100644 --- a/kcms/cursortheme/kcmcursortheme.cpp +++ b/kcms/cursortheme/kcmcursortheme.cpp @@ -87,7 +87,8 @@ CursorThemeConfig::CursorThemeConfig(QObject *parent, const QVariantList &args) m_themeProxyModel = new SortProxyModel(this); m_themeProxyModel->setSourceModel(m_themeModel); - m_themeProxyModel->setFilterCaseSensitivity(Qt::CaseSensitive); + // sort ordering is already case-insensitive; match that for filtering too + m_themeProxyModel->setFilterCaseSensitivity(Qt::CaseInsensitive); m_themeProxyModel->sort(NameColumn, Qt::AscendingOrder); m_sizesModel = new QStandardItemModel(this); diff --git a/kcms/cursortheme/xcursor/sortproxymodel.cpp b/kcms/cursortheme/xcursor/sortproxymodel.cpp index d27a7c214..7f55c8cda 100644 --- a/kcms/cursortheme/xcursor/sortproxymodel.cpp +++ b/kcms/cursortheme/xcursor/sortproxymodel.cpp @@ -36,7 +36,7 @@ int SortProxyModel::compare(const QModelIndex &left, const QModelIndex &right, i QString first = model->data(left, role).toString(); QString second = model->data(right, role).toString(); - if (filterCaseSensitivity() == Qt::CaseSensitive) { + if (filterCaseSensitivity() == Qt::CaseInsensitive) { first = first.toLower(); second = second.toLower(); } diff --git a/kcms/desktoptheme/themesmodel.cpp b/kcms/desktoptheme/themesmodel.cpp index 5ebeed815..25addb112 100644 --- a/kcms/desktoptheme/themesmodel.cpp +++ b/kcms/desktoptheme/themesmodel.cpp @@ -216,7 +216,9 @@ void ThemesModel::load() } } + // Sort case-insensitively QCollator collator; + collator.setCaseSensitivity(Qt::CaseInsensitive); std::sort(m_data.begin(), m_data.end(), [&collator](const ThemesModelData &a, const ThemesModelData &b) { return collator.compare(a.display, b.display) < 0; }); diff --git a/kcms/icons/iconsmodel.cpp b/kcms/icons/iconsmodel.cpp index 23ee6315f..29a4122d1 100644 --- a/kcms/icons/iconsmodel.cpp +++ b/kcms/icons/iconsmodel.cpp @@ -25,6 +25,7 @@ #include "iconsmodel.h" +#include #include #include @@ -141,8 +142,11 @@ void IconsModel::load() m_data.append(item); } - std::sort(m_data.begin(), m_data.end(), [](const IconsModelData &a, const IconsModelData &b) { - return a.display < b.display; + // Sort case-insensitively + QCollator collator; + collator.setCaseSensitivity(Qt::CaseInsensitive); + std::sort(m_data.begin(), m_data.end(), [&collator](const IconsModelData &a, const IconsModelData &b) { + return collator.compare(a.display, b.display) < 0; }); endResetModel(); diff --git a/kcms/lookandfeel/kcm.cpp b/kcms/lookandfeel/kcm.cpp index e2b021317..9ac6c7cd5 100644 --- a/kcms/lookandfeel/kcm.cpp +++ b/kcms/lookandfeel/kcm.cpp @@ -174,7 +174,15 @@ void KCMLookandFeel::loadModel() { m_model->clear(); - const QList pkgs = availablePackages({"defaults", "layouts"}); + QList pkgs = availablePackages({"defaults", "layouts"}); + + // Sort case-insensitively + QCollator collator; + collator.setCaseSensitivity(Qt::CaseInsensitive); + std::sort(pkgs.begin(), pkgs.end(), [&collator](const KPackage::Package &a, const KPackage::Package &b) { + return collator.compare(a.metadata().name(), b.metadata().name()) < 0; + }); + for (const KPackage::Package &pkg : pkgs) { if (!pkg.metadata().isValid()) { continue; @@ -225,7 +233,6 @@ void KCMLookandFeel::loadModel() m_model->appendRow(row); } - m_model->sort(0 /*column*/); // Model has been cleared so pretend the selected look and fell changed to force view update emit lookAndFeelSettings()->lookAndFeelPackageChanged(); diff --git a/kcms/style/stylesmodel.cpp b/kcms/style/stylesmodel.cpp index 04aca9221..b238f47f2 100644 --- a/kcms/style/stylesmodel.cpp +++ b/kcms/style/stylesmodel.cpp @@ -200,7 +200,9 @@ void StylesModel::load() m_data = styleData.values().toVector(); + // Sort case-insensitively QCollator collator; + collator.setCaseSensitivity(Qt::CaseInsensitive); std::sort(m_data.begin(), m_data.end(), [&collator](const StylesModelData &a, const StylesModelData &b) { const QString aDisplay = !a.display.isEmpty() ? a.display : a.styleName; const QString bDisplay = !b.display.isEmpty() ? b.display : b.styleName;