Warning, file /plasma/plasma-nm/libs/models/appletproxymodel.cpp was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).

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 }