Avoid UI updates in Chat selection screen when forwarding a chat, by cloning the chat list model.

This commit is contained in:
Mikhail Barashkov 2024-06-15 14:14:35 +03:00
parent fd7563bc88
commit 23d361a987
4 changed files with 40 additions and 2 deletions

View file

@ -91,6 +91,7 @@ public:
QVector<int> updateLastMessage(const QVariantMap &message); QVector<int> updateLastMessage(const QVariantMap &message);
QVector<int> updateGroup(const TDLibWrapper::Group *group); QVector<int> updateGroup(const TDLibWrapper::Group *group);
QVector<int> updateSecretChat(const QVariantMap &secretChatDetails); QVector<int> updateSecretChat(const QVariantMap &secretChatDetails);
ChatData* clone();
TDLibWrapper *tdLibWrapper; TDLibWrapper *tdLibWrapper;
public: public:
@ -384,6 +385,24 @@ QVector<int> ChatListModel::ChatData::updateSecretChat(const QVariantMap &secret
return changedRoles; return changedRoles;
} }
ChatListModel::ChatData* ChatListModel::ChatData::clone() {
QVariantMap clonedChatData;
QList<QString> keys = chatData.keys();
for(int i = 0; i < keys.count(); i++) {
clonedChatData.insert(keys[i], QVariant(chatData[keys[i]]));
}
ChatData* res = new ChatData(tdLibWrapper, clonedChatData);
res->chatId = chatId;
res->order = order;
res->groupId = groupId;
res->verified = verified;
res->chatType = chatType;
res->memberStatus = memberStatus;
res->secretChatState = secretChatState;
return res;
}
ChatListModel::ChatListModel(TDLibWrapper *tdLibWrapper, AppSettings *appSettings) : showHiddenChats(false) ChatListModel::ChatListModel(TDLibWrapper *tdLibWrapper, AppSettings *appSettings) : showHiddenChats(false)
{ {
this->tdLibWrapper = tdLibWrapper; this->tdLibWrapper = tdLibWrapper;
@ -426,6 +445,15 @@ ChatListModel::~ChatListModel()
qDeleteAll(hiddenChats.values()); qDeleteAll(hiddenChats.values());
} }
ChatListModel* ChatListModel::clone() {
ChatListModel* res = new ChatListModel(tdLibWrapper, appSettings);
res->relativeTimeRefreshTimer->stop();
for(int i = 0; i < chatList.count(); i++) {
res->chatList.append(chatList.at(i)->clone());
}
return res;
}
void ChatListModel::reset() void ChatListModel::reset()
{ {
chatList.clear(); chatList.clear();

View file

@ -75,6 +75,7 @@ public:
bool showAllChats() const; bool showAllChats() const;
void setShowAllChats(bool showAll); void setShowAllChats(bool showAll);
ChatListModel* clone();
private slots: private slots:
void handleChatDiscovered(const QString &chatId, const QVariantMap &chatInformation); void handleChatDiscovered(const QString &chatId, const QVariantMap &chatInformation);

View file

@ -33,7 +33,9 @@ ChatPermissionFilterModel::ChatPermissionFilterModel(QObject *parent) : QSortFil
void ChatPermissionFilterModel::setSource(QObject *model) void ChatPermissionFilterModel::setSource(QObject *model)
{ {
setSourceModel(qobject_cast<ChatListModel*>(model)); ChatListModel* chatListModel = qobject_cast<ChatListModel*>(model);
ChatListModel* chatListModelClone = chatListModel->clone();
setSourceModel(chatListModelClone);
} }
void ChatPermissionFilterModel::setSourceModel(QAbstractItemModel *model) void ChatPermissionFilterModel::setSourceModel(QAbstractItemModel *model)
@ -45,6 +47,13 @@ void ChatPermissionFilterModel::setSourceModel(QAbstractItemModel *model)
} }
} }
ChatPermissionFilterModel::~ChatPermissionFilterModel() {
QAbstractItemModel* _sourceModel = sourceModel();
if(_sourceModel != nullptr) {
delete _sourceModel;
}
}
TDLibWrapper *ChatPermissionFilterModel::getTDLibWrapper() const TDLibWrapper *ChatPermissionFilterModel::getTDLibWrapper() const
{ {
return tdLibWrapper; return tdLibWrapper;

View file

@ -31,7 +31,7 @@ class ChatPermissionFilterModel : public QSortFilterProxyModel
public: public:
ChatPermissionFilterModel(QObject *parent = Q_NULLPTR); ChatPermissionFilterModel(QObject *parent = Q_NULLPTR);
~ChatPermissionFilterModel() override;
TDLibWrapper *getTDLibWrapper() const; TDLibWrapper *getTDLibWrapper() const;
void setTDLibWrapper(QObject* obj); void setTDLibWrapper(QObject* obj);