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"