summary refs log tree commit diff
path: root/src/timeline/RoomlistModel.h
blob: c3374bd28c790fc166d164b674b1e92d1b792d21 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
// SPDX-FileCopyrightText: 2021 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later

#pragma once

#include <QAbstractListModel>
#include <QHash>
#include <QSharedPointer>
#include <QSortFilterProxyModel>
#include <QString>

#include <mtx/responses/sync.hpp>

class TimelineModel;
class TimelineViewManager;

class RoomlistModel : public QAbstractListModel
{
        Q_OBJECT
public:
        enum Roles
        {
                AvatarUrl = Qt::UserRole,
                RoomName,
                RoomId,
                LastMessage,
                Time,
                Timestamp,
                HasUnreadMessages,
                HasLoudNotification,
                NotificationCount,
                IsInvite,
                IsSpace,
        };

        RoomlistModel(TimelineViewManager *parent = nullptr);
        QHash<int, QByteArray> roleNames() const override;
        int rowCount(const QModelIndex &parent = QModelIndex()) const override
        {
                (void)parent;
                return (int)roomids.size();
        }
        QVariant data(const QModelIndex &index, int role) const override;
        QSharedPointer<TimelineModel> getRoomById(QString id) const
        {
                if (models.contains(id))
                        return models.value(id);
                else
                        return {};
        }

public slots:
        void initializeRooms(const std::vector<QString> &roomids);
        void sync(const mtx::responses::Rooms &rooms);
        void clear();
        int roomidToIndex(QString roomid)
        {
                for (int i = 0; i < (int)roomids.size(); i++) {
                        if (roomids[i] == roomid)
                                return i;
                }

                return -1;
        }

private slots:
        void updateReadStatus(const std::map<QString, bool> roomReadStatus_);

signals:
        void totalUnreadMessageCountUpdated(int unreadMessages);

private:
        void addRoom(const QString &room_id, bool suppressInsertNotification = false);

        TimelineViewManager *manager = nullptr;
        std::vector<QString> roomids;
        QHash<QString, QSharedPointer<TimelineModel>> models;
        std::map<QString, bool> roomReadStatus;

        friend class FilteredRoomlistModel;
};

class FilteredRoomlistModel : public QSortFilterProxyModel
{
        Q_OBJECT
public:
        FilteredRoomlistModel(RoomlistModel *model, QObject *parent = nullptr);
        bool lessThan(const QModelIndex &left, const QModelIndex &right) const override;

public slots:
        int roomidToIndex(QString roomid)
        {
                return mapFromSource(roomlistmodel->index(roomlistmodel->roomidToIndex(roomid)))
                  .row();
        }

private:
        short int calculateImportance(const QModelIndex &idx) const;
        RoomlistModel *roomlistmodel;
        bool sortByImportance = true;
};