/
erhoof
/
telegraf
Обзор
Документация
Войти
/
erhoof
/
telegraf
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
develop
src/data/chatlistmodel.h
176 строк
7 KB
Nikolay Sinyov
Сделал правильный вывод кол-ва непрочитанных тем в форумах в списке чатов
14 сен 2025, 16:12
14 сен 2025, 16:12
b98158c
Код
Авторство
О чём код?
#pragma once #include <QObject> #include <QAbstractListModel> #include <QSortFilterProxyModel> #include "../tdlib/tdlibresponsehandler.h" #include "appsettings.h" #include "chatdata.h" namespace { const char ID[] = "id"; const char DATE[] = "date"; const char TEXT[] = "text"; const char TYPE[] = "type"; const char TITLE[] = "title"; const char PHOTO[] = "photo"; const char SMALL[] = "small"; const char ORDER[] = "order"; const char CHAT_ID[] = "chat_id"; const char CONTENT[] = "content"; const char LAST_MESSAGE[] = "last_message"; const char CONTAINS_UNREAD_MENTION[] = "contains_unread_mention"; const char DRAFT_MESSAGE[] = "draft_message"; const char SENDER_ID[] = "sender_id"; const char USER_ID[] = "user_id"; const char BASIC_GROUP_ID[] = "basic_group_id"; const char SUPERGROUP_ID[] = "supergroup_id"; const char UNREAD_COUNT[] = "unread_count"; const char UNREAD_MENTION_COUNT[] = "unread_mention_count"; const char UNREAD_REACTION_COUNT[] = "unread_reaction_count"; const char AVAILABLE_REACTIONS[] = "available_reactions"; const char NOTIFICATION_SETTINGS[] = "notification_settings"; const char LAST_READ_INBOX_MESSAGE_ID[] = "last_read_inbox_message_id"; const char LAST_READ_OUTBOX_MESSAGE_ID[] = "last_read_outbox_message_id"; const char SENDING_STATE[] = "sending_state"; const char IS_CHANNEL[] = "is_channel"; const char IS_FORUM[] = "is_forum"; const char IS_VIEW_AS_TOPICS[] = "view_as_topics"; const char IS_VERIFIED[] = "is_verified"; const char IS_MARKED_AS_UNREAD[] = "is_marked_as_unread"; const char IS_PINNED[] = "is_pinned"; const char PINNED_MESSAGE_ID[] = "pinned_message_id"; const char _TYPE[] = "@type"; const char SECRET_CHAT_ID[] = "secret_chat_id"; const char IS_ARCHIVED[] = "is_archived"; } class ChatListModel : public QAbstractListModel { Q_OBJECT Q_PROPERTY(bool showAllChats READ showAllChats WRITE setShowAllChats NOTIFY showAllChatsChanged) Q_PROPERTY(int count READ rowCount NOTIFY countChanged) public: enum Role { RoleDisplay = Qt::DisplayRole, RoleChatId, RoleChatType, RoleGroupId, RoleTitle, RoleOrder, RolePhotoSmall, RoleUnreadCount, RoleUnreadMentionCount, RoleUnreadReactionCount, RoleAvailableReactions, RoleLastReadInboxMessageId, RoleLastMessageSenderId, RoleLastMessageDate, RoleLastMessageText, RoleLastMessageStatus, RoleChatMemberStatus, RoleSecretChatState, RoleIsVerified, RoleIsChannel, RoleIsForum, RoleIsGroup, RoleIsBasicGroup, RoleIsSuperGroup, RoleIsPrivateChat, RoleIsContact, RoleIsBot, RoleIsMarkedAsUnread, RoleIsPinned, RoleIsArchived, RoleIsMuted, RoleFilter, RoleDraftMessageText, RoleDraftMessageDate, RoleIsRKNVerified }; static QObject* getSingleton(QQmlEngine*, QJSEngine*) { return instance; } static ChatListModel* getInstance() { return instance; }; explicit ChatListModel(QObject *parent = Q_NULLPTR); ~ChatListModel() override; QHash<int,QByteArray> roleNames() const Q_DECL_OVERRIDE; int rowCount(const QModelIndex &index = QModelIndex()) const Q_DECL_OVERRIDE; QVariant data(const QModelIndex &index, int role) const Q_DECL_OVERRIDE; Q_INVOKABLE QVariantMap get(int row); Q_INVOKABLE QVariantMap getById(qlonglong chatId); Q_INVOKABLE void reset(); bool showAllChats() const; void setShowAllChats(bool showAll); ChatListModel* clone(); Q_INVOKABLE ChatData* getChatData(int row); bool isChatPinnedInMainList(qlonglong chatId) { return pinnedChats[chatId]; } private slots: void handleChatDiscovered(const QString &chatId, const QVariantMap &chatInformation); void handleChatLastMessageUpdated(const QString &chatId, const QString &order, const QVariantMap &lastMessage); void handleChatOrderUpdated(const QString &chatId, const QString &order, const QString &chatListName); void handleChatReadInboxUpdated(const QString &chatId, const QString &lastReadInboxMessageId, int unreadCount); void handleChatReadOutboxUpdated(const QString &chatId, const QString &lastReadOutboxMessageId); void handleChatPhotoUpdated(qlonglong chatId, const QVariantMap &photo); void handleChatPinnedMessageUpdated(qlonglong chatId, qlonglong pinnedMessageId); void handleMessageSendSucceeded(qlonglong messageId, qlonglong oldMessageId, const QVariantMap &message); void handleChatNotificationSettingsUpdated(const QString &chatId, const QVariantMap &chatNotificationSettings); void handleGroupUpdated(qlonglong groupId); void handleUserUpdated(qlonglong userId); void handleSecretChatUpdated(qlonglong secretChatId, const QVariantMap &secretChat); void handleChatTitleUpdated(const QString &chatId, const QString &title); void handleChatPinnedUpdated(qlonglong chatId, bool chatIsPinned, const QString &chatListName); void handleChatIsMarkedAsUnreadUpdated(qlonglong chatId, bool chatIsMarkedAsUnread); void handleChatDraftMessageUpdated(qlonglong chatId, const QVariantMap &draftMessage, const QString &order); void handleChatUnreadMentionCountUpdated(qlonglong chatId, int unreadMentionCount); void handleChatUnreadReactionCountUpdated(qlonglong chatId, int unreadReactionCount); void handleChatAvailableReactionsUpdated(qlonglong chatId, const QVariantMap availableReactions); void handleRelativeTimeRefreshTimer(); void handleRequestSortTimer(); void handleChatInsertionLessThanBufferTimer(); void handleUpdateChatInArchive(const qlonglong chatID); void handleReceivedForumTopics(const QVariantMap &fullTopicList); signals: void countChanged(); void showAllChatsChanged(); void chatJoined(const qlonglong &chatId, const QString &chatTitle); void unreadStateChanged(int unreadMessagesCount, int unreadChatsCount); void requestSort(); void unmutedChatLastMessageUpdated(ChatData *chatData); void unmutedChatLastMessageCleared(qlonglong chatId); private: void addVisibleChat(ChatData *chat); void addChatsFromBuffer(); void updateChatVisibility(const GroupModel *group); void updateSecretChatVisibility(const QVariantMap secretChatDetails); void enableRefreshTimer(); void emitUnmutedChatLastMessageChangedIfNeeded(const ChatData* chat); bool isGetForumTopics(qlonglong id); const int chatBufferSize = 100; private: QTimer *relativeTimeRefreshTimer; QTimer *requestSortTimer; QTimer *chatInsertionLessThanBufferTimer; QList<ChatData*> chatList; QList<ChatData*> addedChatBuffer; QHash<qlonglong,bool> pinnedChats; QHash<qlonglong,int> chatIndexMap; QHash<qlonglong,ChatData*> hiddenChats; bool showHiddenChats; int lastChatCount = 0; bool sortRequestedOnce = false; static ChatListModel* instance; };