From f0675434b9f691f8cc089e58722f373bfda01a0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Blin?= <sebastien.blin@savoirfairelinux.com> Date: Mon, 17 May 2021 14:45:32 -0400 Subject: [PATCH] misc: fixes Change-Id: I83161997e655cbb626f6577cedb53d3b67786c7f --- src/conversationlistmodelbase.cpp | 2 +- src/conversationsadapter.cpp | 26 +++---- src/conversationsadapter.h | 2 +- .../ConversationSmartListContextMenu.qml | 21 ++---- src/messagesadapter.cpp | 69 ++++++++++++++----- src/messagesadapter.h | 1 + src/webchathelpers.cpp | 8 ++- src/webchathelpers.h | 3 + 8 files changed, 81 insertions(+), 51 deletions(-) diff --git a/src/conversationlistmodelbase.cpp b/src/conversationlistmodelbase.cpp index b56da053a..b896f8db1 100644 --- a/src/conversationlistmodelbase.cpp +++ b/src/conversationlistmodelbase.cpp @@ -105,7 +105,7 @@ ConversationListModelBase::dataForItem(item_t item, int role) const return QVariant(static_cast<int>(contact.profileInfo.type)); } case Role::IsSwarm: { - return QVariant(item.mode != lrc::api::conversation::Mode::NON_SWARM); + return QVariant(!item.isNotASwarm()); } case Role::IsBanned: { return QVariant(contact.isBanned); diff --git a/src/conversationsadapter.cpp b/src/conversationsadapter.cpp index 55f5b0119..81d1b6d6d 100644 --- a/src/conversationsadapter.cpp +++ b/src/conversationsadapter.cpp @@ -139,17 +139,17 @@ ConversationsAdapter::safeInit() Q_EMIT modelChanged(QVariant::fromValue(conversationSmartListModel_)); - // connect(&lrcInstance_->behaviorController(), - // &BehaviorController::newUnreadInteraction, - // this, - // &ConversationsAdapter::onNewUnreadInteraction, - // Qt::UniqueConnection); - - // connect(&lrcInstance_->behaviorController(), - // &BehaviorController::newReadInteraction, - // this, - // &ConversationsAdapter::onNewReadInteraction, - // Qt::UniqueConnection); + connect(&lrcInstance_->behaviorController(), + &BehaviorController::newUnreadInteraction, + this, + &ConversationsAdapter::onNewUnreadInteraction, + Qt::UniqueConnection); + + connect(&lrcInstance_->behaviorController(), + &BehaviorController::newReadInteraction, + this, + &ConversationsAdapter::onNewReadInteraction, + Qt::UniqueConnection); connect(&lrcInstance_->behaviorController(), &BehaviorController::newTrustRequest, @@ -231,7 +231,7 @@ ConversationsAdapter::onNewUnreadInteraction(const QString& accountId, void ConversationsAdapter::onNewReadInteraction(const QString& accountId, const QString& convUid, - uint64_t interactionId) + const QString& interactionId) { #ifdef Q_OS_LINUX // hide notification @@ -424,7 +424,7 @@ ConversationsAdapter::getConvInfoMap(const QString& convId) {"bestId", contactModel->bestIdForContact(peerUri)}, {"bestName", contactModel->bestNameForContact(peerUri)}, {"uri", peerUri}, - {"isSwarm", convInfo.mode != lrc::api::conversation::Mode::NON_SWARM}, + {"isSwarm", !convInfo.isNotASwarm()}, {"contactType", static_cast<int>(contact.profileInfo.type)}, {"isAudioOnly", isAudioOnly}, {"callState", static_cast<int>(callState)}, diff --git a/src/conversationsadapter.h b/src/conversationsadapter.h index 362a6ebe7..a3ed887bb 100644 --- a/src/conversationsadapter.h +++ b/src/conversationsadapter.h @@ -70,7 +70,7 @@ private Q_SLOTS: const interaction::Info& interaction); void onNewReadInteraction(const QString& accountId, const QString& convUid, - uint64_t interactionId); + const QString& interactionId); void onNewTrustRequest(const QString& accountId, const QString& peerUri); void onTrustRequestTreated(const QString& accountId, const QString& peerUri); diff --git a/src/mainview/components/ConversationSmartListContextMenu.qml b/src/mainview/components/ConversationSmartListContextMenu.qml index a96ed6a3a..f129e98f6 100644 --- a/src/mainview/components/ConversationSmartListContextMenu.qml +++ b/src/mainview/components/ConversationSmartListContextMenu.qml @@ -56,18 +56,6 @@ ContextMenuAutoLoader { false) } }, - GeneralMenuItem { - id: clearConversation - - canTrigger: !isSwarm - itemName: JamiStrings.clearConversation - iconSource: "qrc:/images/icons/place_audiocall-24px.svg" - onClicked: { - MessagesAdapter.clearConversationHistory( - responsibleAccountId, - responsibleConvUid) - } - }, GeneralMenuItem { id: startAudioCall @@ -85,18 +73,19 @@ ContextMenuAutoLoader { GeneralMenuItem { id: clearConversation - canTrigger: !hasCall + canTrigger: !isSwarm && !hasCall itemName: JamiStrings.clearConversation iconSource: "qrc:/images/icons/ic_clear_24px.svg" onClicked: { - MessagesAdapter.clearConversationHistory(responsibleAccountId, - responsibleConvUid) + MessagesAdapter.clearConversationHistory( + responsibleAccountId, + responsibleConvUid) } }, GeneralMenuItem { id: removeContact - canTrigger: !hasCall && (contactType === Profile.Type.RING + canTrigger: !hasCall && (contactType === Profile.Type.JAMI || contactType === Profile.Type.SIP) itemName: JamiStrings.removeContact iconSource: "qrc:/images/icons/ic_hangup_participant-24px.svg" diff --git a/src/messagesadapter.cpp b/src/messagesadapter.cpp index f6fe75955..0adaff78d 100644 --- a/src/messagesadapter.cpp +++ b/src/messagesadapter.cpp @@ -88,19 +88,19 @@ MessagesAdapter::setupChatView(const QString& convUid) QMetaObject::invokeMethod(qmlObj_, "setSendContactRequestButtonVisible", - Q_ARG(QVariant, isPending)); + Q_ARG(QVariant, convInfo.isNotASwarm() && isPending)); QMetaObject::invokeMethod(qmlObj_, "setMessagingHeaderButtonsVisible", Q_ARG(QVariant, - !(convInfo.mode != lrc::api::conversation::Mode::NON_SWARM + !(convInfo.isNotASwarm() && (convInfo.isRequest || convInfo.needsSyncing)))); setMessagesVisibility(false); - setIsSwarm(convInfo.mode != lrc::api::conversation::Mode::NON_SWARM); + setIsSwarm(!convInfo.isNotASwarm()); setInvitation(convInfo.isRequest or convInfo.needsSyncing, bestName, contactURI, - convInfo.mode != lrc::api::conversation::Mode::NON_SWARM, + !convInfo.isNotASwarm(), convInfo.needsSyncing); // Type Indicator (contact). TODO: Not shown when invitation request? @@ -137,6 +137,7 @@ MessagesAdapter::connectConversationModel() QObject::disconnect(newInteractionConnection_); QObject::disconnect(interactionRemovedConnection_); QObject::disconnect(interactionStatusUpdatedConnection_); + QObject::disconnect(conversationUpdatedConnection_); newInteractionConnection_ = QObject::connect(currentConversationModel, @@ -185,6 +186,17 @@ MessagesAdapter::connectConversationModel() this, SLOT(slotMessagesLoaded())); }); + + conversationUpdatedConnection_ + = QObject::connect(currentConversationModel, + &ConversationModel::conversationReady, + [this](const QString& conversationId) { + if (conversationId != lrcInstance_->get_selectedConvUid()) + return; + auto* convModel = lrcInstance_->getCurrentConversationModel(); + if (auto optConv = convModel->getConversationForUid(conversationId)) + setConversationProfileData(optConv->get()); + }); } void @@ -241,8 +253,7 @@ MessagesAdapter::slotMessagesCleared() auto convOpt = convModel->getConversationForUid(lrcInstance_->get_selectedConvUid()); if (!convOpt) return; - if (convOpt->get().mode != lrc::api::conversation::Mode::NON_SWARM - && !convOpt->get().allMessagesLoaded) { + if (!convOpt->get().isNotASwarm() && !convOpt->get().allMessagesLoaded) { convModel->loadConversationMessages(convOpt->get().uid, 20); } else { printHistory(*convModel, convOpt->get().interactions); @@ -470,10 +481,21 @@ MessagesAdapter::setConversationProfileData(const lrc::api::conversation::Info& try { auto& contact = accInfo->contactModel->getContact(contactUri); auto bestName = accInfo->contactModel->bestNameForContact(contactUri); + bool isPending = contact.profileInfo.type == profile::Type::TEMPORARY; + + QMetaObject::invokeMethod(qmlObj_, + "setSendContactRequestButtonVisible", + Q_ARG(QVariant, convInfo.isNotASwarm() && isPending)); + QMetaObject::invokeMethod(qmlObj_, + "setMessagingHeaderButtonsVisible", + Q_ARG(QVariant, + !(!convInfo.isNotASwarm() + && (convInfo.isRequest || convInfo.needsSyncing)))); + setInvitation(convInfo.isRequest or convInfo.needsSyncing, bestName, contactUri, - convInfo.mode != lrc::api::conversation::Mode::NON_SWARM, + !convInfo.isNotASwarm(), convInfo.needsSyncing); if (!contact.profileInfo.avatar.isEmpty()) { setSenderImage(contactUri, contact.profileInfo.avatar); @@ -577,7 +599,10 @@ void MessagesAdapter::printHistory(lrc::api::ConversationModel& conversationModel, MessagesList interactions) { - auto interactionsStr = interactionsToJsonArrayObject(conversationModel, interactions).toUtf8(); + auto interactionsStr = interactionsToJsonArrayObject(conversationModel, + lrcInstance_->get_selectedConvUid(), + interactions) + .toUtf8(); QString s = QString::fromLatin1("printHistory(%1);").arg(interactionsStr.constData()); QMetaObject::invokeMethod(qmlObj_, "webViewRunJavaScript", Q_ARG(QVariant, s)); } @@ -587,7 +612,10 @@ MessagesAdapter::updateHistory(lrc::api::ConversationModel& conversationModel, MessagesList interactions, bool allLoaded) { - auto interactionsStr = interactionsToJsonArrayObject(conversationModel, interactions).toUtf8(); + auto interactionsStr = interactionsToJsonArrayObject(conversationModel, + lrcInstance_->get_selectedConvUid(), + interactions) + .toUtf8(); QString s = QString::fromLatin1("updateHistory(%1, %2);") .arg(interactionsStr.constData()) .arg(allLoaded); @@ -613,8 +641,11 @@ MessagesAdapter::printNewInteraction(lrc::api::ConversationModel& conversationMo const QString& msgId, const lrc::api::interaction::Info& interaction) { - auto interactionObject - = interactionToJsonInteractionObject(conversationModel, msgId, interaction).toUtf8(); + auto interactionObject = interactionToJsonInteractionObject(conversationModel, + lrcInstance_->get_selectedConvUid(), + msgId, + interaction) + .toUtf8(); if (interactionObject.isEmpty()) { return; } @@ -627,8 +658,11 @@ MessagesAdapter::updateInteraction(lrc::api::ConversationModel& conversationMode const QString& msgId, const lrc::api::interaction::Info& interaction) { - auto interactionObject - = interactionToJsonInteractionObject(conversationModel, msgId, interaction).toUtf8(); + auto interactionObject = interactionToJsonInteractionObject(conversationModel, + lrcInstance_->get_selectedConvUid(), + msgId, + interaction) + .toUtf8(); if (interactionObject.isEmpty()) { return; } @@ -686,9 +720,9 @@ MessagesAdapter::contactIsComposing(const QString& uid, const QString& contactUr if (!convInfo) return; auto& conv = convInfo->get(); - bool showIsComposing = conv.mode != lrc::api::conversation::Mode::NON_SWARM - ? uid == conv.uid - : uid.isEmpty() && conv.participants.first() == contactUri; + bool showIsComposing = conv.isNotASwarm() + ? uid.isEmpty() && conv.participants.first() == contactUri + : uid == conv.uid; if (showIsComposing) { QString s = QString::fromLatin1("showTypingIndicator(`%1`, %2);").arg(contactUri).arg(isComposing); @@ -763,7 +797,6 @@ MessagesAdapter::loadMessages(int n) auto convOpt = convModel->getConversationForUid(currentConvUid_); if (!convOpt) return; - if (convOpt->get().mode != lrc::api::conversation::Mode::NON_SWARM - && !convOpt->get().allMessagesLoaded) + if (!convOpt->get().isNotASwarm() && !convOpt->get().allMessagesLoaded) convModel->loadConversationMessages(convOpt->get().uid, n); } diff --git a/src/messagesadapter.h b/src/messagesadapter.h index 5611641d8..3860832d0 100644 --- a/src/messagesadapter.h +++ b/src/messagesadapter.h @@ -128,6 +128,7 @@ private: QMetaObject::Connection interactionStatusUpdatedConnection_; QMetaObject::Connection interactionRemovedConnection_; QMetaObject::Connection newMessagesAvailableConnection_; + QMetaObject::Connection conversationUpdatedConnection_; AppSettingsManager* settingsManager_; }; diff --git a/src/webchathelpers.cpp b/src/webchathelpers.cpp index 2d87126ef..66e0732f3 100644 --- a/src/webchathelpers.cpp +++ b/src/webchathelpers.cpp @@ -23,6 +23,7 @@ QJsonObject buildInteractionJson(lrc::api::ConversationModel& conversationModel, + const QString& convId, const QString msgId, const lrc::api::interaction::Info& inter) { @@ -65,7 +66,7 @@ buildInteractionJson(lrc::api::ConversationModel& conversationModel, case lrc::api::interaction::Type::DATA_TRANSFER: { interactionObject.insert("type", QJsonValue("data_transfer")); lrc::api::datatransfer::Info info = {}; - // conversationModel.getTransferInfo(msgId, info); + conversationModel.getTransferInfo(convId, msgId, info); if (info.status != lrc::api::datatransfer::Status::INVALID) { interactionObject.insert("totalSize", QJsonValue(qint64(info.totalSize))); interactionObject.insert("progress", QJsonValue(qint64(info.progress))); @@ -130,20 +131,23 @@ buildInteractionJson(lrc::api::ConversationModel& conversationModel, QString interactionToJsonInteractionObject(lrc::api::ConversationModel& conversationModel, + const QString& convId, const QString& msgId, const lrc::api::interaction::Info& interaction) { - auto interactionObject = buildInteractionJson(conversationModel, msgId, interaction); + auto interactionObject = buildInteractionJson(conversationModel, convId, msgId, interaction); return QString(QJsonDocument(interactionObject).toJson(QJsonDocument::Compact)); } QString interactionsToJsonArrayObject(lrc::api::ConversationModel& conversationModel, + const QString& convId, MessagesList interactions) { QJsonArray array; for (const auto& interaction : interactions) { auto interactionObject = buildInteractionJson(conversationModel, + convId, interaction.first, interaction.second); if (!interactionObject.isEmpty()) { diff --git a/src/webchathelpers.h b/src/webchathelpers.h index a35091250..88fc13085 100644 --- a/src/webchathelpers.h +++ b/src/webchathelpers.h @@ -30,10 +30,13 @@ #include "api/conversationmodel.h" QJsonObject buildInteractionJson(lrc::api::ConversationModel& conversationModel, + const QString& convId, const QString& msgId, lrc::api::interaction::Info& interaction); QString interactionToJsonInteractionObject(lrc::api::ConversationModel& conversationModel, + const QString& convId, const QString& msgId, const lrc::api::interaction::Info& interaction); QString interactionsToJsonArrayObject(lrc::api::ConversationModel& conversationModel, + const QString& convId, MessagesList interactions); -- GitLab