From f67a181e8393039c22b5f0757b5c46f032137bcb Mon Sep 17 00:00:00 2001 From: Andreas Traczyk <andreas.traczyk@savoirfairelinux.com> Date: Mon, 5 Feb 2024 13:07:01 -0500 Subject: [PATCH] conversationsadapter: clear source models when removing account If we detect that the current account has been deleted, remove the proxy model source models immediately. Gitlab: #1557 Change-Id: Iaf84198438b54e44d31a46870acdfa9569be6daa --- src/app/accountadapter.cpp | 10 ++++++++++ src/app/accountadapter.h | 11 +++-------- src/app/conversationsadapter.cpp | 16 ++++++++++++++-- src/app/conversationsadapter.h | 2 +- src/app/lrcinstance.cpp | 16 +++++++++++++++- src/app/lrcinstance.h | 4 ++++ 6 files changed, 47 insertions(+), 12 deletions(-) diff --git a/src/app/accountadapter.cpp b/src/app/accountadapter.cpp index e022e70d3..f70edbc48 100644 --- a/src/app/accountadapter.cpp +++ b/src/app/accountadapter.cpp @@ -22,6 +22,8 @@ #include "appsettingsmanager.h" #include "qtutils.h" +#include "systemtray.h" +#include "lrcinstance.h" #include "accountlistmodel.h" #include <QtConcurrent/QtConcurrent> @@ -61,6 +63,14 @@ AccountAdapter::getModel() return &(lrcInstance_->accountModel()); } +AccountAdapter* +AccountAdapter::create(QQmlEngine*, QJSEngine*) +{ + return new AccountAdapter(qApp->property("AppSettingsManager").value<AppSettingsManager*>(), + qApp->property("SystemTray").value<SystemTray*>(), + qApp->property("LRCInstance").value<LRCInstance*>()); +} + void AccountAdapter::changeAccount(int row) { diff --git a/src/app/accountadapter.h b/src/app/accountadapter.h index 8ff685db7..8ce2583a3 100644 --- a/src/app/accountadapter.h +++ b/src/app/accountadapter.h @@ -20,8 +20,7 @@ #include "qmladapterbase.h" -#include "systemtray.h" -#include "lrcinstance.h" +#include "api/accountmodel.h" #include <QSettings> #include <QString> @@ -29,6 +28,7 @@ #include <QApplication> // QML registration class AppSettingsManager; +class SystemTray; class AccountAdapter final : public QmlAdapterBase { @@ -44,12 +44,7 @@ Q_SIGNALS: void modelChanged(); public: - static AccountAdapter* create(QQmlEngine*, QJSEngine*) - { - return new AccountAdapter(qApp->property("AppSettingsManager").value<AppSettingsManager*>(), - qApp->property("SystemTray").value<SystemTray*>(), - qApp->property("LRCInstance").value<LRCInstance*>()); - } + static AccountAdapter* create(QQmlEngine*, QJSEngine*); explicit AccountAdapter(AppSettingsManager* settingsManager, SystemTray* systemTray, diff --git a/src/app/conversationsadapter.cpp b/src/app/conversationsadapter.cpp index 8e9ecaaa0..ea7484b09 100644 --- a/src/app/conversationsadapter.cpp +++ b/src/app/conversationsadapter.cpp @@ -21,8 +21,6 @@ #include "qtutils.h" #include "systemtray.h" -#include "qmlregister.h" -#include "qtutils.h" #ifdef Q_OS_LINUX #include "namedirectory.h" @@ -139,6 +137,12 @@ ConversationsAdapter::ConversationsAdapter(SystemTray* systemTray, this, &ConversationsAdapter::onCurrentAccountIdChanged); + connect(lrcInstance_, + &LRCInstance::currentAccountRemoved, + this, + &ConversationsAdapter::onCurrentAccountRemoved, + Qt::DirectConnection); + connectConversationModel(); } @@ -595,6 +599,14 @@ ConversationsAdapter::openDialogConversationWith(const QString& peerUri) lrcInstance_->selectConversation(convInfo.uid); } +void +ConversationsAdapter::onCurrentAccountRemoved() +{ + // Unbind proxy model source models. + convModel_->bindSourceModel(nullptr); + searchModel_->bindSourceModel(nullptr); +} + void ConversationsAdapter::connectConversationModel() { diff --git a/src/app/conversationsadapter.h b/src/app/conversationsadapter.h index 0a1114f3b..c92d34e14 100644 --- a/src/app/conversationsadapter.h +++ b/src/app/conversationsadapter.h @@ -19,7 +19,6 @@ #pragma once -#include "lrcinstance.h" #include "qmladapterbase.h" #include "conversationlistmodel.h" #include "searchresultslistmodel.h" @@ -91,6 +90,7 @@ Q_SIGNALS: void conversationReady(const QString& convId); private Q_SLOTS: + void onCurrentAccountRemoved(); void onCurrentAccountIdChanged(); // cross-account slots diff --git a/src/app/lrcinstance.cpp b/src/app/lrcinstance.cpp index 2dedd992c..d6f00540a 100644 --- a/src/app/lrcinstance.cpp +++ b/src/app/lrcinstance.cpp @@ -70,6 +70,12 @@ LRCInstance::LRCInstance(migrateCallback willMigrateCb, set_currentAccountAvatarSet(!getCurrentAccountInfo().profileInfo.avatar.isEmpty()); }); + connect(&accountModel(), + &AccountModel::accountRemoved, + this, + &LRCInstance::onAccountRemoved, + Qt::DirectConnection); + // set the current account if any auto accountList = accountModel().getAccountList(); if (accountList.size()) { @@ -469,4 +475,12 @@ VectorMapStringString LRCInstance::getChannelList(const QString& accountId, const QString& uid) { return Lrc::getChannelList(accountId, uid); -} \ No newline at end of file +} + +void +LRCInstance::onAccountRemoved(const QString& accountId) +{ + if (accountId != currentAccountId_) + return; + Q_EMIT currentAccountRemoved(); +} diff --git a/src/app/lrcinstance.h b/src/app/lrcinstance.h index 2a2e168d5..261ea2a20 100644 --- a/src/app/lrcinstance.h +++ b/src/app/lrcinstance.h @@ -141,6 +141,7 @@ public: Q_SIGNALS: void accountListChanged(); + void currentAccountRemoved(); void selectedConvUidChanged(); void restoreAppRequested(); void notificationClicked(); @@ -148,6 +149,9 @@ Q_SIGNALS: void draftSaved(const QString& convId); void base64SwarmAvatarChanged(); +private Q_SLOTS: + void onAccountRemoved(const QString& accountId); + private: std::unique_ptr<Lrc> lrc_; std::unique_ptr<AppVersionManager> updateManager_; -- GitLab