File indexing completed on 2024-10-06 04:34:05
0001 /* 0002 0003 * SPDX-FileCopyrightText: 2016 Riccardo Iaconelli <riccardo@kde.org> 0004 * 0005 * SPDX-License-Identifier: LGPL-2.0-or-later 0006 * 0007 */ 0008 0009 #pragma once 0010 0011 #include "libruqolacore_export.h" 0012 #include "messages/message.h" 0013 #include <QAbstractListModel> 0014 #include <QPointer> 0015 0016 class RocketChatAccount; 0017 class LoadRecentHistoryManager; 0018 class Room; 0019 class LIBRUQOLACORE_EXPORT MessagesModel : public QAbstractListModel 0020 { 0021 Q_OBJECT 0022 public: 0023 struct LIBRUQOLACORE_EXPORT AttachmentAndUrlPreviewVisibility { 0024 bool show = false; 0025 QString ElementId; 0026 }; 0027 enum MessageRoles { 0028 Username = Qt::UserRole + 1, 0029 MessagePointer, 0030 OriginalMessage, 0031 MessageConvertedText, 0032 Timestamp, 0033 DateTimeUtc, 0034 UserId, 0035 SystemMessageType, 0036 MessageId, 0037 RoomId, 0038 UpdatedAt, 0039 EditedAt, 0040 EditedByUserName, 0041 EditedByUserId, 0042 EditedToolTip, 0043 Alias, 0044 Avatar, 0045 Groupable, 0046 ParseUrls, 0047 MessageType, 0048 Attachments, 0049 Urls, 0050 Date, 0051 DateDiffersFromPrevious, 0052 CanEditMessage, 0053 CanDeleteMessage, 0054 Starred, 0055 UsernameUrl, 0056 Roles, 0057 Reactions, 0058 Ignored, 0059 Pinned, 0060 DiscussionCount, 0061 DiscussionRoomId, 0062 DiscussionLastMessage, 0063 ThreadCount, 0064 ThreadLastMessage, 0065 ThreadMessageId, 0066 ThreadMessagePreview, 0067 ThreadMessage, 0068 ThreadMessageFollowed, 0069 ShowTranslatedMessage, 0070 DisplayAttachment, 0071 DisplayLastSeenMessage, 0072 DisplayUrlPreview, 0073 Emoji, 0074 AvatarInfo, 0075 PendingMessage, 0076 ShowIgnoredMessage, 0077 MessageInEditMode, 0078 DirectChannels, 0079 HoverHighLight, 0080 LocalTranslation, 0081 OriginalMessageOrAttachmentDescription, 0082 GoToMessageBackgroundColor, 0083 LastMessageRoles = GoToMessageBackgroundColor, 0084 }; 0085 Q_ENUM(MessageRoles) 0086 0087 explicit MessagesModel(const QString &roomID = QStringLiteral("no_room"), 0088 RocketChatAccount *account = nullptr, 0089 Room *room = nullptr, 0090 QObject *parent = nullptr); 0091 ~MessagesModel() override; 0092 0093 /** 0094 * @brief Adds a number of messages to the model 0095 * 0096 * @param messages The messages to be added 0097 */ 0098 void addMessages(const QVector<Message> &messages, bool insertListMessages = false); 0099 0100 /** 0101 * @brief returns number of messages in the model 0102 * 0103 * @param parent, it is void 0104 * @return int, The number of messages in QVector mAllMessages 0105 */ 0106 [[nodiscard]] int rowCount(const QModelIndex &parent = QModelIndex()) const override; 0107 0108 [[nodiscard]] QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; 0109 bool setData(const QModelIndex &index, const QVariant &value, int role) override; 0110 0111 /** 0112 * @brief Returns last timestamp of last message in QVector mAllMessages 0113 * 0114 * @return qint64 The last timestamp 0115 */ 0116 [[nodiscard]] qint64 lastTimestamp() const; 0117 0118 void deleteMessage(const QString &messageId); 0119 0120 [[nodiscard]] qint64 generateNewStartTimeStamp(qint64 lastTimeStamp); 0121 0122 void setRoomId(const QString &roomId); 0123 [[nodiscard]] bool isEmpty() const; 0124 0125 void clear(); 0126 0127 void changeShowOriginalMessage(const QString &messageId, bool showOriginal); 0128 0129 [[nodiscard]] QString roomId() const; 0130 0131 void activate(); 0132 void deactivate(); 0133 0134 [[nodiscard]] Message findLastMessageBefore(const QString &messageId, const std::function<bool(const Message &)> &predicate) const; 0135 [[nodiscard]] Message findNextMessageAfter(const QString &messageId, const std::function<bool(const Message &)> &predicate) const; 0136 [[nodiscard]] Message findMessageById(const QString &messageId) const; 0137 [[nodiscard]] QModelIndex indexForMessage(const QString &messageId) const; 0138 0139 [[nodiscard]] QString messageIdFromIndex(int rowIndex); 0140 0141 [[nodiscard]] QString searchText() const; 0142 void setSearchText(const QString &searchText); 0143 0144 [[nodiscard]] Message threadMessage(const QString &threadMessageId) const; 0145 0146 private: 0147 LIBRUQOLACORE_NO_EXPORT void slotFileDownloaded(const QString &filePath, const QUrl &cacheImageUrl); 0148 /** 0149 * @brief Adds a message to the model 0150 * 0151 * @param message The message to be added 0152 */ 0153 LIBRUQOLACORE_NO_EXPORT void addMessage(const Message &message); 0154 0155 LIBRUQOLACORE_NO_EXPORT void refresh(); 0156 [[nodiscard]] LIBRUQOLACORE_NO_EXPORT bool threadMessageFollowed(const QString &threadMessageId) const; 0157 [[nodiscard]] LIBRUQOLACORE_NO_EXPORT QStringList roomRoles(const QString &userId) const; 0158 [[nodiscard]] LIBRUQOLACORE_NO_EXPORT QString convertMessageText(const Message &message, 0159 const QString &userName, 0160 const QStringList &highlightWords, 0161 const QString &searchedText) const; 0162 [[nodiscard]] LIBRUQOLACORE_NO_EXPORT QString threadMessagePreview(const QString &threadMessageId) const; 0163 [[nodiscard]] LIBRUQOLACORE_NO_EXPORT QVector<Message>::iterator findMessage(const QString &messageId); 0164 [[nodiscard]] LIBRUQOLACORE_NO_EXPORT QVector<Message>::const_iterator findMessage(const QString &messageId) const; 0165 [[nodiscard]] LIBRUQOLACORE_NO_EXPORT QString convertedText(const Message &message, const QString &searchedText) const; 0166 0167 QString mSearchText; 0168 QString mRoomId; 0169 QVector<Message> mAllMessages; 0170 RocketChatAccount *mRocketChatAccount = nullptr; 0171 QPointer<Room> mRoom; 0172 std::unique_ptr<LoadRecentHistoryManager> mLoadRecentHistoryManager; 0173 }; 0174 Q_DECLARE_METATYPE(MessagesModel::AttachmentAndUrlPreviewVisibility) 0175 Q_DECLARE_TYPEINFO(MessagesModel::AttachmentAndUrlPreviewVisibility, Q_RELOCATABLE_TYPE);