File indexing completed on 2024-12-08 07:33:47
0001 // SPDX-FileCopyrightText: 2021 Tobias Fella <tobias.fella@kde.org> 0002 // SPDX-License-Identifier: LGPL-2.0-or-later 0003 0004 #pragma once 0005 0006 #include "events/imagepackevent.h" 0007 #include "neochatroom.h" 0008 #include <QAbstractListModel> 0009 #include <QList> 0010 #include <QObject> 0011 #include <QQmlEngine> 0012 0013 class ImagePacksModel; 0014 0015 /** 0016 * @class StickerModel 0017 * 0018 * A model to visualise a set of stickers. 0019 * 0020 * The stickers are obtained from a Matrix image pack. See Matrix MSC2545 for more details. 0021 * https://github.com/Sorunome/matrix-doc/blob/soru/emotes/proposals/2545-emotes.md 0022 */ 0023 class StickerModel : public QAbstractListModel 0024 { 0025 Q_OBJECT 0026 QML_ELEMENT 0027 0028 /** 0029 * @brief The image pack that the stickers come from. 0030 * 0031 * @sa ImagePacksModel 0032 */ 0033 Q_PROPERTY(ImagePacksModel *model READ model WRITE setModel NOTIFY modelChanged) 0034 0035 /** 0036 * @brief The index of the pack in the ImagePacksModel. 0037 * 0038 * @sa ImagePacksModel 0039 */ 0040 Q_PROPERTY(int packIndex READ packIndex WRITE setPackIndex NOTIFY packIndexChanged) 0041 0042 /** 0043 * @brief The current room that the model is being used in. 0044 */ 0045 Q_PROPERTY(NeoChatRoom *room READ room WRITE setRoom NOTIFY roomChanged) 0046 0047 public: 0048 /** 0049 * @brief Defines the model roles. 0050 */ 0051 enum Roles { 0052 UrlRole = Qt::UserRole + 1, /**< The source mxc URL for the image. */ 0053 BodyRole, /**< The image caption, if any. */ 0054 IsStickerRole, /**< Whether this emoticon is a sticker. */ 0055 IsEmojiRole, /**< Whether this emoticon is an emoji. */ 0056 }; 0057 0058 explicit StickerModel(QObject *parent = nullptr); 0059 0060 /** 0061 * @brief Get the given role value at the given index. 0062 * 0063 * @sa QAbstractItemModel::data 0064 */ 0065 [[nodiscard]] QVariant data(const QModelIndex &index, int role) const override; 0066 0067 /** 0068 * @brief Number of rows in the model. 0069 * 0070 * @sa QAbstractItemModel::rowCount 0071 */ 0072 [[nodiscard]] int rowCount(const QModelIndex &index) const override; 0073 0074 /** 0075 * @brief Returns a mapping from Role enum values to role names. 0076 * 0077 * @sa Roles, QAbstractItemModel::roleNames() 0078 */ 0079 [[nodiscard]] QHash<int, QByteArray> roleNames() const override; 0080 0081 [[nodiscard]] ImagePacksModel *model() const; 0082 void setModel(ImagePacksModel *model); 0083 0084 [[nodiscard]] int packIndex() const; 0085 void setPackIndex(int index); 0086 0087 [[nodiscard]] NeoChatRoom *room() const; 0088 void setRoom(NeoChatRoom *room); 0089 0090 /** 0091 * @brief Post the sticker at the given index as an event in the room. 0092 */ 0093 Q_INVOKABLE void postSticker(int index); 0094 0095 Q_SIGNALS: 0096 void roomChanged(); 0097 void modelChanged(); 0098 void packIndexChanged(); 0099 0100 private: 0101 ImagePacksModel *m_model = nullptr; 0102 int m_index = 0; 0103 QList<Quotient::ImagePackEventContent::ImagePackImage> m_images; 0104 NeoChatRoom *m_room; 0105 void reloadImages(); 0106 };