diff --git a/src/conversationsadapter.cpp b/src/conversationsadapter.cpp index 20ab8c4f0e763e13d631b9e3a679ce92ff5b6674..4b638d3639259be9e4ebb463b16dcffd779c40f8 100644 --- a/src/conversationsadapter.cpp +++ b/src/conversationsadapter.cpp @@ -311,14 +311,30 @@ ConversationsAdapter::onSearchResultUpdated() } void -ConversationsAdapter::updateConversation(const QString& convId) +ConversationsAdapter::onConversationReady(const QString& convId) { - // a conversation request has been accepted or a contact has - // been added, so select the conversation and notify the UI to: - // - switch tabs to the conversation filter tab - // - clear search bar - Q_EMIT conversationReady(convId); - lrcInstance_->selectConversation(convId); + auto convModel = lrcInstance_->getCurrentConversationModel(); + auto& convInfo = lrcInstance_->getConversationFromConvUid(convId); + auto selectedConvId = lrcInstance_->get_selectedConvUid(); + + // for one to one conversations including legacy mode, we can prevent + // undesired selection by filtering for a conversation peer match, + // and for all other swarm convs, we can match the conv's id + if (convInfo.isCoreDialog()) { + auto peers = convModel->peersForConversation(convId); + auto selectedPeers = convModel->peersForConversation(selectedConvId); + if (peers != selectedPeers) + return; + } else if (convId != selectedConvId) + return; + + updateConversation(convId); +} + +void +ConversationsAdapter::onNeedsSyncingSet(const QString& convId) +{ + updateConversation(convId); } void @@ -334,6 +350,17 @@ ConversationsAdapter::onBannedStatusChanged(const QString& uri, bool banned) lrcInstance_->set_selectedConvUid(); } +void +ConversationsAdapter::updateConversation(const QString& convId) +{ + // a conversation request has been accepted or a contact has + // been added, so select the conversation and notify the UI to: + // - switch tabs to the conversation filter tab + // - clear search bar + Q_EMIT conversationReady(convId); + lrcInstance_->selectConversation(convId); +} + void ConversationsAdapter::updateConversationFilterData() { @@ -463,13 +490,13 @@ ConversationsAdapter::connectConversationModel() QObject::connect(currentConversationModel, &ConversationModel::conversationReady, this, - &ConversationsAdapter::updateConversation, + &ConversationsAdapter::onConversationReady, Qt::UniqueConnection); QObject::connect(currentConversationModel, &ConversationModel::needsSyncingSet, this, - &ConversationsAdapter::updateConversation, + &ConversationsAdapter::onNeedsSyncingSet, Qt::UniqueConnection); QObject::connect(lrcInstance_->getCurrentContactModel(), diff --git a/src/conversationsadapter.h b/src/conversationsadapter.h index 57ed6b83aae1c055fce8098881092ea0dffd0aaa..60a066100023b1728aa83b8d198fb7bb26ce5d09 100644 --- a/src/conversationsadapter.h +++ b/src/conversationsadapter.h @@ -81,9 +81,11 @@ private Q_SLOTS: void onConversationCleared(const QString&); void onSearchStatusChanged(const QString&); void onSearchResultUpdated(); - void updateConversation(const QString&); + void onConversationReady(const QString&); + void onNeedsSyncingSet(const QString&); void onBannedStatusChanged(const QString&, bool); + void updateConversation(const QString&); void updateConversationFilterData(); private: