diff --git a/src/app/accountadapter.cpp b/src/app/accountadapter.cpp index e022e70d34890c2796933eb593218659ab50068b..f70edbc483f6adb5455d122772e0a8978f815ba7 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 8ff685db73dcee5944273417d3ead86e0508cbf5..8ce2583a382db5a85f7dc2d048b0c282be9174cd 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 8e9ecaaa017bfb84076ef7924bd652a13b50a8c2..ea7484b09e00568105afe6c7300738f36fe53650 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 0a1114f3be99cf67460f1038a95ff6cebe13e2d7..c92d34e1462384012877a5f6ead6f54dbec2fd92 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 2dedd992cbff9aaf8ea71ea12724ee7d862b2870..d6f00540a16d97ab75865226f84df48182e60154 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 2a2e168d5ec03703ebdd073ed438f29d3ae39991..261ea2a20c187a42a0d5948056bc1ba9a1abc936 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_;