You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
114 lines
5.0 KiB
114 lines
5.0 KiB
/*************************************************************************** |
|
* Copyright (C) 2019 Konrad Materka <materka@gmail.com> * |
|
* * |
|
* This program is free software; you can redistribute it and/or modify * |
|
* it under the terms of the GNU General Public License as published by * |
|
* the Free Software Foundation; either version 2 of the License, or * |
|
* (at your option) any later version. * |
|
* * |
|
* This program is distributed in the hope that it will be useful, * |
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of * |
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * |
|
* GNU General Public License for more details. * |
|
* * |
|
* You should have received a copy of the GNU General Public License * |
|
* along with this program; if not, write to the * |
|
* Free Software Foundation, Inc., * |
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * |
|
***************************************************************************/ |
|
|
|
#include "sortedsystemtraymodel.h" |
|
#include "debug.h" |
|
#include "systemtraymodel.h" |
|
|
|
#include <QList> |
|
|
|
static const QList<QString> s_categoryOrder = { |
|
QStringLiteral("UnknownCategory"), |
|
QStringLiteral("ApplicationStatus"), |
|
QStringLiteral("Communications"), |
|
QStringLiteral("SystemServices"), |
|
QStringLiteral("Hardware"), |
|
}; |
|
|
|
SortedSystemTrayModel::SortedSystemTrayModel(SortingType sorting, QObject *parent) |
|
: QSortFilterProxyModel(parent) |
|
, m_sorting(sorting) |
|
{ |
|
setSortLocaleAware(true); |
|
sort(0); |
|
} |
|
|
|
bool SortedSystemTrayModel::lessThan(const QModelIndex &left, const QModelIndex &right) const |
|
{ |
|
switch (m_sorting) { |
|
case SortedSystemTrayModel::SortingType::ConfigurationPage: |
|
return lessThanConfigurationPage(left, right); |
|
case SortedSystemTrayModel::SortingType::SystemTray: |
|
return lessThanSystemTray(left, right); |
|
} |
|
|
|
return QSortFilterProxyModel::lessThan(left, right); |
|
} |
|
|
|
bool SortedSystemTrayModel::lessThanConfigurationPage(const QModelIndex &left, const QModelIndex &right) const |
|
{ |
|
const int categoriesComparison = compareCategoriesAlphabetically(left, right); |
|
if (categoriesComparison == 0) { |
|
return QSortFilterProxyModel::lessThan(left, right); |
|
} else { |
|
return categoriesComparison < 0; |
|
} |
|
} |
|
|
|
bool SortedSystemTrayModel::lessThanSystemTray(const QModelIndex &left, const QModelIndex &right) const |
|
{ |
|
QVariant itemIdLeft = sourceModel()->data(left, static_cast<int>(BaseModel::BaseRole::ItemId)); |
|
QVariant itemIdRight = sourceModel()->data(left, static_cast<int>(BaseModel::BaseRole::ItemId)); |
|
if (itemIdRight.toString() == QLatin1String("org.kde.plasma.notifications")) { |
|
// return false when at least right is "org.kde.plasma.notifications" |
|
return false; |
|
} else if (itemIdLeft.toString() == QLatin1String("org.kde.plasma.notifications")) { |
|
// return true when only left is "org.kde.plasma.notifications" |
|
return true; |
|
} |
|
|
|
const int categoriesComparison = compareCategoriesOrderly(left, right); |
|
if (categoriesComparison == 0) { |
|
return QSortFilterProxyModel::lessThan(left, right); |
|
} else { |
|
return categoriesComparison < 0; |
|
} |
|
} |
|
|
|
int SortedSystemTrayModel::compareCategoriesAlphabetically(const QModelIndex &left, const QModelIndex &right) const |
|
{ |
|
QVariant leftData = sourceModel()->data(left, static_cast<int>(BaseModel::BaseRole::Category)); |
|
QString leftCategory = leftData.isNull() ? QStringLiteral("UnknownCategory") : leftData.toString(); |
|
|
|
QVariant rightData = sourceModel()->data(right, static_cast<int>(BaseModel::BaseRole::Category)); |
|
QString rightCategory = rightData.isNull() ? QStringLiteral("UnknownCategory") : rightData.toString(); |
|
|
|
return QString::localeAwareCompare(leftCategory, rightCategory); |
|
} |
|
|
|
int SortedSystemTrayModel::compareCategoriesOrderly(const QModelIndex &left, const QModelIndex &right) const |
|
{ |
|
QVariant leftData = sourceModel()->data(left, static_cast<int>(BaseModel::BaseRole::Category)); |
|
QString leftCategory = leftData.isNull() ? QStringLiteral("UnknownCategory") : leftData.toString(); |
|
|
|
QVariant rightData = sourceModel()->data(right, static_cast<int>(BaseModel::BaseRole::Category)); |
|
QString rightCategory = rightData.isNull() ? QStringLiteral("UnknownCategory") : rightData.toString(); |
|
|
|
int leftIndex = s_categoryOrder.indexOf(leftCategory); |
|
if (leftIndex == -1) { |
|
leftIndex = s_categoryOrder.indexOf(QStringLiteral("UnknownCategory")); |
|
} |
|
|
|
int rightIndex = s_categoryOrder.indexOf(rightCategory); |
|
if (rightIndex == -1) { |
|
rightIndex = s_categoryOrder.indexOf(QStringLiteral("UnknownCategory")); |
|
} |
|
|
|
return leftIndex - rightIndex; |
|
}
|
|
|