File indexing completed on 2024-05-12 12:54:44

0001 // SPDX-FileCopyrightText: 2020 Tobias Fella <tobias.fella@kde.org>
0002 // SPDX-License-Identifier: GPL-2.0-or-later
0003 
0004 #include "sortfilterroomlistmodel.h"
0005 
0006 #include "roomlistmodel.h"
0007 #include "spacehierarchycache.h"
0008 
0009 SortFilterRoomListModel::SortFilterRoomListModel(QObject *parent)
0010     : QSortFilterProxyModel(parent)
0011 {
0012     sort(0);
0013     invalidateFilter();
0014     connect(this, &SortFilterRoomListModel::filterTextChanged, this, [this]() {
0015         invalidateFilter();
0016     });
0017 }
0018 
0019 void SortFilterRoomListModel::setRoomSortOrder(SortFilterRoomListModel::RoomSortOrder sortOrder)
0020 {
0021     m_sortOrder = sortOrder;
0022     Q_EMIT roomSortOrderChanged();
0023     if (sortOrder == SortFilterRoomListModel::Alphabetical) {
0024         setSortRole(RoomListModel::DisplayNameRole);
0025     } else if (sortOrder == SortFilterRoomListModel::LastActivity) {
0026         setSortRole(RoomListModel::LastActiveTimeRole);
0027     }
0028     invalidate();
0029 }
0030 
0031 SortFilterRoomListModel::RoomSortOrder SortFilterRoomListModel::roomSortOrder() const
0032 {
0033     return m_sortOrder;
0034 }
0035 
0036 bool SortFilterRoomListModel::lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const
0037 {
0038     if (m_sortOrder == SortFilterRoomListModel::LastActivity) {
0039         // display favorite rooms always on top
0040         const auto categoryLeft = static_cast<NeoChatRoomType::Types>(sourceModel()->data(source_left, RoomListModel::CategoryRole).toInt());
0041         const auto categoryRight = static_cast<NeoChatRoomType::Types>(sourceModel()->data(source_right, RoomListModel::CategoryRole).toInt());
0042 
0043         if (categoryLeft == NeoChatRoomType::Types::Favorite && categoryRight == NeoChatRoomType::Types::Favorite) {
0044             return sourceModel()->data(source_left, RoomListModel::LastActiveTimeRole).toDateTime()
0045                 > sourceModel()->data(source_right, RoomListModel::LastActiveTimeRole).toDateTime();
0046         }
0047         if (categoryLeft == NeoChatRoomType::Types::Favorite) {
0048             return true;
0049         } else if (categoryRight == NeoChatRoomType::Types::Favorite) {
0050             return false;
0051         }
0052 
0053         return sourceModel()->data(source_left, RoomListModel::LastActiveTimeRole).toDateTime()
0054             > sourceModel()->data(source_right, RoomListModel::LastActiveTimeRole).toDateTime();
0055     }
0056     if (m_sortOrder != SortFilterRoomListModel::Categories) {
0057         return QSortFilterProxyModel::lessThan(source_left, source_right);
0058     }
0059     if (sourceModel()->data(source_left, RoomListModel::CategoryRole) != sourceModel()->data(source_right, RoomListModel::CategoryRole)) {
0060         return sourceModel()->data(source_left, RoomListModel::CategoryRole).toInt() < sourceModel()->data(source_right, RoomListModel::CategoryRole).toInt();
0061     }
0062     return sourceModel()->data(source_left, RoomListModel::LastActiveTimeRole).toDateTime()
0063         > sourceModel()->data(source_right, RoomListModel::LastActiveTimeRole).toDateTime();
0064 }
0065 
0066 void SortFilterRoomListModel::setFilterText(const QString &text)
0067 {
0068     m_filterText = text;
0069     Q_EMIT filterTextChanged();
0070 }
0071 
0072 QString SortFilterRoomListModel::filterText() const
0073 {
0074     return m_filterText;
0075 }
0076 
0077 bool SortFilterRoomListModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const
0078 {
0079     Q_UNUSED(source_parent);
0080 
0081     bool acceptRoom =
0082         sourceModel()->data(sourceModel()->index(source_row, 0), RoomListModel::DisplayNameRole).toString().contains(m_filterText, Qt::CaseInsensitive)
0083         && sourceModel()->data(sourceModel()->index(source_row, 0), RoomListModel::JoinStateRole).toString() != "upgraded"
0084         && sourceModel()->data(sourceModel()->index(source_row, 0), RoomListModel::IsSpaceRole).toBool() == false;
0085 
0086     if (m_activeSpaceId.isEmpty()) {
0087         return acceptRoom;
0088     } else {
0089         const auto &rooms = SpaceHierarchyCache::instance().getRoomListForSpace(m_activeSpaceId, false);
0090         return std::find(rooms.begin(), rooms.end(), sourceModel()->data(sourceModel()->index(source_row, 0), RoomListModel::RoomIdRole).toString())
0091             != rooms.end()
0092             && acceptRoom;
0093     }
0094 }
0095 
0096 QString SortFilterRoomListModel::activeSpaceId() const
0097 {
0098     return m_activeSpaceId;
0099 }
0100 
0101 void SortFilterRoomListModel::setActiveSpaceId(const QString &spaceId)
0102 {
0103     m_activeSpaceId = spaceId;
0104     Q_EMIT activeSpaceIdChanged();
0105     invalidate();
0106 }
0107 
0108 #include "moc_sortfilterroomlistmodel.cpp"