mirror of
https://git.jami.net/savoirfairelinux/jami-client-qt.git
synced 2025-10-30 07:53:33 +08:00
Compare commits
10 Commits
beta/20240
...
beta/20240
| Author | SHA1 | Date | |
|---|---|---|---|
| 69400bee2a | |||
| 0e07f9cee7 | |||
| d2eba1d91e | |||
| 78389d8c28 | |||
| e6d820850a | |||
| 0a7f9349a9 | |||
| 99254f8d02 | |||
| 010a2c4eea | |||
| 61163037d4 | |||
| 3577982a93 |
2
daemon
2
daemon
Submodule daemon updated: c9f251d797...51d767d982
@ -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 |
@ -145,6 +145,16 @@ ApplicationWindow {
|
||||
LRCInstance.selectConversation(convUid);
|
||||
}
|
||||
}
|
||||
ListElement {
|
||||
label: "Account ID"
|
||||
type: "combobox"
|
||||
getDataModel: () => AccountListModel
|
||||
displayRole: AccountList.Username
|
||||
onIndexChanged: function(model, index) {
|
||||
const accountId = JamiQmlUtils.getModelData(model, index, AccountList.ID);
|
||||
LRCInstance.currentAccountId = accountId;
|
||||
}
|
||||
}
|
||||
ListElement {
|
||||
label: "Force local preview"
|
||||
type: "checkbox"
|
||||
|
||||
@ -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
|
||||
|
||||
@ -121,10 +121,7 @@ Item {
|
||||
font.pixelSize : text.length > 16 ? JamiTheme.jamiIdSmallFontSize : JamiTheme.bigFontSize
|
||||
property string registeredName: CurrentAccount.registeredName
|
||||
property string infohash: CurrentAccount.uri
|
||||
text: registeredName ? registeredName : infohash
|
||||
onRegisteredNameChanged: {
|
||||
text = registeredName ? registeredName : infohash
|
||||
}
|
||||
text: (btnId.clicked && registeredName) ? registeredName : infohash
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -231,11 +228,9 @@ Item {
|
||||
toolTipText: JamiStrings.identifierURI
|
||||
onClicked: {
|
||||
if (clicked) {
|
||||
usernameLabel.text = Qt.binding(function() {return CurrentAccount.uri} );
|
||||
usernameTextEdit.staticText = Qt.binding(function() {return CurrentAccount.uri} );
|
||||
btnId.toolTipText = JamiStrings.identifierRegisterName;
|
||||
} else {
|
||||
usernameLabel.text = Qt.binding(function() {return CurrentAccount.registeredName} );
|
||||
usernameTextEdit.staticText = Qt.binding(function() {return CurrentAccount.registeredName} );
|
||||
btnId.toolTipText = JamiStrings.identifierURI;
|
||||
}
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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: {
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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()
|
||||
}
|
||||
|
||||
@ -38,9 +38,9 @@ ItemDelegate {
|
||||
|
||||
highlighted: ListView.isCurrentItem
|
||||
property bool interactive: true
|
||||
property string lastInteractionDate: LastInteractionTimeStamp === undefined ? "" : LastInteractionTimeStamp
|
||||
|
||||
property string lastInteractionFormattedDate: MessagesAdapter.getBestFormattedDate(lastInteractionDate)
|
||||
property int lastInteractionTimeStamp: LastInteractionTimeStamp
|
||||
property string lastInteractionFormattedDate: MessagesAdapter.getBestFormattedDate(lastInteractionTimeStamp)
|
||||
|
||||
property bool showSharePositionIndicator: PositionManager.isPositionSharedToConv(accountId, UID)
|
||||
property bool showSharedPositionIndicator: PositionManager.isConvSharingPosition(accountId, UID)
|
||||
@ -58,7 +58,7 @@ ItemDelegate {
|
||||
Connections {
|
||||
target: MessagesAdapter
|
||||
function onTimestampUpdated() {
|
||||
lastInteractionFormattedDate = MessagesAdapter.getBestFormattedDate(lastInteractionDate);
|
||||
lastInteractionFormattedDate = MessagesAdapter.getBestFormattedDate(lastInteractionTimeStamp);
|
||||
}
|
||||
}
|
||||
|
||||
@ -130,7 +130,7 @@ ItemDelegate {
|
||||
color: JamiTheme.textColor
|
||||
}
|
||||
RowLayout {
|
||||
visible: ContactType !== Profile.Type.TEMPORARY && !IsBanned && lastInteractionFormattedDate !== undefined && interactive
|
||||
visible: ContactType !== Profile.Type.TEMPORARY && !IsBanned && lastInteractionTimeStamp > 0 && interactive
|
||||
Layout.fillWidth: true
|
||||
Layout.minimumHeight: 20
|
||||
Layout.alignment: Qt.AlignTop
|
||||
@ -138,7 +138,7 @@ ItemDelegate {
|
||||
// last Interaction date
|
||||
Text {
|
||||
Layout.alignment: Qt.AlignVCenter
|
||||
text: lastInteractionFormattedDate === undefined ? "" : lastInteractionFormattedDate
|
||||
text: lastInteractionFormattedDate
|
||||
textFormat: TextEdit.PlainText
|
||||
font.pointSize: JamiTheme.smallFontSize
|
||||
font.weight: UnreadMessagesCount ? Font.DemiBold : Font.Normal
|
||||
|
||||
@ -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")
|
||||
|
||||
@ -53,7 +53,7 @@ BaseModalDialog {
|
||||
pinRectangle.visible = true
|
||||
exportedPIN.text = pin;
|
||||
} else {
|
||||
pinRectangle.success = false;
|
||||
infoLabel.success = false;
|
||||
infoLabel.visible = true;
|
||||
switch (status) {
|
||||
case NameDirectory.ExportOnRingStatus.WRONG_PASSWORD:
|
||||
|
||||
@ -38,7 +38,7 @@ namespace api {
|
||||
class BehaviorController;
|
||||
|
||||
namespace datatransfer {
|
||||
class Info;
|
||||
struct Info;
|
||||
} // namespace datatransfer
|
||||
|
||||
/**
|
||||
|
||||
@ -55,6 +55,7 @@ struct Info;
|
||||
X(ReplyToAuthor) \
|
||||
X(TotalSize) \
|
||||
X(TransferName) \
|
||||
X(TID) \
|
||||
X(FileExtension) \
|
||||
X(Readers) \
|
||||
X(IsEmojiOnly) \
|
||||
|
||||
@ -201,16 +201,19 @@ 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;
|
||||
// TODO: look into why this update with an empty body is broadcasted just
|
||||
// after loading the messages. This is a workaround to avoid the empty
|
||||
// file transfer path. Until then, don't update the body if it's empty.
|
||||
if (!interaction.body.isEmpty()) {
|
||||
current.body = interaction.body;
|
||||
}
|
||||
// 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,24 +254,27 @@ 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);
|
||||
if (it == interactions_.end()) {
|
||||
return false;
|
||||
}
|
||||
VectorInt roles;
|
||||
if (it->second.transferStatus == newStatus) {
|
||||
with(id, [&](const QString&, interaction::Info& interaction) {
|
||||
if (interaction.transferStatus == newStatus) {
|
||||
return;
|
||||
}
|
||||
interaction.transferStatus = newStatus;
|
||||
roles.push_back(Role::TransferStatus);
|
||||
if (!newBody.isEmpty()) {
|
||||
interaction.body = newBody;
|
||||
roles.push_back(Role::Body);
|
||||
}
|
||||
});
|
||||
if (roles.empty()) {
|
||||
return false;
|
||||
}
|
||||
it->second.transferStatus = newStatus;
|
||||
roles.push_back(Role::TransferStatus);
|
||||
if (!newBody.isEmpty()) {
|
||||
it->second.body = newBody;
|
||||
roles.push_back(Role::Body);
|
||||
}
|
||||
auto idx = indexOfMessage(id);
|
||||
auto modelIndex = QAbstractListModel::index(idx, 0);
|
||||
Q_EMIT dataChanged(modelIndex, modelIndex, roles);
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -526,7 +532,7 @@ MessageListModel::dataForItem(const item_t& item, int, int role) const
|
||||
auto bestName = item.second.authorUri == account_->profileInfo.uri
|
||||
? account_->accountModel->bestNameForAccount(account_->id)
|
||||
: account_->contactModel->bestNameForContact(
|
||||
item.second.authorUri);
|
||||
item.second.authorUri);
|
||||
return QVariant(
|
||||
interaction::getContactInteractionString(bestName,
|
||||
interaction::to_action(
|
||||
@ -594,6 +600,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:
|
||||
|
||||
Reference in New Issue
Block a user