From 946491a5964bbfa9c0570fb9360f043e1c9dab24 Mon Sep 17 00:00:00 2001
From: Andreas Traczyk <andreas.traczyk@savoirfairelinux.com>
Date: Fri, 16 Apr 2021 13:54:22 -0400
Subject: [PATCH] conversationsadapter: replace signal reconnect with unique
 connect

Change-Id: I34b1dca62ad5b28b49ddf319c4ea9724efd66b21
---
 src/conversationsadapter.cpp | 171 ++++++++++++++++++-----------------
 src/conversationsadapter.h   |  15 ---
 2 files changed, 87 insertions(+), 99 deletions(-)

diff --git a/src/conversationsadapter.cpp b/src/conversationsadapter.cpp
index 427ae9ebf..e13c3a7ab 100644
--- a/src/conversationsadapter.cpp
+++ b/src/conversationsadapter.cpp
@@ -155,7 +155,6 @@ ConversationsAdapter::deselectConversation()
 void
 ConversationsAdapter::onCurrentAccountIdChanged()
 {
-    disconnectConversationModel();
     connectConversationModel();
 
     setProperty("currentTypeFilter",
@@ -265,8 +264,11 @@ ConversationsAdapter::connectConversationModel(bool updateFilter)
     // Signal connections
     auto currentConversationModel = lrcInstance_->getCurrentConversationModel();
 
-    modelSortedConnection_ = QObject::connect(
-        currentConversationModel, &lrc::api::ConversationModel::modelChanged, [this]() {
+    QObject::connect(
+        currentConversationModel,
+        &lrc::api::ConversationModel::modelChanged,
+        this,
+        [this]() {
             conversationSmartListModel_->fillConversationsList();
             updateConversationsFilterWidget();
 
@@ -284,76 +286,94 @@ ConversationsAdapter::connectConversationModel(bool updateFilter)
                 return;
             }
             Q_EMIT modelSorted(QVariant::fromValue(convInfo.uid));
-        });
-
-    contactProfileUpdatedConnection_
-        = QObject::connect(lrcInstance_->getCurrentAccountInfo().contactModel.get(),
-                           &lrc::api::ContactModel::profileUpdated,
-                           [this](const QString& contactUri) {
-                               conversationSmartListModel_->updateContactAvatarUid(contactUri);
-                               Q_EMIT updateListViewRequested();
-                           });
-
-    modelUpdatedConnection_ = QObject::connect(currentConversationModel,
-                                               &lrc::api::ConversationModel::conversationUpdated,
-                                               [this](const QString&) {
-                                                   updateConversationsFilterWidget();
-                                                   Q_EMIT updateListViewRequested();
-                                               });
-
-    filterChangedConnection_
-        = QObject::connect(currentConversationModel,
-                           &lrc::api::ConversationModel::filterChanged,
-                           [this]() {
-                               conversationSmartListModel_->fillConversationsList();
-                               updateConversationsFilterWidget();
-                               if (!lrcInstance_->get_selectedConvUid().isEmpty())
-                                   Q_EMIT indexRepositionRequested();
-                               Q_EMIT updateListViewRequested();
-                           });
-
-    newConversationConnection_ = QObject::connect(currentConversationModel,
-                                                  &lrc::api::ConversationModel::newConversation,
-                                                  [this](const QString& convUid) {
-                                                      conversationSmartListModel_
-                                                          ->fillConversationsList();
-                                                      updateConversationForNewContact(convUid);
-                                                  });
-
-    conversationRemovedConnection_
-        = QObject::connect(currentConversationModel,
-                           &lrc::api::ConversationModel::conversationRemoved,
-                           [this]() { backToWelcomePage(); });
-
-    conversationClearedConnection
-        = QObject::connect(currentConversationModel,
-                           &lrc::api::ConversationModel::conversationCleared,
-                           [this](const QString& convUid) {
-                               // If currently selected, switch to welcome screen (deselecting
-                               // current smartlist item).
-                               if (convUid != lrcInstance_->get_selectedConvUid()) {
-                                   return;
-                               }
-                               backToWelcomePage();
-                           });
-
-    searchStatusChangedConnection_
-        = QObject::connect(currentConversationModel,
-                           &lrc::api::ConversationModel::searchStatusChanged,
-                           [this](const QString& status) { Q_EMIT showSearchStatus(status); });
+        },
+        Qt::UniqueConnection);
+
+    QObject::connect(
+        lrcInstance_->getCurrentAccountInfo().contactModel.get(),
+        &lrc::api::ContactModel::profileUpdated,
+        this,
+        [this](const QString& contactUri) {
+            conversationSmartListModel_->updateContactAvatarUid(contactUri);
+            Q_EMIT updateListViewRequested();
+        },
+        Qt::UniqueConnection);
+
+    QObject::connect(
+        currentConversationModel,
+        &lrc::api::ConversationModel::conversationUpdated,
+        this,
+        [this](const QString&) {
+            updateConversationsFilterWidget();
+            Q_EMIT updateListViewRequested();
+        },
+        Qt::UniqueConnection);
+
+    QObject::connect(
+        currentConversationModel,
+        &lrc::api::ConversationModel::filterChanged,
+        this,
+        [this]() {
+            conversationSmartListModel_->fillConversationsList();
+            updateConversationsFilterWidget();
+            if (!lrcInstance_->get_selectedConvUid().isEmpty())
+                Q_EMIT indexRepositionRequested();
+            Q_EMIT updateListViewRequested();
+        },
+        Qt::UniqueConnection);
+
+    QObject::connect(
+        currentConversationModel,
+        &lrc::api::ConversationModel::newConversation,
+        this,
+        [this](const QString& convUid) {
+            conversationSmartListModel_->fillConversationsList();
+            updateConversationForNewContact(convUid);
+        },
+        Qt::UniqueConnection);
+
+    QObject::connect(
+        currentConversationModel,
+        &lrc::api::ConversationModel::conversationRemoved,
+        this,
+        [this]() { backToWelcomePage(); },
+        Qt::UniqueConnection);
+
+    QObject::connect(
+        currentConversationModel,
+        &lrc::api::ConversationModel::conversationCleared,
+        this,
+        [this](const QString& convUid) {
+            // If currently selected, switch to welcome screen (deselecting
+            // current smartlist item).
+            if (convUid != lrcInstance_->get_selectedConvUid()) {
+                return;
+            }
+            backToWelcomePage();
+        },
+        Qt::UniqueConnection);
+
+    QObject::connect(
+        currentConversationModel,
+        &lrc::api::ConversationModel::searchStatusChanged,
+        this,
+        [this](const QString& status) { Q_EMIT showSearchStatus(status); },
+        Qt::UniqueConnection);
 
     // This connection is ideal when separated search results list.
     // This signal is guaranteed to fire just after filterChanged during a search if results are
     // changed, and once before filterChanged when calling setFilter.
     // NOTE: Currently, when searching, the entire conversation list will be copied 2-3 times each
     // keystroke :/.
-    searchResultUpdatedConnection_
-        = QObject::connect(currentConversationModel,
-                           &lrc::api::ConversationModel::searchResultUpdated,
-                           [this]() {
-                               conversationSmartListModel_->fillConversationsList();
-                               Q_EMIT updateListViewRequested();
-                           });
+    QObject::connect(
+        currentConversationModel,
+        &lrc::api::ConversationModel::searchResultUpdated,
+        this,
+        [this]() {
+            conversationSmartListModel_->fillConversationsList();
+            Q_EMIT updateListViewRequested();
+        },
+        Qt::UniqueConnection);
 
     if (updateFilter) {
         currentTypeFilter_ = lrc::api::profile::Type::INVALID;
@@ -361,23 +381,6 @@ ConversationsAdapter::connectConversationModel(bool updateFilter)
     return true;
 }
 
-void
-ConversationsAdapter::disconnectConversationModel()
-{
-    QObject::disconnect(modelSortedConnection_);
-    QObject::disconnect(modelUpdatedConnection_);
-    QObject::disconnect(filterChangedConnection_);
-    QObject::disconnect(newConversationConnection_);
-    QObject::disconnect(conversationRemovedConnection_);
-    QObject::disconnect(conversationClearedConnection);
-    QObject::disconnect(selectedCallChanged_);
-    QObject::disconnect(smartlistSelectionConnection_);
-    QObject::disconnect(interactionRemovedConnection_);
-    QObject::disconnect(searchStatusChangedConnection_);
-    QObject::disconnect(searchResultUpdatedConnection_);
-    QObject::disconnect(contactProfileUpdatedConnection_);
-}
-
 void
 ConversationsAdapter::updateConversationForNewContact(const QString& convUid)
 {
diff --git a/src/conversationsadapter.h b/src/conversationsadapter.h
index 8a995816e..d9af3df4b 100644
--- a/src/conversationsadapter.h
+++ b/src/conversationsadapter.h
@@ -44,7 +44,6 @@ protected:
 
 public:
     Q_INVOKABLE bool connectConversationModel(bool updateFilter = true);
-    Q_INVOKABLE void disconnectConversationModel();
     Q_INVOKABLE void selectConversation(const QString& accountId, const QString& uid);
     Q_INVOKABLE void deselectConversation();
     Q_INVOKABLE void refill();
@@ -82,19 +81,5 @@ private:
 
     lrc::api::profile::Type currentTypeFilter_ {};
 
-    // Connections.
-    QMetaObject::Connection modelSortedConnection_;
-    QMetaObject::Connection modelUpdatedConnection_;
-    QMetaObject::Connection filterChangedConnection_;
-    QMetaObject::Connection newConversationConnection_;
-    QMetaObject::Connection conversationRemovedConnection_;
-    QMetaObject::Connection conversationClearedConnection;
-    QMetaObject::Connection contactProfileUpdatedConnection_;
-    QMetaObject::Connection selectedCallChanged_;
-    QMetaObject::Connection smartlistSelectionConnection_;
-    QMetaObject::Connection interactionRemovedConnection_;
-    QMetaObject::Connection searchStatusChangedConnection_;
-    QMetaObject::Connection searchResultUpdatedConnection_;
-
     SystemTray* systemTray_;
 };
-- 
GitLab