File indexing completed on 2024-11-03 10:41:30

0001 // SPDX-FileCopyrightText: 2022 Tobias Fella <tobias.fella@kde.org>
0002 // SPDX-License-Identifier: LGPL-2.0-or-later
0003 
0004 #pragma once
0005 
0006 #include <QAbstractListModel>
0007 
0008 #include "neochatroom.h"
0009 
0010 /**
0011  * @class StateModel
0012  *
0013  * This class defines the model for visualising the state events in a room.
0014  */
0015 class StateModel : public QAbstractListModel
0016 {
0017     Q_OBJECT
0018 
0019     /**
0020      * @brief The current room that the model is getting its state events from.
0021      */
0022     Q_PROPERTY(NeoChatRoom *room READ room WRITE setRoom NOTIFY roomChanged)
0023 
0024 public:
0025     /**
0026      * @brief Defines the model roles.
0027      */
0028     enum Roles {
0029         TypeRole = 0, /**< The type of the state event. */
0030         StateKeyRole, /**< The state key of the state event. */
0031     };
0032     Q_ENUM(Roles)
0033 
0034     explicit StateModel(QObject *parent = nullptr);
0035 
0036     NeoChatRoom *room() const;
0037     void setRoom(NeoChatRoom *room);
0038 
0039     /**
0040      * @brief Get the given role value at the given index.
0041      *
0042      * @sa QAbstractItemModel::data
0043      */
0044     QVariant data(const QModelIndex &index, int role) const override;
0045 
0046     /**
0047      * @brief Number of rows in the model.
0048      *
0049      * @sa QAbstractItemModel::rowCount
0050      */
0051     int rowCount(const QModelIndex &parent) const override;
0052 
0053     /**
0054      * @brief Returns a mapping from Role enum values to role names.
0055      *
0056      * @sa Roles, QAbstractItemModel::roleNames()
0057      */
0058     QHash<int, QByteArray> roleNames() const override;
0059     /**
0060      * @brief Get the full JSON for an event.
0061      *
0062      * This is used to avoid having the model hold all the JSON data. The JSON for
0063      * a single item is only ever shown, no need to access simultaneously.
0064      */
0065     Q_INVOKABLE QByteArray stateEventJson(const QModelIndex &index);
0066 
0067 Q_SIGNALS:
0068     void roomChanged();
0069 
0070 private:
0071     NeoChatRoom *m_room = nullptr;
0072 
0073     /**
0074      * @brief The room state events in a QList.
0075      *
0076      * This is done for performance, accessing all the data from the parent QHash
0077      * was slower.
0078      */
0079     QList<std::pair<QString, QString>> m_stateEvents;
0080 };