diff --git a/src/app/currentconversation.cpp b/src/app/currentconversation.cpp index ce3b59fe4c4a173448a5120290b28e37544b5d95..6e2c92edf65b51815da4e0b2129b4ac9861cf4c2 100644 --- a/src/app/currentconversation.cpp +++ b/src/app/currentconversation.cpp @@ -52,10 +52,23 @@ CurrentConversation::updateData() { auto convId = lrcInstance_->get_selectedConvUid(); - auto cleanup = qScopeGuard([&] { - set_id(convId); + // If the conversation is empty, clear the id and return. + if (convId.isEmpty()) { + set_id(); + return; + } + + // We need to emit the id changed signal after other properties have been updated. + // We also need to set the id_ member variable before updating the other properties. + auto cleanup = qScopeGuard([&, previousId = id_] { + // Only emit the id changed signal if the id has changed. + if (id_ != previousId) + Q_EMIT idChanged(); + updateErrors(convId); }); + // Now we can change the id without emitting the signal. + id_ = convId; try { auto accountId = lrcInstance_->get_currentAccountId(); @@ -87,7 +100,6 @@ CurrentConversation::updateData() set_isCoreDialog(convInfo.isCoreDialog()); set_isRequest(convInfo.isRequest); set_needsSyncing(convInfo.needsSyncing); - updateConversationPreferences(convId); set_isSip(accInfo.profileInfo.type == profile::Type::SIP); set_callId(convInfo.getCallId()); set_allMessagesLoaded(convInfo.allMessagesLoaded); @@ -130,7 +142,8 @@ CurrentConversation::updateData() set_modeString(tr("Public group")); } - onProfileUpdated(convId); + updateConversationPreferences(convId); + updateProfile(convId); updateActiveCalls(accountId, convId); } catch (...) { qWarning() << "Can't update current conversation data for" << convId; @@ -140,7 +153,7 @@ CurrentConversation::updateData() void CurrentConversation::onNeedsHost(const QString& convId) { - if (id_ != convId) + if (convId != id_) return; Q_EMIT needsHost(); } @@ -197,17 +210,15 @@ CurrentConversation::uris() const void CurrentConversation::onConversationUpdated(const QString& convId) { - // filter for our currently set id - if (id_ != convId) + if (convId != id_) return; updateData(); } void -CurrentConversation::onProfileUpdated(const QString& convId) +CurrentConversation::updateProfile(const QString& convId) { - // filter for our currently set id - if (id_ != convId) + if (convId != id_) return; const auto& convModel = lrcInstance_->getCurrentConversationModel(); set_title(convModel->title(convId)); @@ -235,7 +246,7 @@ CurrentConversation::onProfileUpdated(const QString& convId) void CurrentConversation::updateConversationPreferences(const QString& convId) { - if (convId != lrcInstance_->get_selectedConvUid()) + if (convId != id_) return; auto accountId = lrcInstance_->get_currentAccountId(); const auto& accInfo = lrcInstance_->accountModel().getAccountInfo(accountId); @@ -267,7 +278,7 @@ CurrentConversation::connectModel() connect(lrcInstance_->getCurrentConversationModel(), &ConversationModel::profileUpdated, this, - &CurrentConversation::onProfileUpdated, + &CurrentConversation::updateProfile, Qt::UniqueConnection); connect(lrcInstance_->getCurrentConversationModel(), &ConversationModel::onConversationErrorsUpdated, @@ -305,7 +316,7 @@ CurrentConversation::showSwarmDetails() void CurrentConversation::updateErrors(const QString& convId) { - if (convId != id_ || convId.isEmpty()) + if (convId != id_) return; try { QStringList newErrors; diff --git a/src/app/currentconversation.h b/src/app/currentconversation.h index a6245f7a294d1d7533357f06fb972204615c587b..4c3a4eb514211d8805cd4edbbb93f8a7a0af26ef 100644 --- a/src/app/currentconversation.h +++ b/src/app/currentconversation.h @@ -76,7 +76,7 @@ private Q_SLOTS: void updateData(); void onNeedsHost(const QString& convId); void onConversationUpdated(const QString& convId); - void onProfileUpdated(const QString& convId); + void updateProfile(const QString& convId); void updateErrors(const QString& convId); void updateConversationPreferences(const QString& convId); void updateActiveCalls(const QString&, const QString& convId);