/
erhoof
/
telegraf
Обзор
Документация
Войти
/
erhoof
/
telegraf
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
develop
src/data/chatfoldersmodel.cpp
137 строк
5 KB
mbarashkov
Выводим в меню чатов два счётчика
06 авг 2025, 17:40
06 авг 2025, 17:40
fb2af42
Код
Авторство
О чём код?
#include "chatfoldersmodel.h" #include "../debuglog.h" ChatFoldersModel* ChatFoldersModel::instance; ChatFoldersModel::ChatFoldersModel(QObject *parent): QObject(parent), selectedChatFolderId(new ChatFolderId(this)) { connect(TDLibResponseHandler::getInstance(), SIGNAL(chatFolders(QVariantList,qlonglong)), this, SLOT(handleChatFolders(QVariantList,qlonglong))); connect(TDLibResponseHandler::getInstance(), SIGNAL(chatFolder(QVariantMap)), this, SLOT(handleChatFolderInformation(QVariantMap))); connect(TDLibResponseHandler::getInstance(), SIGNAL(unreadChatCountUpdated(QVariantMap)), this, SLOT(handleUnreadChatCountUpdated(QVariantMap))); ChatFoldersModel::instance = this; } void ChatFoldersModel::handleChatFolders(const QVariantList &foldersInformation, qlonglong mainAllChatFolderPosition) { QList<ChatFolderModel*> updatedChatFolders; for (const auto&folder: foldersInformation) { updatedChatFolders.append(new ChatFolderModel(folder.toMap(), ChatFolderId::Type::Generic, this)); } updatedChatFolders.insert(mainAllChatFolderPosition, new ChatFolderModel(0, tr("All Chats"), ChatFolderId::Type::AllChats, this)); updatedChatFolders.append(new ChatFolderModel(0, tr("Archive"), ChatFolderId::Type::Archive, this)); auto foldersUpdated = false; if(updatedChatFolders.count() != chatFolders.count()) { foldersUpdated = true; } else { for(auto i = 0; i < updatedChatFolders.count(); i++) { auto updatedChatFolder = updatedChatFolders[i]; auto currentChatFolder = qobject_cast<ChatFolderModel*>(chatFolders[i]); if((updatedChatFolder->getName() != currentChatFolder->getName()) || (updatedChatFolder->getType() != currentChatFolder->getType()) || (updatedChatFolder->getTdLibId() != currentChatFolder->getTdLibId()) ) { foldersUpdated = true; break; } } } if(foldersUpdated) { for(int i = 0; i < updatedChatFolders.size(); i++) { auto chatFolderId = ChatFolderId(updatedChatFolders[i]->getType(), updatedChatFolders[i]->getTdLibId()); auto foundFolder = findFolder(&chatFolderId); if(foundFolder != Q_NULLPTR) { qDebug() << "*** transferring unread count: " << foundFolder->getUnreadCount(); updatedChatFolders[i]->setUnreadCount(foundFolder->getUnreadCount()); } chatFolders.append(updatedChatFolders[i]); } chatFolders.clear(); for(int i = 0; i < updatedChatFolders.size(); i++) { chatFolders.append(updatedChatFolders[i]); } emit chatFoldersChanged(chatFolders); } } void ChatFoldersModel::handleChatFolderInformation(const QVariantMap &chatFolderInformation) { QString name = chatFolderInformation.value("name").toMap().value("text").toMap().value("text").toString(); // К сожалению, tdlib действительно не присылает ID чата: https://core.telegram.org/tdlib/docs/classtd_1_1td__api_1_1chat_folder.html auto folder = findFolder(name); if(folder != Q_NULLPTR) { if(folder->setProperties(chatFolderInformation)) { emit chatFolderChanged(folder); } } } void ChatFoldersModel::handleUnreadChatCountUpdated(const QVariantMap &chatFolderInformation) { auto chatId = chatFolderInformation["chat_folder_id"].toLongLong(); auto chatTypeString = chatFolderInformation["chat_list_type"].toString(); auto unreadCount = chatFolderInformation["unread_count"].toInt(); auto unreadUnmutedCount = chatFolderInformation["unread_unmuted_count"].toInt(); auto chatType = ChatFolderId::Generic; if(chatTypeString == "chatListArchive") { chatId = 0; chatType = ChatFolderId::Archive; } else if(chatTypeString == "chatListMain") { chatId = 0; chatType = ChatFolderId::AllChats; } auto chatFolderId = ChatFolderId(chatType, chatId); auto folder = findFolder(&chatFolderId); if(folder != Q_NULLPTR) { folder->setUnreadCount(unreadCount); folder->setUnreadUnmutedCount(unreadUnmutedCount); if(selectedChatFolderId->getType() == chatType && selectedChatFolderId->getTdLibId() == chatId) { emit selectedChatUnreadCountChanged(unreadCount); emit selectedChatUnreadUnmutedCountChanged(unreadUnmutedCount); } } } ChatFolderModel* ChatFoldersModel::findFolder(ChatFolderId* chatFolderId) const { if(chatFolderId == Q_NULLPTR) { return Q_NULLPTR; } auto tdLibId = chatFolderId->getTdLibId(); auto type = chatFolderId->getType(); for(int i = 0; i < chatFolders.size(); i++) { auto chatFolder = qobject_cast<ChatFolderModel*>(chatFolders[i]); if(chatFolder->getTdLibId() == tdLibId && chatFolder->getType() == type) { return chatFolder; } } return Q_NULLPTR; } ChatFolderModel* ChatFoldersModel::findFolder(QString name) const { if(name == Q_NULLPTR) { return Q_NULLPTR; } for(int i = 0; i < chatFolders.size(); i++) { auto chatFolder = qobject_cast<ChatFolderModel*>(chatFolders[i]); if(chatFolder->getName() == name) { return chatFolder; } } return Q_NULLPTR; }