diff --git a/resources/icons/save_file.svg b/resources/icons/save_file.svg index 9c84d19ae0eed1478e823993ebc78fcbc79281ae..4fcc1f87d5a2b3cd5d21b2eca1fcf2ab690afd8d 100644 --- a/resources/icons/save_file.svg +++ b/resources/icons/save_file.svg @@ -1 +1 @@ -<svg xmlns="http://www.w3.org/2000/svg" height="48" width="48"><path d="M42 13.85V39q0 1.2-.9 2.1-.9.9-2.1.9H9q-1.2 0-2.1-.9Q6 40.2 6 39V9q0-1.2.9-2.1Q7.8 6 9 6h25.15Zm-3 1.35L32.8 9H9v30h30ZM24 35.75q2.15 0 3.675-1.525T29.2 30.55q0-2.15-1.525-3.675T24 25.35q-2.15 0-3.675 1.525T18.8 30.55q0 2.15 1.525 3.675T24 35.75ZM11.65 18.8h17.9v-7.15h-17.9ZM9 15.2V39 9Z"/></svg> \ No newline at end of file +<svg xmlns="http://www.w3.org/2000/svg" height="48px" viewBox="0 -960 960 960" width="48px" fill="#e8eaed"><path d="M480-313 287-506l43-43 120 120v-371h60v371l120-120 43 43-193 193ZM220-160q-24 0-42-18t-18-42v-143h60v143h520v-143h60v143q0 24-18 42t-42 18H220Z"/></svg> \ No newline at end of file diff --git a/src/app/commoncomponents/DataTransferMessageDelegate.qml b/src/app/commoncomponents/DataTransferMessageDelegate.qml index 9710e19a01d7e91504b640d814717e1249c60f41..a87ee3447bff8baad2122d5c264ca1ab112c72fd 100644 --- a/src/app/commoncomponents/DataTransferMessageDelegate.qml +++ b/src/app/commoncomponents/DataTransferMessageDelegate.qml @@ -40,9 +40,18 @@ Loader { property int seq: MsgSeq.single property string author: Author property string body: Body + property var tid: TID property int transferStatus: TransferStatus + onTidChanged: { + if (tid === "") { + sourceComponent = deletedMsgComp + } + } onTransferStatusChanged: { - if (transferStatus === Interaction.TransferStatus.TRANSFER_FINISHED) { + if (tid === "") { + sourceComponent = deletedMsgComp + return; + } else if (transferStatus === Interaction.TransferStatus.TRANSFER_FINISHED) { mediaInfo = MessagesAdapter.getMediaInfo(root.body); if (Object.keys(mediaInfo).length !== 0 && WITH_WEBENGINE) { sourceComponent = localMediaMsgComp; @@ -58,6 +67,54 @@ Loader { Behavior on opacity { NumberAnimation { duration: 100 } } onLoaded: opacity = 1 + Component { + id: deletedMsgComp + + SBSMessageBase { + id: deletedItem + + isOutgoing: Author === CurrentAccount.uri + showTime: root.showTime + seq: root.seq + author: Author + readers: Readers + timestamp: root.timestamp + formattedTime: root.formattedTime + formattedDay: root.formattedTime + extraHeight: 0 + textContentWidth: textEditId.width + textContentHeight: textEditId.height + innerContent.children: [ + TextEdit { + id: textEditId + + anchors.right: isOutgoing ? parent.right : undefined + anchors.rightMargin: isOutgoing ? timeWidth : 0 + bottomPadding: 6 + topPadding: 6 + leftPadding: 10 + text: UtilsAdapter.getBestNameForUri(CurrentAccount.id, Author) + " " + JamiStrings.deletedMedia ; + horizontalAlignment: Text.AlignLeft + width: Math.min((2 / 3) * parent.width, implicitWidth + 18, innerContent.width - senderMargin + 18) + + font.pointSize: JamiTheme.smallFontSize + font.hintingPreference: Font.PreferNoHinting + renderType: Text.NativeRendering + textFormat: Text.RichText + clip: true + readOnly: true + color: getBaseColor() + opacity: 0.5 + + function getBaseColor() { + bubble.isDeleted = true + return UtilsAdapter.luma(bubble.color) ? "white" : "dark" + } + } + ] + } + } + Component { id: dataTransferMsgComp @@ -223,8 +280,8 @@ Loader { : JamiTheme.chatviewTextColorDark } } - } - ,ProgressBar { + }, + ProgressBar { id: progressBar visible: root.transferStatus === Interaction.TransferStatus.TRANSFER_ONGOING diff --git a/src/app/commoncomponents/SBSMessageBase.qml b/src/app/commoncomponents/SBSMessageBase.qml index bbca1c891b37ba68b20db20ad6a8062b283e463c..a57b1ddb51253ec9a29ef74005987b460aef1f52 100644 --- a/src/app/commoncomponents/SBSMessageBase.qml +++ b/src/app/commoncomponents/SBSMessageBase.qml @@ -382,7 +382,11 @@ Control { property bool bubbleHovered property string imgSource - width: (root.type === Interaction.Type.TEXT ? root.textContentWidth + (IsEmojiOnly || root.bigMsg ? 0 : root.timeWidth + root.editedWidth) : innerContent.childrenRect.width) + width: (root.type === Interaction.Type.TEXT || isDeleted ? + root.textContentWidth + (IsEmojiOnly || root.bigMsg ? + 0 + : root.timeWidth + root.editedWidth) + : innerContent.childrenRect.width) height: innerContent.childrenRect.height + (visible ? root.extraHeight : 0) + (root.bigMsg ? 15 : 0) HoverHandler { diff --git a/src/app/commoncomponents/ShowMoreMenu.qml b/src/app/commoncomponents/ShowMoreMenu.qml index 22f95d0c1b62e26bb3d712f90b99ae592fcdac43..26c4cdb8cea930d85c7030d5289b211dd18db441 100644 --- a/src/app/commoncomponents/ShowMoreMenu.qml +++ b/src/app/commoncomponents/ShowMoreMenu.qml @@ -175,7 +175,7 @@ BaseContextMenu { GeneralMenuItem { id: deleteMessage - canTrigger: root.isOutgoing && type === Interaction.Type.TEXT + canTrigger: root.isOutgoing && (type === Interaction.Type.TEXT || type === Interaction.Type.DATA_TRANSFER) iconSource: JamiResources.delete_svg itemName: JamiStrings.deleteMessage onClicked: { diff --git a/src/app/conversationlistmodelbase.cpp b/src/app/conversationlistmodelbase.cpp index 180b5db44a72b81b7225c2324d1124af1af8b487..2a169463ebeadc8df0f00941279339d148ef971b 100644 --- a/src/app/conversationlistmodelbase.cpp +++ b/src/app/conversationlistmodelbase.cpp @@ -125,7 +125,11 @@ ConversationListModelBase::dataForItem(item_t item, int role) const if (interaction.type == interaction::Type::UPDATE_PROFILE) { lastInteractionBody = interaction::getProfileUpdatedString(); } else if (interaction.type == interaction::Type::DATA_TRANSFER) { - lastInteractionBody = interaction.commit.value("displayName"); + if (interaction.commit.value("tid").isEmpty()) { + lastInteractionBody = tr("Deleted media"); + } else { + lastInteractionBody = interaction.commit.value("displayName"); + } } else if (interaction.type == lrc::api::interaction::Type::CALL) { const auto isOutgoing = interaction.authorUri == accInfo.profileInfo.uri; lastInteractionBody = interaction::getCallInteractionString(isOutgoing, interaction); diff --git a/src/app/mainview/components/ChatViewHeader.qml b/src/app/mainview/components/ChatViewHeader.qml index 2ae782fe6c17908c7f7f55adbeaa2be4ae65a1e3..b11b0a7a491179091c7796a33c99cdf9dd2b3146 100644 --- a/src/app/mainview/components/ChatViewHeader.qml +++ b/src/app/mainview/components/ChatViewHeader.qml @@ -88,7 +88,7 @@ Rectangle { mirror: UtilsAdapter.isRTL source: JamiResources.back_24dp_svg - toolTipText: CurrentConversation.inCall ? JamiStrings.backCall : JamiStrings.hideChat + toolTipText: CurrentConversation.inCall ? JamiStrings.returnToCall : JamiStrings.hideChat onClicked: root.backClicked() } diff --git a/src/app/net/jami/Constants/JamiStrings.qml b/src/app/net/jami/Constants/JamiStrings.qml index a74aa1962f1b33c7becee4ca527032e37479460a..1610904c3fc413f248d05f620749074665c9fb68 100644 --- a/src/app/net/jami/Constants/JamiStrings.qml +++ b/src/app/net/jami/Constants/JamiStrings.qml @@ -346,7 +346,8 @@ Item { property string disabledAccount: qsTr("The account is disabled") property string noNetworkConnectivity: qsTr("No network connectivity") property string deletedMessage: qsTr("deleted a message") - property string backCall: qsTr("Back to Call") + property string deletedMedia: qsTr("deleted a media") + property string returnToCall: qsTr("Return to call") //MessagesResearch property string jumpTo: qsTr("Jump to") diff --git a/src/libclient/api/messagelistmodel.h b/src/libclient/api/messagelistmodel.h index 96f7adf54e6f362321fadf4a8021f6903bafb330..c6f06703ac794dfa2cff27e8a5e89ec6a0b758ca 100644 --- a/src/libclient/api/messagelistmodel.h +++ b/src/libclient/api/messagelistmodel.h @@ -55,6 +55,7 @@ struct Info; X(ReplyToAuthor) \ X(TotalSize) \ X(TransferName) \ + X(TID) \ X(FileExtension) \ X(Readers) \ X(IsEmojiOnly) \ diff --git a/src/libclient/messagelistmodel.cpp b/src/libclient/messagelistmodel.cpp index ce726dbb9931fd4d53236e4eb138bc358b060980..04a2ee5cbb6e296cf09e90f2917007dc038ea111 100644 --- a/src/libclient/messagelistmodel.cpp +++ b/src/libclient/messagelistmodel.cpp @@ -201,16 +201,15 @@ MessageListModel::update(const QString& id, const interaction::Info& interaction return true; } } - // DataTransfer interactions should not be updated. - if (current.type == interaction::Type::DATA_TRANSFER) { - return true; - } // Just update bodies notify the view otherwise. current.body = interaction.body; + current.commit = interaction.commit; current.previousBodies = interaction.previousBodies; current.parsedBody = interaction.parsedBody; auto modelIndex = QAbstractListModel::index(indexOfMessage(id), 0); - Q_EMIT dataChanged(modelIndex, modelIndex, {Role::Body, Role::PreviousBodies, Role::ParsedBody}); + Q_EMIT dataChanged(modelIndex, + modelIndex, + {Role::TID, Role::Body, Role::PreviousBodies, Role::ParsedBody}); return true; } @@ -251,8 +250,8 @@ MessageListModel::updateStatus(const QString& id, bool MessageListModel::updateTransferStatus(const QString& id, - interaction::TransferStatus newStatus, - const QString& newBody) + interaction::TransferStatus newStatus, + const QString& newBody) { const std::lock_guard<std::recursive_mutex> lk(mutex_); auto it = find(id); @@ -594,6 +593,8 @@ MessageListModel::dataForItem(const item_t& item, int, int role) const return QVariant(item.second.commit["totalSize"].toInt()); case Role::TransferName: return QVariant(item.second.commit["displayName"]); + case Role::TID: + return QVariant(item.second.commit["tid"]); case Role::FileExtension: return QVariant(QFileInfo(item.second.body).suffix()); case Role::Readers: