1 /*
2    SPDX-FileCopyrightText: 2018-2021 Laurent Montel <montel@kde.org>
3 
4    SPDX-License-Identifier: LGPL-2.0-or-later
5 */
6 
7 #include "usersforroomfilterproxymodel.h"
8 #include "usersforroommodel.h"
9 
UsersForRoomFilterProxyModel(QObject * parent)10 UsersForRoomFilterProxyModel::UsersForRoomFilterProxyModel(QObject *parent)
11     : QSortFilterProxyModel(parent)
12 {
13     setFilterCaseSensitivity(Qt::CaseInsensitive);
14     // Filter on alias/username ?
15     setFilterRole(UsersForRoomModel::UsersForRoomRoles::UserName);
16     setSortRole(UsersForRoomModel::UsersForRoomRoles::UserName);
17     sort(0);
18 }
19 
20 UsersForRoomFilterProxyModel::~UsersForRoomFilterProxyModel() = default;
21 
clearFilter()22 void UsersForRoomFilterProxyModel::clearFilter()
23 {
24     setFilterFixedString({});
25     mStatusType.clear();
26 }
27 
setFilterString(const QString & string)28 void UsersForRoomFilterProxyModel::setFilterString(const QString &string)
29 {
30     setFilterFixedString(string);
31 }
32 
hasFullList() const33 bool UsersForRoomFilterProxyModel::hasFullList() const
34 {
35     return static_cast<UsersForRoomModel *>(sourceModel())->hasFullList();
36 }
37 
lessThan(const QModelIndex & left,const QModelIndex & right) const38 bool UsersForRoomFilterProxyModel::lessThan(const QModelIndex &left, const QModelIndex &right) const
39 {
40     if (!sourceModel()) {
41         return false;
42     }
43     if (left.isValid() && right.isValid()) {
44         const QString leftString = sourceModel()->data(left, UsersForRoomModel::UserName).toString();
45         const QString rightString = sourceModel()->data(right, UsersForRoomModel::UserName).toString();
46         return QString::localeAwareCompare(leftString, rightString) < 0;
47     } else {
48         return false;
49     }
50 }
51 
setStatusType(const QString & statusType)52 void UsersForRoomFilterProxyModel::setStatusType(const QString &statusType)
53 {
54     if (mStatusType != statusType) {
55         mStatusType = statusType;
56         invalidateFilter();
57     }
58 }
59 
loadMoreUsersInProgress() const60 bool UsersForRoomFilterProxyModel::loadMoreUsersInProgress() const
61 {
62     return static_cast<UsersForRoomModel *>(sourceModel())->loadMoreUsersInProgress();
63 }
64 
total() const65 int UsersForRoomFilterProxyModel::total() const
66 {
67     return static_cast<UsersForRoomModel *>(sourceModel())->total();
68 }
69 
numberOfUsers() const70 int UsersForRoomFilterProxyModel::numberOfUsers() const
71 {
72     return static_cast<UsersForRoomModel *>(sourceModel())->usersCount();
73 }
74 
filterAcceptsRow(int source_row,const QModelIndex & source_parent) const75 bool UsersForRoomFilterProxyModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const
76 {
77     if (mStatusType.isEmpty()) {
78         return QSortFilterProxyModel::filterAcceptsRow(source_row, source_parent);
79     }
80     const QModelIndex sourceIndex = sourceModel()->index(source_row, 0, source_parent);
81     const QString statusType = sourceIndex.data(UsersForRoomModel::Status).toString();
82     return (mStatusType == statusType) && QSortFilterProxyModel::filterAcceptsRow(source_row, source_parent);
83 }
84