File indexing completed on 2023-11-26 08:54:34
0001 /* 0002 SPDX-FileCopyrightText: 2013-2014 Jan Grulich <jgrulich@redhat.com> 0003 0004 SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL 0005 */ 0006 0007 #include "appletproxymodel.h" 0008 #include "networkmodel.h" 0009 #include "networkmodelitem.h" 0010 #include "uiutils.h" 0011 0012 AppletProxyModel::AppletProxyModel(QObject *parent) 0013 : QSortFilterProxyModel(parent) 0014 { 0015 setDynamicSortFilter(true); 0016 setFilterRole(NetworkModel::ItemUniqueNameRole); 0017 setFilterCaseSensitivity(Qt::CaseInsensitive); 0018 sort(0, Qt::DescendingOrder); 0019 } 0020 0021 AppletProxyModel::~AppletProxyModel() = default; 0022 0023 bool AppletProxyModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const 0024 { 0025 const QModelIndex index = sourceModel()->index(source_row, 0, source_parent); 0026 0027 const QString filter = filterRegularExpression().pattern(); 0028 0029 // slaves are filtered-out when not searching for a connection (makes the state of search results clear) 0030 const bool isSlave = sourceModel()->data(index, NetworkModel::SlaveRole).toBool(); 0031 if (isSlave && filter.isEmpty()) { 0032 return false; 0033 } 0034 0035 const NetworkManager::ConnectionSettings::ConnectionType type = 0036 (NetworkManager::ConnectionSettings::ConnectionType)sourceModel()->data(index, NetworkModel::TypeRole).toUInt(); 0037 if (!UiUtils::isConnectionTypeSupported(type)) { 0038 return false; 0039 } 0040 0041 NetworkModelItem::ItemType itemType = (NetworkModelItem::ItemType)sourceModel()->data(index, NetworkModel::ItemTypeRole).toUInt(); 0042 0043 if (itemType != NetworkModelItem::AvailableConnection && itemType != NetworkModelItem::AvailableAccessPoint) { 0044 return false; 0045 } 0046 0047 return QSortFilterProxyModel::filterAcceptsRow(source_row, source_parent); 0048 } 0049 0050 bool AppletProxyModel::lessThan(const QModelIndex &left, const QModelIndex &right) const 0051 { 0052 const bool leftAvailable = 0053 (NetworkModelItem::ItemType)sourceModel()->data(left, NetworkModel::ItemTypeRole).toUInt() != NetworkModelItem::UnavailableConnection; 0054 const bool leftConnected = sourceModel()->data(left, NetworkModel::ConnectionStateRole).toUInt() == NetworkManager::ActiveConnection::Activated; 0055 const int leftConnectionState = sourceModel()->data(left, NetworkModel::ConnectionStateRole).toUInt(); 0056 const QString leftName = sourceModel()->data(left, NetworkModel::NameRole).toString(); 0057 const UiUtils::SortedConnectionType leftType = 0058 UiUtils::connectionTypeToSortedType((NetworkManager::ConnectionSettings::ConnectionType)sourceModel()->data(left, NetworkModel::TypeRole).toUInt()); 0059 const QString leftUuid = sourceModel()->data(left, NetworkModel::UuidRole).toString(); 0060 const int leftSignal = sourceModel()->data(left, NetworkModel::SignalRole).toInt(); 0061 const QDateTime leftDate = sourceModel()->data(left, NetworkModel::TimeStampRole).toDateTime(); 0062 0063 const bool rightAvailable = 0064 (NetworkModelItem::ItemType)sourceModel()->data(right, NetworkModel::ItemTypeRole).toUInt() != NetworkModelItem::UnavailableConnection; 0065 const bool rightConnected = sourceModel()->data(right, NetworkModel::ConnectionStateRole).toUInt() == NetworkManager::ActiveConnection::Activated; 0066 const int rightConnectionState = sourceModel()->data(right, NetworkModel::ConnectionStateRole).toUInt(); 0067 const QString rightName = sourceModel()->data(right, NetworkModel::NameRole).toString(); 0068 const UiUtils::SortedConnectionType rightType = 0069 UiUtils::connectionTypeToSortedType((NetworkManager::ConnectionSettings::ConnectionType)sourceModel()->data(right, NetworkModel::TypeRole).toUInt()); 0070 const QString rightUuid = sourceModel()->data(right, NetworkModel::UuidRole).toString(); 0071 const int rightSignal = sourceModel()->data(right, NetworkModel::SignalRole).toInt(); 0072 const QDateTime rightDate = sourceModel()->data(right, NetworkModel::TimeStampRole).toDateTime(); 0073 0074 if (leftAvailable < rightAvailable) { 0075 return true; 0076 } else if (leftAvailable > rightAvailable) { 0077 return false; 0078 } 0079 0080 if (leftConnected < rightConnected) { 0081 return true; 0082 } else if (leftConnected > rightConnected) { 0083 return false; 0084 } 0085 0086 if (leftConnectionState > rightConnectionState) { 0087 return true; 0088 } else if (leftConnectionState < rightConnectionState) { 0089 return false; 0090 } 0091 0092 if (leftUuid.isEmpty() && !rightUuid.isEmpty()) { 0093 return true; 0094 } else if (!leftUuid.isEmpty() && rightUuid.isEmpty()) { 0095 return false; 0096 } 0097 0098 if (leftType < rightType) { 0099 return false; 0100 } else if (leftType > rightType) { 0101 return true; 0102 } 0103 0104 if (leftDate > rightDate) { 0105 return false; 0106 } else if (leftDate < rightDate) { 0107 return true; 0108 } 0109 0110 if (leftSignal < rightSignal) { 0111 return true; 0112 } else if (leftSignal > rightSignal) { 0113 return false; 0114 } 0115 0116 if (QString::localeAwareCompare(leftName, rightName) > 0) { 0117 return true; 0118 } else { 0119 return false; 0120 } 0121 }