1
0
Fork 0
mirror of https://git.jami.net/savoirfairelinux/jami-client-qt.git synced 2024-10-28 08:49:35 +01:00

messagelistmodel: add support for file deletion

+ Add button to delete messages on file transfer
+ Show "Deleted media" on deleted files.
+ Update last interaction
+ Update icon for saving file, we're in 2024, no more floppy disk

Change-Id: I607b1a6beda443db85c60d8cf95a9aae29ce1f7c
GitLab: #1287
This commit is contained in:
Sébastien Blin 2024-05-22 10:55:32 -04:00 committed by Adrien Béraud
parent 010a2c4eea
commit 99254f8d02
9 changed files with 84 additions and 16 deletions

View file

@ -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>
<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>

Before

Width:  |  Height:  |  Size: 369 B

After

Width:  |  Height:  |  Size: 268 B

View file

@ -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

View file

@ -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 {

View file

@ -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: {

View file

@ -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);

View file

@ -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()
}

View file

@ -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")

View file

@ -55,6 +55,7 @@ struct Info;
X(ReplyToAuthor) \
X(TotalSize) \
X(TransferName) \
X(TID) \
X(FileExtension) \
X(Readers) \
X(IsEmojiOnly) \

View file

@ -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: