fix chat list slowness

This commit is contained in:
Gaelle Braud 2025-09-22 17:50:38 +02:00
parent 8452ecbdfd
commit 285e6645f8
28 changed files with 446 additions and 326 deletions

View file

@ -51,7 +51,7 @@ ChatCore::ChatCore(const std::shared_ptr<linphone::ChatRoom> &chatRoom) : QObjec
if (chatRoom->hasCapability((int)linphone::ChatRoom::Capabilities::Basic)) { if (chatRoom->hasCapability((int)linphone::ChatRoom::Capabilities::Basic)) {
mTitle = ToolModel::getDisplayName(chatRoomAddress); mTitle = ToolModel::getDisplayName(chatRoomAddress);
mAvatarUri = ToolModel::getDisplayName(chatRoomAddress); mAvatarUri = ToolModel::getDisplayName(chatRoomAddress);
mPeerAddress = Utils::coreStringToAppString(chatRoomAddress->asStringUriOnly()); mParticipantAddress = Utils::coreStringToAppString(chatRoomAddress->asStringUriOnly());
mIsGroupChat = false; mIsGroupChat = false;
mIsBasic = true; mIsBasic = true;
mConferenceJoined = true; mConferenceJoined = true;
@ -65,7 +65,7 @@ ChatCore::ChatCore(const std::shared_ptr<linphone::ChatRoom> &chatRoom) : QObjec
mAvatarUri = ToolModel::getDisplayName(peer->getAddress()->clone()); mAvatarUri = ToolModel::getDisplayName(peer->getAddress()->clone());
if (participants.size() == 1) { if (participants.size() == 1) {
auto peerAddress = peer->getAddress(); auto peerAddress = peer->getAddress();
if (peerAddress) mPeerAddress = Utils::coreStringToAppString(peerAddress->asStringUriOnly()); if (peerAddress) mParticipantAddress = Utils::coreStringToAppString(peerAddress->asStringUriOnly());
} }
} }
mIsGroupChat = false; mIsGroupChat = false;
@ -90,24 +90,24 @@ ChatCore::ChatCore(const std::shared_ptr<linphone::ChatRoom> &chatRoom) : QObjec
static_cast<int>(linphone::ChatRoom::HistoryFilter::InfoNoDevice) static_cast<int>(linphone::ChatRoom::HistoryFilter::InfoNoDevice)
: static_cast<int>(linphone::ChatRoom::HistoryFilter::ChatMessage); : static_cast<int>(linphone::ChatRoom::HistoryFilter::ChatMessage);
auto history = chatRoom->getHistory(0, filter); // auto history = chatRoom->getHistory(0, filter);
std::list<std::shared_ptr<linphone::EventLog>> lHistory; // std::list<std::shared_ptr<linphone::EventLog>> lHistory;
for (auto &eventLog : history) { // for (auto &eventLog : history) {
lHistory.push_back(eventLog); // lHistory.push_back(eventLog);
} // }
QList<QSharedPointer<EventLogCore>> eventList; // QList<QSharedPointer<EventLogCore>> eventList;
for (auto &event : lHistory) { // for (auto &event : lHistory) {
auto eventLogCore = EventLogCore::create(event); // auto eventLogCore = EventLogCore::create(event);
eventList.append(eventLogCore); // eventList.append(eventLogCore);
if (auto isMessage = eventLogCore->getChatMessageCore()) { // if (auto isMessage = eventLogCore->getChatMessageCore()) {
for (auto content : isMessage->getChatMessageContentList()) { // for (auto content : isMessage->getChatMessageContentList()) {
if (content->isFile() && !content->isVoiceRecording()) { // if (content->isFile() && !content->isVoiceRecording()) {
mFileList.append(content); // mFileList.append(content);
} // }
} // }
} // }
} // }
resetEventLogList(eventList); // resetEventLogList(eventList);
mIdentifier = Utils::coreStringToAppString(chatRoom->getIdentifier()); mIdentifier = Utils::coreStringToAppString(chatRoom->getIdentifier());
mChatRoomState = LinphoneEnums::fromLinphone(chatRoom->getState()); mChatRoomState = LinphoneEnums::fromLinphone(chatRoom->getState());
mIsEncrypted = chatRoom->hasCapability((int)linphone::ChatRoom::Capabilities::Encrypted); mIsEncrypted = chatRoom->hasCapability((int)linphone::ChatRoom::Capabilities::Encrypted);
@ -122,15 +122,15 @@ ChatCore::ChatCore(const std::shared_ptr<linphone::ChatRoom> &chatRoom) : QObjec
connect(this, &ChatCore::eventRemoved, this, &ChatCore::lUpdateLastMessage); connect(this, &ChatCore::eventRemoved, this, &ChatCore::lUpdateLastMessage);
auto resetFileListLambda = [this] { auto resetFileListLambda = [this] {
QList<QSharedPointer<ChatMessageContentCore>> fileList; QList<QSharedPointer<ChatMessageContentCore>> fileList;
for (auto &eventLogCore : mEventLogList) { // for (auto &eventLogCore : mEventLogList) {
if (auto isMessage = eventLogCore->getChatMessageCore()) { // if (auto isMessage = eventLogCore->getChatMessageCore()) {
for (auto content : isMessage->getChatMessageContentList()) { // for (auto content : isMessage->getChatMessageContentList()) {
if (content->isFile() && !content->isVoiceRecording()) { // if (content->isFile() && !content->isVoiceRecording()) {
fileList.append(content); // fileList.append(content);
} // }
} // }
} // }
} // }
resetFileList(fileList); resetFileList(fileList);
}; };
connect(this, &ChatCore::eventListChanged, this, resetFileListLambda); connect(this, &ChatCore::eventListChanged, this, resetFileListLambda);
@ -172,7 +172,7 @@ void ChatCore::setSelf(QSharedPointer<ChatCore> me) {
&ChatCore::lLeave, [this]() { mChatModelConnection->invokeToModel([this]() { mChatModel->leave(); }); }); &ChatCore::lLeave, [this]() { mChatModelConnection->invokeToModel([this]() { mChatModel->leave(); }); });
mChatModelConnection->makeConnectToModel(&ChatModel::historyDeleted, [this]() { mChatModelConnection->makeConnectToModel(&ChatModel::historyDeleted, [this]() {
mChatModelConnection->invokeToCore([this]() { mChatModelConnection->invokeToCore([this]() {
clearEventLogList(); emit eventListCleared();
//: Deleted //: Deleted
Utils::showInformationPopup(tr("info_toast_deleted_title"), Utils::showInformationPopup(tr("info_toast_deleted_title"),
//: Message history has been deleted //: Message history has been deleted
@ -221,7 +221,8 @@ void ChatCore::setSelf(QSharedPointer<ChatCore> me) {
avatarUri = ToolModel::getDisplayName(peer->getAddress()->clone()); avatarUri = ToolModel::getDisplayName(peer->getAddress()->clone());
if (linParticipants.size() == 1) { if (linParticipants.size() == 1) {
auto peerAddress = peer->getAddress(); auto peerAddress = peer->getAddress();
if (peerAddress) mPeerAddress = Utils::coreStringToAppString(peerAddress->asStringUriOnly()); if (peerAddress)
mParticipantAddress = Utils::coreStringToAppString(peerAddress->asStringUriOnly());
} }
} }
mChatModelConnection->invokeToCore([this, title, avatarUri]() { mChatModelConnection->invokeToCore([this, title, avatarUri]() {
@ -242,7 +243,7 @@ void ChatCore::setSelf(QSharedPointer<ChatCore> me) {
qDebug() << "EVENT LOG RECEIVED IN CHATROOM" << mChatModel->getTitle(); qDebug() << "EVENT LOG RECEIVED IN CHATROOM" << mChatModel->getTitle();
auto event = EventLogCore::create(eventLog); auto event = EventLogCore::create(eventLog);
if (event->isHandled()) { if (event->isHandled()) {
mChatModelConnection->invokeToCore([this, event]() { appendEventLogToEventLogList(event); }); mChatModelConnection->invokeToCore([this, event]() { emit eventsInserted({event}); });
} }
mChatModelConnection->invokeToCore([this, event]() { emit lUpdateLastUpdatedTime(); }); mChatModelConnection->invokeToCore([this, event]() { emit lUpdateLastUpdatedTime(); });
}); });
@ -259,7 +260,7 @@ void ChatCore::setSelf(QSharedPointer<ChatCore> me) {
list.push_back(event); list.push_back(event);
} }
mChatModelConnection->invokeToCore([this, list]() { mChatModelConnection->invokeToCore([this, list]() {
appendEventLogsToEventLogList(list); emit eventsInserted(list);
emit lUpdateUnreadCount(); emit lUpdateUnreadCount();
emit lUpdateLastUpdatedTime(); emit lUpdateLastUpdatedTime();
}); });
@ -309,7 +310,7 @@ void ChatCore::setSelf(QSharedPointer<ChatCore> me) {
&ChatModel::chatMessageSending, [this](const std::shared_ptr<linphone::ChatRoom> &chatRoom, &ChatModel::chatMessageSending, [this](const std::shared_ptr<linphone::ChatRoom> &chatRoom,
const std::shared_ptr<const linphone::EventLog> &eventLog) { const std::shared_ptr<const linphone::EventLog> &eventLog) {
auto event = EventLogCore::create(eventLog); auto event = EventLogCore::create(eventLog);
mChatModelConnection->invokeToCore([this, event]() { appendEventLogToEventLogList(event); }); mChatModelConnection->invokeToCore([this, event]() { emit eventsInserted({event}); });
}); });
mChatModelConnection->makeConnectToCore( mChatModelConnection->makeConnectToCore(
&ChatCore::lCompose, [this]() { mChatModelConnection->invokeToModel([this]() { mChatModel->compose(); }); }); &ChatCore::lCompose, [this]() { mChatModelConnection->invokeToModel([this]() { mChatModel->compose(); }); });
@ -405,7 +406,7 @@ void ChatCore::setSelf(QSharedPointer<ChatCore> me) {
}); });
mCoreModelConnection = SafeConnection<ChatCore, CoreModel>::create(me, CoreModel::getInstance()); mCoreModelConnection = SafeConnection<ChatCore, CoreModel>::create(me, CoreModel::getInstance());
if (!ToolModel::findFriendByAddress(mPeerAddress)) if (!ToolModel::findFriendByAddress(mParticipantAddress))
mCoreModelConnection->makeConnectToModel(&CoreModel::friendCreated, mCoreModelConnection->makeConnectToModel(&CoreModel::friendCreated,
[this](std::shared_ptr<linphone::Friend> f) { updateInfo(f); }); [this](std::shared_ptr<linphone::Friend> f) { updateInfo(f); });
mCoreModelConnection->makeConnectToModel(&CoreModel::friendUpdated, mCoreModelConnection->makeConnectToModel(&CoreModel::friendUpdated,
@ -459,8 +460,8 @@ QString ChatCore::getIdentifier() const {
return mIdentifier; return mIdentifier;
} }
QString ChatCore::getPeerAddress() const { QString ChatCore::getParticipantAddress() const {
return mPeerAddress; return mParticipantAddress;
} }
QString ChatCore::getChatRoomAddress() const { QString ChatCore::getChatRoomAddress() const {
@ -532,72 +533,6 @@ void ChatCore::setUnreadMessagesCount(int count) {
} }
} }
QList<QSharedPointer<EventLogCore>> ChatCore::getEventLogList() const {
return mEventLogList;
}
void ChatCore::resetEventLogList(QList<QSharedPointer<EventLogCore>> list) {
for (auto &e : mEventLogList) {
disconnect(e.get());
}
for (auto &e : list) {
if (auto message = e->getChatMessageCore()) {
connect(message.get(), &ChatMessageCore::isReadChanged, this, [this] { emit lUpdateUnreadCount(); });
}
}
mEventLogList = list;
emit eventListChanged();
}
void ChatCore::appendEventLogsToEventLogList(QList<QSharedPointer<EventLogCore>> list) {
int nbAdded = 0;
for (auto &e : list) {
auto it = std::find_if(mEventLogList.begin(), mEventLogList.end(), [e](QSharedPointer<EventLogCore> event) {
return e->getEventLogId() == event->getEventLogId();
});
if (it == mEventLogList.end()) {
if (auto message = e->getChatMessageCore())
connect(message.get(), &ChatMessageCore::isReadChanged, this, [this] { emit lUpdateUnreadCount(); });
mEventLogList.append(e);
++nbAdded;
}
}
if (nbAdded > 0) emit eventsInserted(list);
}
void ChatCore::appendEventLogToEventLogList(QSharedPointer<EventLogCore> e) {
if (mEventLogList.contains(e)) return;
auto it = std::find_if(mEventLogList.begin(), mEventLogList.end(), [e](QSharedPointer<EventLogCore> event) {
return e->getEventLogId() == event->getEventLogId();
});
if (it == mEventLogList.end()) {
if (auto message = e->getChatMessageCore())
connect(message.get(), &ChatMessageCore::isReadChanged, this, [this] { emit lUpdateUnreadCount(); });
mEventLogList.append(e);
emit eventsInserted({e});
}
}
void ChatCore::removeEventLogsFromEventLogList(QList<QSharedPointer<EventLogCore>> list) {
int nbRemoved = 0;
for (auto &e : list) {
if (mEventLogList.contains(e)) {
if (auto message = e->getChatMessageCore()) disconnect(message.get());
mEventLogList.removeAll(e);
++nbRemoved;
}
}
if (nbRemoved > 0) emit eventRemoved();
}
void ChatCore::clearEventLogList() {
for (auto &e : mEventLogList) {
disconnect(e.get());
}
mEventLogList.clear();
emit eventListChanged();
}
QString ChatCore::getComposingName() const { QString ChatCore::getComposingName() const {
return mComposingName; return mComposingName;
} }
@ -723,7 +658,7 @@ QSharedPointer<AccountCore> ChatCore::getLocalAccount() const {
void ChatCore::updateInfo(const std::shared_ptr<linphone::Friend> &updatedFriend, bool isRemoval) { void ChatCore::updateInfo(const std::shared_ptr<linphone::Friend> &updatedFriend, bool isRemoval) {
mustBeInLinphoneThread(log().arg(Q_FUNC_INFO)); mustBeInLinphoneThread(log().arg(Q_FUNC_INFO));
auto fAddress = ToolModel::interpretUrl(mPeerAddress); auto fAddress = ToolModel::interpretUrl(mParticipantAddress);
bool isThisFriend = mFriendModel && updatedFriend == mFriendModel->getFriend(); bool isThisFriend = mFriendModel && updatedFriend == mFriendModel->getFriend();
if (!isThisFriend) if (!isThisFriend)
for (auto f : updatedFriend->getAddresses()) { for (auto f : updatedFriend->getAddresses()) {
@ -753,7 +688,8 @@ void ChatCore::updateInfo(const std::shared_ptr<linphone::Friend> &updatedFriend
mAvatarUri = ToolModel::getDisplayName(peer->getAddress()->clone()); mAvatarUri = ToolModel::getDisplayName(peer->getAddress()->clone());
if (participants.size() == 1) { if (participants.size() == 1) {
auto peerAddress = peer->getAddress(); auto peerAddress = peer->getAddress();
if (peerAddress) mPeerAddress = Utils::coreStringToAppString(peerAddress->asStringUriOnly()); if (peerAddress)
mParticipantAddress = Utils::coreStringToAppString(peerAddress->asStringUriOnly());
} }
} }
} else if (mChatModel->hasCapability((int)linphone::ChatRoom::Capabilities::Conference)) { } else if (mChatModel->hasCapability((int)linphone::ChatRoom::Capabilities::Conference)) {

View file

@ -42,7 +42,7 @@ class ChatCore : public QObject, public AbstractObject {
public: public:
Q_PROPERTY(QString title READ getTitle WRITE setTitle NOTIFY titleChanged) Q_PROPERTY(QString title READ getTitle WRITE setTitle NOTIFY titleChanged)
Q_PROPERTY(QString identifier READ getIdentifier CONSTANT) Q_PROPERTY(QString identifier READ getIdentifier CONSTANT)
Q_PROPERTY(QString peerAddress READ getPeerAddress CONSTANT) Q_PROPERTY(QString peerAddress READ getParticipantAddress CONSTANT)
Q_PROPERTY(QString chatRoomAddress READ getChatRoomAddress CONSTANT) Q_PROPERTY(QString chatRoomAddress READ getChatRoomAddress CONSTANT)
Q_PROPERTY(QString avatarUri READ getAvatarUri WRITE setAvatarUri NOTIFY avatarUriChanged) Q_PROPERTY(QString avatarUri READ getAvatarUri WRITE setAvatarUri NOTIFY avatarUriChanged)
Q_PROPERTY(QDateTime lastUpdatedTime READ getLastUpdatedTime WRITE setLastUpdatedTime NOTIFY lastUpdatedTimeChanged) Q_PROPERTY(QDateTime lastUpdatedTime READ getLastUpdatedTime WRITE setLastUpdatedTime NOTIFY lastUpdatedTimeChanged)
@ -118,7 +118,7 @@ public:
void setUnreadMessagesCount(int count); void setUnreadMessagesCount(int count);
QString getChatRoomAddress() const; QString getChatRoomAddress() const;
QString getPeerAddress() const; QString getParticipantAddress() const;
bool getMeAdmin() const; bool getMeAdmin() const;
void setMeAdmin(bool admin); void setMeAdmin(bool admin);
@ -127,12 +127,11 @@ public:
void setIsSecured(bool secured); void setIsSecured(bool secured);
bool computeSecuredStatus() const; bool computeSecuredStatus() const;
QList<QSharedPointer<EventLogCore>> getEventLogList() const; // void resetEventLogList(QList<QSharedPointer<EventLogCore>> list);
void resetEventLogList(QList<QSharedPointer<EventLogCore>> list); // void appendEventLogToEventLogList(QSharedPointer<EventLogCore> event);
void appendEventLogToEventLogList(QSharedPointer<EventLogCore> event); // void appendEventLogsToEventLogList(QList<QSharedPointer<EventLogCore>> list);
void appendEventLogsToEventLogList(QList<QSharedPointer<EventLogCore>> list); // void removeEventLogsFromEventLogList(QList<QSharedPointer<EventLogCore>> list);
void removeEventLogsFromEventLogList(QList<QSharedPointer<EventLogCore>> list); // void clearEventLogList();
void clearEventLogList();
QString getAvatarUri() const; QString getAvatarUri() const;
void setAvatarUri(QString avatarUri); void setAvatarUri(QString avatarUri);
@ -163,6 +162,7 @@ signals:
void titleChanged(QString title); void titleChanged(QString title);
void unreadMessagesCountChanged(int count); void unreadMessagesCountChanged(int count);
void eventListChanged(); void eventListChanged();
void eventListCleared();
void eventsInserted(QList<QSharedPointer<EventLogCore>> list); void eventsInserted(QList<QSharedPointer<EventLogCore>> list);
void eventRemoved(); void eventRemoved();
void avatarUriChanged(); void avatarUriChanged();
@ -203,7 +203,7 @@ signals:
private: private:
QString id; QString id;
QDateTime mLastUpdatedTime; QDateTime mLastUpdatedTime;
QString mPeerAddress; QString mParticipantAddress;
QString mChatRoomAddress; QString mChatRoomAddress;
QString mTitle; QString mTitle;
QString mIdentifier; QString mIdentifier;
@ -229,7 +229,6 @@ private:
LinphoneEnums::ChatRoomState mChatRoomState; LinphoneEnums::ChatRoomState mChatRoomState;
std::shared_ptr<ChatModel> mChatModel; std::shared_ptr<ChatModel> mChatModel;
QSharedPointer<ChatMessageCore> mLastMessage; QSharedPointer<ChatMessageCore> mLastMessage;
QList<QSharedPointer<EventLogCore>> mEventLogList;
QSharedPointer<AccountCore> mLocalAccount; QSharedPointer<AccountCore> mLocalAccount;
std::shared_ptr<FriendModel> mFriendModel; std::shared_ptr<FriendModel> mFriendModel;
QSharedPointer<SafeConnection<ChatCore, ChatModel>> mChatModelConnection; QSharedPointer<SafeConnection<ChatCore, ChatModel>> mChatModelConnection;

View file

@ -81,8 +81,8 @@ void ChatList::connectItem(QSharedPointer<ChatCore> chat) {
void ChatList::setSelf(QSharedPointer<ChatList> me) { void ChatList::setSelf(QSharedPointer<ChatList> me) {
mModelConnection = SafeConnection<ChatList, CoreModel>::create(me, CoreModel::getInstance()); mModelConnection = SafeConnection<ChatList, CoreModel>::create(me, CoreModel::getInstance());
mModelConnection->makeConnectToCore(&ChatList::lUpdate, [this]() { mModelConnection->makeConnectToCore(&ChatList::lUpdate, [this]() {
clearData();
beginResetModel(); beginResetModel();
mList.clear();
mModelConnection->invokeToModel([this]() { mModelConnection->invokeToModel([this]() {
mustBeInLinphoneThread(getClassName()); mustBeInLinphoneThread(getClassName());
// Avoid copy to lambdas // Avoid copy to lambdas
@ -95,6 +95,7 @@ void ChatList::setSelf(QSharedPointer<ChatList> me) {
chats->push_back(model); chats->push_back(model);
} }
mModelConnection->invokeToCore([this, chats]() { mModelConnection->invokeToCore([this, chats]() {
mustBeInMainThread(getClassName());
for (auto &chat : getSharedList<ChatCore>()) { for (auto &chat : getSharedList<ChatCore>()) {
if (chat) { if (chat) {
disconnect(chat.get(), &ChatCore::deleted, this, nullptr); disconnect(chat.get(), &ChatCore::deleted, this, nullptr);
@ -106,7 +107,6 @@ void ChatList::setSelf(QSharedPointer<ChatList> me) {
for (auto &chat : *chats) { for (auto &chat : *chats) {
connectItem(chat); connectItem(chat);
} }
mustBeInMainThread(getClassName());
add(*chats); add(*chats);
endResetModel(); endResetModel();
delete chats; delete chats;
@ -117,27 +117,16 @@ void ChatList::setSelf(QSharedPointer<ChatList> me) {
mModelConnection->makeConnectToModel( mModelConnection->makeConnectToModel(
&CoreModel::defaultAccountChanged, &CoreModel::defaultAccountChanged,
[this](std::shared_ptr<linphone::Core> core, std::shared_ptr<linphone::Account> account) { lUpdate(); }); [this](std::shared_ptr<linphone::Core> core, std::shared_ptr<linphone::Account> account) { lUpdate(); });
auto addChatToList = [this](const std::shared_ptr<linphone::Core> &core, auto addChatToList = [this](const std::shared_ptr<linphone::Core> &core,
const std::shared_ptr<linphone::ChatRoom> &room, const std::shared_ptr<linphone::ChatRoom> &room,
const std::shared_ptr<linphone::ChatMessage> &message) { const std::shared_ptr<linphone::ChatMessage> &message) {
mustBeInLinphoneThread(log().arg(Q_FUNC_INFO)); mustBeInLinphoneThread(log().arg(Q_FUNC_INFO));
if (!message) return; if (!message) return;
auto receiverAddress = message->getToAddress(); if (room->getAccount() != core->getDefaultAccount()) {
if (!receiverAddress) { qWarning() << log().arg("Chat room does not refer to current account, return");
qWarning() << log().arg("Receiver account has no address, return");
return; return;
} }
auto defaultAddress = core->getDefaultAccount()->getContactAddress();
if (defaultAddress && !defaultAddress->weakEqual(receiverAddress)) {
qDebug() << log().arg("Receiver account is not the default one, do not add chat to list");
return;
}
auto senderAddress = message->getFromAddress();
if (defaultAddress && defaultAddress->weakEqual(senderAddress)) {
qDebug() << log().arg("Sender account is the default one, do not add chat to list");
return;
}
auto chatCore = ChatCore::create(room); auto chatCore = ChatCore::create(room);
mModelConnection->invokeToCore([this, chatCore] { mModelConnection->invokeToCore([this, chatCore] {
auto chatList = getSharedList<ChatCore>(); auto chatList = getSharedList<ChatCore>();
@ -191,8 +180,7 @@ int ChatList::findChatIndex(ChatGui *chatGui) {
return it == chatList.end() ? -1 : std::distance(chatList.begin(), it); return it == chatList.end() ? -1 : std::distance(chatList.begin(), it);
} }
void ChatList::addChatInList(ChatGui *chatGui) { void ChatList::addChatInList(QSharedPointer<ChatCore> chatCore) {
auto chatCore = chatGui->mCore;
auto chatList = getSharedList<ChatCore>(); auto chatList = getSharedList<ChatCore>();
auto it = std::find_if(chatList.begin(), chatList.end(), [chatCore](const QSharedPointer<ChatCore> item) { auto it = std::find_if(chatList.begin(), chatList.end(), [chatCore](const QSharedPointer<ChatCore> item) {
return item && chatCore && item->getModel() && chatCore->getModel() && return item && chatCore && item->getModel() && chatCore->getModel() &&

View file

@ -42,7 +42,7 @@ public:
void connectItem(QSharedPointer<ChatCore> chat); void connectItem(QSharedPointer<ChatCore> chat);
int findChatIndex(ChatGui *chat); int findChatIndex(ChatGui *chat);
void addChatInList(ChatGui *chatGui); void addChatInList(QSharedPointer<ChatCore> chatCore);
virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
signals: signals:

View file

@ -69,8 +69,8 @@ int ChatProxy::findChatIndex(ChatGui *chatGui) {
void ChatProxy::addChatInList(ChatGui *chatGui) { void ChatProxy::addChatInList(ChatGui *chatGui) {
auto chatList = getListModel<ChatList>(); auto chatList = getListModel<ChatList>();
if (chatList) { if (chatList && chatGui) {
chatList->addChatInList(chatGui); chatList->addChatInList(chatGui->mCore);
} }
} }

View file

@ -32,6 +32,7 @@ DEFINE_ABSTRACT_OBJECT(ChatMessageFileList)
QSharedPointer<ChatMessageFileList> ChatMessageFileList::create() { QSharedPointer<ChatMessageFileList> ChatMessageFileList::create() {
auto model = QSharedPointer<ChatMessageFileList>(new ChatMessageFileList(), &QObject::deleteLater); auto model = QSharedPointer<ChatMessageFileList>(new ChatMessageFileList(), &QObject::deleteLater);
model->setSelf(model);
model->moveToThread(App::getInstance()->thread()); model->moveToThread(App::getInstance()->thread());
return model; return model;
} }
@ -46,24 +47,77 @@ ChatMessageFileList::~ChatMessageFileList() {
mList.clear(); mList.clear();
} }
void ChatMessageFileList::setSelf(QSharedPointer<ChatMessageFileList> me) {
mCoreModelConnection = SafeConnection<ChatMessageFileList, CoreModel>::create(me, CoreModel::getInstance());
mCoreModelConnection->makeConnectToCore(&ChatMessageFileList::lUpdate, [this]() {
mustBeInMainThread(log().arg(Q_FUNC_INFO));
beginResetModel();
mList.clear();
if (!mChat) {
endResetModel();
return;
}
auto chatModel = mChat->getModel();
if (!chatModel) {
endResetModel();
return;
}
mCoreModelConnection->invokeToModel([this, chatModel]() {
mustBeInLinphoneThread(log().arg(Q_FUNC_INFO));
std::list<std::shared_ptr<linphone::Content>> medias;
std::list<std::shared_ptr<linphone::Content>> docs;
QList<QSharedPointer<ChatMessageContentCore>> *contents =
new QList<QSharedPointer<ChatMessageContentCore>>();
if (mFilterType == (int)FilterContentType::Medias) {
medias = chatModel->getSharedMedias();
} else if (mFilterType == (int)FilterContentType::Documents) {
docs = chatModel->getSharedDocuments();
} else {
medias = chatModel->getSharedMedias();
docs = chatModel->getSharedDocuments();
}
for (auto it : medias) {
auto model = ChatMessageContentCore::create(it, nullptr);
contents->push_back(model);
}
for (auto it : docs) {
auto model = ChatMessageContentCore::create(it, nullptr);
contents->push_back(model);
}
mCoreModelConnection->invokeToCore([this, contents] {
for (auto i : *contents)
mList << i.template objectCast<QObject>();
endResetModel();
});
});
});
}
QSharedPointer<ChatCore> ChatMessageFileList::getChatCore() const { QSharedPointer<ChatCore> ChatMessageFileList::getChatCore() const {
return mChat; return mChat;
} }
void ChatMessageFileList::setChatCore(QSharedPointer<ChatCore> chatCore) { void ChatMessageFileList::setChatCore(QSharedPointer<ChatCore> chatCore) {
if (mChat != chatCore) { if (mChat != chatCore) {
if (mChat) disconnect(mChat.get()); // if (mChat) disconnect(mChat.get());
mChat = chatCore; mChat = chatCore;
auto lUpdate = [this] { // if (mChat) connect(mChat.get(), &ChatCore::fileListChanged, this, lUpdate);
auto fileList = mChat->getFileList();
resetData<ChatMessageContentCore>(fileList);
};
if (mChat) connect(mChat.get(), &ChatCore::fileListChanged, this, lUpdate);
lUpdate(); lUpdate();
emit chatChanged(); emit chatChanged();
} }
} }
int ChatMessageFileList::getFilterType() const {
return mFilterType;
}
void ChatMessageFileList::setFilterType(int filterType) {
if (mFilterType != filterType) {
mFilterType = filterType;
lUpdate();
}
}
QVariant ChatMessageFileList::data(const QModelIndex &index, int role) const { QVariant ChatMessageFileList::data(const QModelIndex &index, int role) const {
int row = index.row(); int row = index.row();
if (!index.isValid() || row < 0 || row >= mList.count()) return QVariant(); if (!index.isValid() || row < 0 || row >= mList.count()) return QVariant();

View file

@ -32,20 +32,29 @@
class ChatMessageFileList : public ListProxy, public AbstractObject { class ChatMessageFileList : public ListProxy, public AbstractObject {
Q_OBJECT Q_OBJECT
public: public:
enum class FilterContentType { All = 0, Medias = 1, Documents = 2 };
static QSharedPointer<ChatMessageFileList> create(); static QSharedPointer<ChatMessageFileList> create();
ChatMessageFileList(QObject *parent = Q_NULLPTR); ChatMessageFileList(QObject *parent = Q_NULLPTR);
~ChatMessageFileList(); ~ChatMessageFileList();
void setSelf(QSharedPointer<ChatMessageFileList> me);
QSharedPointer<ChatCore> getChatCore() const; QSharedPointer<ChatCore> getChatCore() const;
void setChatCore(QSharedPointer<ChatCore> chatCore); void setChatCore(QSharedPointer<ChatCore> chatCore);
int getFilterType() const;
void setFilterType(int filterType);
virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
signals: signals:
void chatChanged(); void chatChanged();
void lUpdate();
void filterTypeChanged();
private: private:
int mFilterType;
QSharedPointer<ChatCore> mChat; QSharedPointer<ChatCore> mChat;
QSharedPointer<SafeConnection<ChatMessageFileList, CoreModel>> mCoreModelConnection;
DECLARE_ABSTRACT_OBJECT DECLARE_ABSTRACT_OBJECT
}; };

View file

@ -59,9 +59,21 @@ QSharedPointer<ChatCore> EventLogList::getChatCore() const {
return mChatCore; return mChatCore;
} }
void EventLogList::disconnectItem(const QSharedPointer<EventLogCore> &item) {
auto message = item->getChatMessageCore();
if (message) {
disconnect(message.get(), &ChatMessageCore::isReadChanged, this, nullptr);
disconnect(message.get(), &ChatMessageCore::deleted, this, nullptr);
disconnect(message.get(), &ChatMessageCore::ephemeralDurationChanged, this, nullptr);
}
}
void EventLogList::connectItem(const QSharedPointer<EventLogCore> &item) { void EventLogList::connectItem(const QSharedPointer<EventLogCore> &item) {
auto message = item->getChatMessageCore(); auto message = item->getChatMessageCore();
if (message) { if (message) {
connect(message.get(), &ChatMessageCore::isReadChanged, this, [this] {
if (mChatCore) emit mChatCore->lUpdateUnreadCount();
});
connect(message.get(), &ChatMessageCore::deleted, this, [this, item] { connect(message.get(), &ChatMessageCore::deleted, this, [this, item] {
if (mChatCore) emit mChatCore->lUpdateLastMessage(); if (mChatCore) emit mChatCore->lUpdateLastMessage();
remove(item); remove(item);
@ -83,6 +95,7 @@ void EventLogList::setChatCore(QSharedPointer<ChatCore> core) {
mChatCore = core; mChatCore = core;
if (mChatCore) { if (mChatCore) {
connect(mChatCore.get(), &ChatCore::eventListChanged, this, &EventLogList::lUpdate); connect(mChatCore.get(), &ChatCore::eventListChanged, this, &EventLogList::lUpdate);
connect(mChatCore.get(), &ChatCore::eventListCleared, this, [this] { resetData(); });
connect(mChatCore.get(), &ChatCore::eventsInserted, this, [this](QList<QSharedPointer<EventLogCore>> list) { connect(mChatCore.get(), &ChatCore::eventsInserted, this, [this](QList<QSharedPointer<EventLogCore>> list) {
auto eventsList = getSharedList<EventLogCore>(); auto eventsList = getSharedList<EventLogCore>();
for (auto &event : list) { for (auto &event : list) {
@ -98,8 +111,8 @@ void EventLogList::setChatCore(QSharedPointer<ChatCore> core) {
} }
}); });
} }
emit eventChanged();
lUpdate(); lUpdate();
emit chatGuiChanged();
} }
} }
@ -150,22 +163,45 @@ void EventLogList::findChatMessageWithFilter(QString filter,
} }
void EventLogList::setSelf(QSharedPointer<EventLogList> me) { void EventLogList::setSelf(QSharedPointer<EventLogList> me) {
connect(this, &EventLogList::lUpdate, this, [this]() { mCoreModelConnection = SafeConnection<EventLogList, CoreModel>::create(me, CoreModel::getInstance());
resetData();
emit listAboutToBeReset(); mCoreModelConnection->makeConnectToCore(&EventLogList::lUpdate, [this]() {
for (auto &event : getSharedList<EventLogCore>()) { mustBeInMainThread(log().arg(Q_FUNC_INFO));
auto message = event->getChatMessageCore(); beginResetModel();
if (message) { mList.clear();
disconnect(message.get(), &ChatMessageCore::ephemeralDurationChanged, this, nullptr); if (!mChatCore) {
disconnect(message.get(), &ChatMessageCore::deleted, this, nullptr); endResetModel();
return;
}
auto chatModel = mChatCore->getModel();
if (!chatModel) {
endResetModel();
return;
}
mCoreModelConnection->invokeToModel([this, chatModel]() {
mustBeInLinphoneThread(log().arg(Q_FUNC_INFO));
auto linphoneLogs = chatModel->getHistory();
QList<QSharedPointer<EventLogCore>> *events = new QList<QSharedPointer<EventLogCore>>();
for (auto it : linphoneLogs) {
auto model = EventLogCore::create(it);
events->push_back(model);
} }
} mCoreModelConnection->invokeToCore([this, events] {
if (!mChatCore) return; for (auto &event : getSharedList<EventLogCore>()) {
auto events = mChatCore->getEventLogList(); auto message = event->getChatMessageCore();
for (auto &event : events) { if (message) {
connectItem(event); disconnect(message.get(), &ChatMessageCore::ephemeralDurationChanged, this, nullptr);
} disconnect(message.get(), &ChatMessageCore::deleted, this, nullptr);
resetData<EventLogCore>(events); }
}
for (auto &event : *events) {
connectItem(event);
}
for (auto i : *events)
mList << i.template objectCast<QObject>();
endResetModel();
});
});
}); });
connect(this, &EventLogList::filterChanged, [this](QString filter) { connect(this, &EventLogList::filterChanged, [this](QString filter) {

View file

@ -46,6 +46,7 @@ public:
void setChatGui(ChatGui *chat); void setChatGui(ChatGui *chat);
void connectItem(const QSharedPointer<EventLogCore> &item); void connectItem(const QSharedPointer<EventLogCore> &item);
void disconnectItem(const QSharedPointer<EventLogCore> &item);
int findFirstUnreadIndex(); int findFirstUnreadIndex();
@ -61,15 +62,16 @@ public:
signals: signals:
void lUpdate(); void lUpdate();
void filterChanged(QString filter); void filterChanged(QString filter);
void eventChanged();
void eventInserted(int index, EventLogGui *message); void eventInserted(int index, EventLogGui *message);
void messageWithFilterFound(int index); void messageWithFilterFound(int index);
void listAboutToBeReset(); void listAboutToBeReset();
void chatGuiChanged();
private: private:
QString mFilter; QString mFilter;
QSharedPointer<ChatCore> mChatCore; QSharedPointer<ChatCore> mChatCore;
QSharedPointer<SafeConnection<ChatCore, ChatModel>> mModelConnection; QSharedPointer<SafeConnection<ChatCore, ChatModel>> mChatModelConnection;
QSharedPointer<SafeConnection<EventLogList, CoreModel>> mCoreModelConnection;
DECLARE_ABSTRACT_OBJECT DECLARE_ABSTRACT_OBJECT
}; };

View file

@ -41,8 +41,8 @@ void EventLogProxy::setSourceModel(QAbstractItemModel *model) {
} }
auto newEventLogList = dynamic_cast<EventLogList *>(model); auto newEventLogList = dynamic_cast<EventLogList *>(model);
if (newEventLogList) { if (newEventLogList) {
connect(newEventLogList, &EventLogList::eventChanged, this, &EventLogProxy::eventChanged);
connect(newEventLogList, &EventLogList::listAboutToBeReset, this, &EventLogProxy::listAboutToBeReset); connect(newEventLogList, &EventLogList::listAboutToBeReset, this, &EventLogProxy::listAboutToBeReset);
connect(newEventLogList, &EventLogList::chatGuiChanged, this, &EventLogProxy::chatGuiChanged);
connect(newEventLogList, &EventLogList::eventInserted, this, connect(newEventLogList, &EventLogList::eventInserted, this,
[this, newEventLogList](int index, EventLogGui *event) { [this, newEventLogList](int index, EventLogGui *event) {
invalidate(); invalidate();

View file

@ -31,7 +31,7 @@ class ChatGui;
class EventLogProxy : public LimitProxy, public AbstractObject { class EventLogProxy : public LimitProxy, public AbstractObject {
Q_OBJECT Q_OBJECT
Q_PROPERTY(ChatGui *chatGui READ getChatGui WRITE setChatGui NOTIFY eventChanged) Q_PROPERTY(ChatGui *chatGui READ getChatGui WRITE setChatGui NOTIFY chatGuiChanged)
public: public:
DECLARE_SORTFILTER_CLASS() DECLARE_SORTFILTER_CLASS()
@ -52,10 +52,10 @@ public:
Q_INVOKABLE void findIndexCorrespondingToFilter(int startIndex, bool forward = true, bool isFirstResearch = true); Q_INVOKABLE void findIndexCorrespondingToFilter(int startIndex, bool forward = true, bool isFirstResearch = true);
signals: signals:
void eventChanged();
void eventInserted(int index, EventLogGui *message); void eventInserted(int index, EventLogGui *message);
void indexWithFilterFound(int index); void indexWithFilterFound(int index);
void listAboutToBeReset(); void listAboutToBeReset();
void chatGuiChanged();
protected: protected:
QSharedPointer<EventLogList> mList; QSharedPointer<EventLogList> mList;

View file

@ -60,16 +60,22 @@ void ConferenceInfoList::setSelf(QSharedPointer<ConferenceInfoList> me) {
mCoreModelConnection->makeConnectToCore(&ConferenceInfoList::lUpdate, [this]() { mCoreModelConnection->makeConnectToCore(&ConferenceInfoList::lUpdate, [this]() {
mCoreModelConnection->invokeToModel([this]() { mCoreModelConnection->invokeToModel([this]() {
QList<QSharedPointer<ConferenceInfoCore>> *items = new QList<QSharedPointer<ConferenceInfoCore>>();
mustBeInLinphoneThread(getClassName()); mustBeInLinphoneThread(getClassName());
beginResetModel();
mList.clear();
QList<QSharedPointer<ConferenceInfoCore>> *items = new QList<QSharedPointer<ConferenceInfoCore>>();
auto defaultAccount = CoreModel::getInstance()->getCore()->getDefaultAccount(); auto defaultAccount = CoreModel::getInstance()->getCore()->getDefaultAccount();
setAccountConnected(defaultAccount && defaultAccount->getState() == linphone::RegistrationState::Ok); setAccountConnected(defaultAccount && defaultAccount->getState() == linphone::RegistrationState::Ok);
if (!defaultAccount || !mAccountConnected) { if (!defaultAccount || !mAccountConnected) {
endResetModel();
return; return;
} }
std::list<std::shared_ptr<linphone::ConferenceInfo>> conferenceInfos = std::list<std::shared_ptr<linphone::ConferenceInfo>> conferenceInfos =
defaultAccount->getConferenceInformationList(); defaultAccount->getConferenceInformationList();
if (conferenceInfos.empty()) return; if (conferenceInfos.empty()) {
endResetModel();
return;
}
items->push_back(nullptr); // Add Dummy conference for today items->push_back(nullptr); // Add Dummy conference for today
for (auto conferenceInfo : conferenceInfos) { for (auto conferenceInfo : conferenceInfos) {
if (conferenceInfo->getState() == linphone::ConferenceInfo::State::Cancelled) { if (conferenceInfo->getState() == linphone::ConferenceInfo::State::Cancelled) {
@ -86,8 +92,9 @@ void ConferenceInfoList::setSelf(QSharedPointer<ConferenceInfoList> me) {
mustBeInMainThread(getClassName()); mustBeInMainThread(getClassName());
for (auto &item : *items) { for (auto &item : *items) {
connectItem(item); connectItem(item);
mList << item.template objectCast<QObject>();
} }
resetData(*items); endResetModel();
delete items; delete items;
}); });
}); });

View file

@ -1852,65 +1852,65 @@
<context> <context>
<name>ChatListView</name> <name>ChatListView</name>
<message> <message>
<location filename="../../view/Control/Display/Chat/ChatListView.qml" line="279"/> <location filename="../../view/Control/Display/Chat/ChatListView.qml" line="286"/>
<source>chat_message_is_writing_info</source> <source>chat_message_is_writing_info</source>
<extracomment>%1 is writing</extracomment> <extracomment>%1 is writing</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Chat/ChatListView.qml" line="281"/> <location filename="../../view/Control/Display/Chat/ChatListView.qml" line="288"/>
<source>chat_message_draft_sending_text</source> <source>chat_message_draft_sending_text</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Chat/ChatListView.qml" line="423"/> <location filename="../../view/Control/Display/Chat/ChatListView.qml" line="430"/>
<source>chat_room_delete</source> <source>chat_room_delete</source>
<extracomment>&quot;Delete&quot;</extracomment> <extracomment>&quot;Delete&quot;</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Chat/ChatListView.qml" line="363"/> <location filename="../../view/Control/Display/Chat/ChatListView.qml" line="370"/>
<source>chat_room_mute</source> <source>chat_room_mute</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Chat/ChatListView.qml" line="362"/> <location filename="../../view/Control/Display/Chat/ChatListView.qml" line="369"/>
<source>chat_room_unmute</source> <source>chat_room_unmute</source>
<extracomment>&quot;Mute&quot;</extracomment> <extracomment>&quot;Mute&quot;</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Chat/ChatListView.qml" line="375"/> <location filename="../../view/Control/Display/Chat/ChatListView.qml" line="382"/>
<source>chat_room_mark_as_read</source> <source>chat_room_mark_as_read</source>
<extracomment>&quot;Mark as read&quot;</extracomment> <extracomment>&quot;Mark as read&quot;</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Chat/ChatListView.qml" line="394"/> <location filename="../../view/Control/Display/Chat/ChatListView.qml" line="401"/>
<source>chat_room_leave</source> <source>chat_room_leave</source>
<extracomment>&quot;leave&quot;</extracomment> <extracomment>&quot;leave&quot;</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Chat/ChatListView.qml" line="400"/> <location filename="../../view/Control/Display/Chat/ChatListView.qml" line="407"/>
<source>chat_list_leave_chat_popup_title</source> <source>chat_list_leave_chat_popup_title</source>
<extracomment>leave the conversation ?</extracomment> <extracomment>leave the conversation ?</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Chat/ChatListView.qml" line="402"/> <location filename="../../view/Control/Display/Chat/ChatListView.qml" line="409"/>
<source>chat_list_leave_chat_popup_message</source> <source>chat_list_leave_chat_popup_message</source>
<extracomment>You will not be able to send or receive messages in this conversation anymore. Do You want to continue ?</extracomment> <extracomment>You will not be able to send or receive messages in this conversation anymore. Do You want to continue ?</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Chat/ChatListView.qml" line="429"/> <location filename="../../view/Control/Display/Chat/ChatListView.qml" line="436"/>
<source>chat_list_delete_chat_popup_title</source> <source>chat_list_delete_chat_popup_title</source>
<extracomment>Delete the conversation ?</extracomment> <extracomment>Delete the conversation ?</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Chat/ChatListView.qml" line="431"/> <location filename="../../view/Control/Display/Chat/ChatListView.qml" line="438"/>
<source>chat_list_delete_chat_popup_message</source> <source>chat_list_delete_chat_popup_message</source>
<extracomment>This conversation and all its messages will be deleted. Do You want to continue ?</extracomment> <extracomment>This conversation and all its messages will be deleted. Do You want to continue ?</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
@ -2153,45 +2153,45 @@ Error</extracomment>
<context> <context>
<name>ChatMessagesListView</name> <name>ChatMessagesListView</name>
<message> <message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="113"/> <location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="112"/>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="124"/> <location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="123"/>
<source>popup_info_find_message_title</source> <source>popup_info_find_message_title</source>
<extracomment>Find message</extracomment> <extracomment>Find message</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="126"/> <location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="125"/>
<source>info_popup_no_result_message</source> <source>info_popup_no_result_message</source>
<extracomment>No result found</extracomment> <extracomment>No result found</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="118"/> <location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="117"/>
<source>info_popup_first_result_message</source> <source>info_popup_first_result_message</source>
<extracomment>First result reached</extracomment> <extracomment>First result reached</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="116"/> <location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="115"/>
<source>info_popup_last_result_message</source> <source>info_popup_last_result_message</source>
<extracomment>Last result reached</extracomment> <extracomment>Last result reached</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="162"/> <location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="161"/>
<source>chat_message_list_encrypted_header_title</source> <source>chat_message_list_encrypted_header_title</source>
<extracomment>End to end encrypted chat</extracomment> <extracomment>End to end encrypted chat</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="172"/> <location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="171"/>
<source>chat_message_list_encrypted_header_message</source> <source>chat_message_list_encrypted_header_message</source>
<extracomment>Les messages de cette conversation sont chiffrés de bout <extracomment>Les messages de cette conversation sont chiffrés de bout
en bout. Seul votre correspondant peut les déchiffrer.</extracomment> en bout. Seul votre correspondant peut les déchiffrer.</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="212"/> <location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="211"/>
<source>chat_message_is_writing_info</source> <source>chat_message_is_writing_info</source>
<extracomment>%1 is writing</extracomment> <extracomment>%1 is writing</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
@ -2212,79 +2212,79 @@ Error</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Main/Chat/ChatPage.qml" line="68"/> <location filename="../../view/Page/Main/Chat/ChatPage.qml" line="69"/>
<source>chat_dialog_delete_chat_title</source> <source>chat_dialog_delete_chat_title</source>
<extracomment>Supprimer la conversation ?</extracomment> <extracomment>Supprimer la conversation ?</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Main/Chat/ChatPage.qml" line="70"/> <location filename="../../view/Page/Main/Chat/ChatPage.qml" line="71"/>
<source>chat_dialog_delete_chat_message</source> <source>chat_dialog_delete_chat_message</source>
<extracomment>&quot;La conversation et tous ses messages seront supprimés.&quot;</extracomment> <extracomment>&quot;La conversation et tous ses messages seront supprimés.&quot;</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Main/Chat/ChatPage.qml" line="99"/> <location filename="../../view/Page/Main/Chat/ChatPage.qml" line="100"/>
<source>chat_list_title</source> <source>chat_list_title</source>
<extracomment>&quot;Conversations&quot;</extracomment> <extracomment>&quot;Conversations&quot;</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Main/Chat/ChatPage.qml" line="120"/> <location filename="../../view/Page/Main/Chat/ChatPage.qml" line="121"/>
<source>menu_mark_all_as_read</source> <source>menu_mark_all_as_read</source>
<extracomment>&quot;mark all as read&quot;</extracomment> <extracomment>&quot;mark all as read&quot;</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Main/Chat/ChatPage.qml" line="151"/> <location filename="../../view/Page/Main/Chat/ChatPage.qml" line="152"/>
<source>chat_search_in_history</source> <source>chat_search_in_history</source>
<extracomment>&quot;Rechercher une conversation&quot;</extracomment> <extracomment>&quot;Rechercher une conversation&quot;</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Main/Chat/ChatPage.qml" line="174"/> <location filename="../../view/Page/Main/Chat/ChatPage.qml" line="175"/>
<source>list_filter_no_result_found</source> <source>list_filter_no_result_found</source>
<extracomment>&quot;Aucun résultat&quot;</extracomment> <extracomment>&quot;Aucun résultat&quot;</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Main/Chat/ChatPage.qml" line="176"/> <location filename="../../view/Page/Main/Chat/ChatPage.qml" line="177"/>
<source>chat_list_empty_history</source> <source>chat_list_empty_history</source>
<extracomment>&quot;Aucune conversation dans votre historique&quot;</extracomment> <extracomment>&quot;Aucune conversation dans votre historique&quot;</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Main/Chat/ChatPage.qml" line="245"/> <location filename="../../view/Page/Main/Chat/ChatPage.qml" line="250"/>
<source>chat_action_start_new_chat</source> <source>chat_action_start_new_chat</source>
<extracomment>&quot;New chat&quot;</extracomment> <extracomment>&quot;New chat&quot;</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Main/Chat/ChatPage.qml" line="281"/> <location filename="../../view/Page/Main/Chat/ChatPage.qml" line="286"/>
<source>chat_start_group_chat_title</source> <source>chat_start_group_chat_title</source>
<extracomment>&quot;Nouveau groupe&quot;</extracomment> <extracomment>&quot;Nouveau groupe&quot;</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Main/Chat/ChatPage.qml" line="283"/> <location filename="../../view/Page/Main/Chat/ChatPage.qml" line="288"/>
<source>chat_action_start_group_chat</source> <source>chat_action_start_group_chat</source>
<extracomment>&quot;Créer&quot;</extracomment> <extracomment>&quot;Créer&quot;</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Main/Chat/ChatPage.qml" line="309"/> <location filename="../../view/Page/Main/Chat/ChatPage.qml" line="314"/>
<location filename="../../view/Page/Main/Chat/ChatPage.qml" line="313"/> <location filename="../../view/Page/Main/Chat/ChatPage.qml" line="318"/>
<source>information_popup_error_title</source> <source>information_popup_error_title</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Main/Chat/ChatPage.qml" line="311"/> <location filename="../../view/Page/Main/Chat/ChatPage.qml" line="316"/>
<source>group_chat_error_must_have_name</source> <source>group_chat_error_must_have_name</source>
<extracomment>&quot;Un nom doit être donné au groupe</extracomment> <extracomment>&quot;Un nom doit être donné au groupe</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Main/Chat/ChatPage.qml" line="315"/> <location filename="../../view/Page/Main/Chat/ChatPage.qml" line="320"/>
<source>group_call_error_not_connected</source> <source>group_call_error_not_connected</source>
<extracomment>&quot;Vous n&apos;etes pas connecté&quot;</extracomment> <extracomment>&quot;Vous n&apos;etes pas connecté&quot;</extracomment>
<translation type="unfinished">Sie sind nicht verbunden</translation> <translation type="unfinished">Sie sind nicht verbunden</translation>
@ -4029,13 +4029,13 @@ Error</extracomment>
<context> <context>
<name>MeetingListView</name> <name>MeetingListView</name>
<message> <message>
<location filename="../../view/Control/Display/Meeting/MeetingListView.qml" line="276"/> <location filename="../../view/Control/Display/Meeting/MeetingListView.qml" line="277"/>
<source>meeting_info_cancelled</source> <source>meeting_info_cancelled</source>
<extracomment>&quot;Réunion annulée&quot;</extracomment> <extracomment>&quot;Réunion annulée&quot;</extracomment>
<translation>Besprechung abgesagt</translation> <translation>Besprechung abgesagt</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Meeting/MeetingListView.qml" line="300"/> <location filename="../../view/Control/Display/Meeting/MeetingListView.qml" line="301"/>
<source>meetings_list_no_meeting_for_today</source> <source>meetings_list_no_meeting_for_today</source>
<extracomment>&quot;Aucune réunion aujourd&apos;hui&quot;</extracomment> <extracomment>&quot;Aucune réunion aujourd&apos;hui&quot;</extracomment>
<translation>Heute keine Besprechungen</translation> <translation>Heute keine Besprechungen</translation>
@ -4300,6 +4300,21 @@ Error</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
</context> </context>
<context>
<name>MessageSharedFilesInfos</name>
<message>
<location filename="../../view/Page/Layout/Chat/MessageSharedFilesInfos.qml" line="39"/>
<source>no_shared_medias</source>
<extracomment>No media</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/MessageSharedFilesInfos.qml" line="41"/>
<source>no_shared_documents</source>
<extracomment>No document</extracomment>
<translation type="unfinished"></translation>
</message>
</context>
<context> <context>
<name>MultimediaSettings</name> <name>MultimediaSettings</name>
<message> <message>
@ -5094,31 +5109,31 @@ Pour les activer dans un projet commercial, merci de nous contacter.</source>
<translation>Start a group call ?</translation> <translation>Start a group call ?</translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="431"/> <location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="427"/>
<source>reply_to_label</source> <source>reply_to_label</source>
<extracomment>Reply to %1</extracomment> <extracomment>Reply to %1</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="631"/> <location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="627"/>
<source>shared_medias_title</source> <source>shared_medias_title</source>
<extracomment>Shared medias</extracomment> <extracomment>Shared medias</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="633"/> <location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="629"/>
<source>shared_documents_title</source> <source>shared_documents_title</source>
<extracomment>Shared documents</extracomment> <extracomment>Shared documents</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="662"/> <location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="658"/>
<source>forward_to_title</source> <source>forward_to_title</source>
<extracomment>Forward to</extracomment> <extracomment>Forward to</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="696"/> <location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="692"/>
<source>conversations_title</source> <source>conversations_title</source>
<extracomment>Conversations</extracomment> <extracomment>Conversations</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>

View file

@ -1814,65 +1814,65 @@
<context> <context>
<name>ChatListView</name> <name>ChatListView</name>
<message> <message>
<location filename="../../view/Control/Display/Chat/ChatListView.qml" line="279"/> <location filename="../../view/Control/Display/Chat/ChatListView.qml" line="286"/>
<source>chat_message_is_writing_info</source> <source>chat_message_is_writing_info</source>
<extracomment>%1 is writing</extracomment> <extracomment>%1 is writing</extracomment>
<translation>%1 is writing</translation> <translation>%1 is writing</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Chat/ChatListView.qml" line="281"/> <location filename="../../view/Control/Display/Chat/ChatListView.qml" line="288"/>
<source>chat_message_draft_sending_text</source> <source>chat_message_draft_sending_text</source>
<translation>Draft : %1</translation> <translation>Draft : %1</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Chat/ChatListView.qml" line="423"/> <location filename="../../view/Control/Display/Chat/ChatListView.qml" line="430"/>
<source>chat_room_delete</source> <source>chat_room_delete</source>
<extracomment>&quot;Delete&quot;</extracomment> <extracomment>&quot;Delete&quot;</extracomment>
<translation>Delete</translation> <translation>Delete</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Chat/ChatListView.qml" line="363"/> <location filename="../../view/Control/Display/Chat/ChatListView.qml" line="370"/>
<source>chat_room_mute</source> <source>chat_room_mute</source>
<translation>Mute</translation> <translation>Mute</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Chat/ChatListView.qml" line="362"/> <location filename="../../view/Control/Display/Chat/ChatListView.qml" line="369"/>
<source>chat_room_unmute</source> <source>chat_room_unmute</source>
<extracomment>&quot;Mute&quot;</extracomment> <extracomment>&quot;Mute&quot;</extracomment>
<translation>Unmute</translation> <translation>Unmute</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Chat/ChatListView.qml" line="375"/> <location filename="../../view/Control/Display/Chat/ChatListView.qml" line="382"/>
<source>chat_room_mark_as_read</source> <source>chat_room_mark_as_read</source>
<extracomment>&quot;Mark as read&quot;</extracomment> <extracomment>&quot;Mark as read&quot;</extracomment>
<translation>Mark as read</translation> <translation>Mark as read</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Chat/ChatListView.qml" line="394"/> <location filename="../../view/Control/Display/Chat/ChatListView.qml" line="401"/>
<source>chat_room_leave</source> <source>chat_room_leave</source>
<extracomment>&quot;leave&quot;</extracomment> <extracomment>&quot;leave&quot;</extracomment>
<translation>Leave</translation> <translation>Leave</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Chat/ChatListView.qml" line="400"/> <location filename="../../view/Control/Display/Chat/ChatListView.qml" line="407"/>
<source>chat_list_leave_chat_popup_title</source> <source>chat_list_leave_chat_popup_title</source>
<extracomment>leave the conversation ?</extracomment> <extracomment>leave the conversation ?</extracomment>
<translation>Leave the conversation ?</translation> <translation>Leave the conversation ?</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Chat/ChatListView.qml" line="402"/> <location filename="../../view/Control/Display/Chat/ChatListView.qml" line="409"/>
<source>chat_list_leave_chat_popup_message</source> <source>chat_list_leave_chat_popup_message</source>
<extracomment>You will not be able to send or receive messages in this conversation anymore. Do You want to continue ?</extracomment> <extracomment>You will not be able to send or receive messages in this conversation anymore. Do You want to continue ?</extracomment>
<translation>You will not be able to send or receive messages in this conversation anymore. Do You want to continue ?</translation> <translation>You will not be able to send or receive messages in this conversation anymore. Do You want to continue ?</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Chat/ChatListView.qml" line="429"/> <location filename="../../view/Control/Display/Chat/ChatListView.qml" line="436"/>
<source>chat_list_delete_chat_popup_title</source> <source>chat_list_delete_chat_popup_title</source>
<extracomment>Delete the conversation ?</extracomment> <extracomment>Delete the conversation ?</extracomment>
<translation>Delete the conversation ?</translation> <translation>Delete the conversation ?</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Chat/ChatListView.qml" line="431"/> <location filename="../../view/Control/Display/Chat/ChatListView.qml" line="438"/>
<source>chat_list_delete_chat_popup_message</source> <source>chat_list_delete_chat_popup_message</source>
<extracomment>This conversation and all its messages will be deleted. Do You want to continue ?</extracomment> <extracomment>This conversation and all its messages will be deleted. Do You want to continue ?</extracomment>
<translation>This conversation and all its messages will be deleted. Do You want to continue ?</translation> <translation>This conversation and all its messages will be deleted. Do You want to continue ?</translation>
@ -2115,38 +2115,38 @@ Error</extracomment>
<context> <context>
<name>ChatMessagesListView</name> <name>ChatMessagesListView</name>
<message> <message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="113"/> <location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="112"/>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="124"/> <location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="123"/>
<source>popup_info_find_message_title</source> <source>popup_info_find_message_title</source>
<extracomment>Find message</extracomment> <extracomment>Find message</extracomment>
<translation>Find message</translation> <translation>Find message</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="126"/> <location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="125"/>
<source>info_popup_no_result_message</source> <source>info_popup_no_result_message</source>
<extracomment>No result found</extracomment> <extracomment>No result found</extracomment>
<translation>No result found</translation> <translation>No result found</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="118"/> <location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="117"/>
<source>info_popup_first_result_message</source> <source>info_popup_first_result_message</source>
<extracomment>First result reached</extracomment> <extracomment>First result reached</extracomment>
<translation>First result reached</translation> <translation>First result reached</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="116"/> <location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="115"/>
<source>info_popup_last_result_message</source> <source>info_popup_last_result_message</source>
<extracomment>Last result reached</extracomment> <extracomment>Last result reached</extracomment>
<translation>Last result reached</translation> <translation>Last result reached</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="162"/> <location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="161"/>
<source>chat_message_list_encrypted_header_title</source> <source>chat_message_list_encrypted_header_title</source>
<extracomment>End to end encrypted chat</extracomment> <extracomment>End to end encrypted chat</extracomment>
<translation>End to end encrypted chat</translation> <translation>End to end encrypted chat</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="172"/> <location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="171"/>
<source>chat_message_list_encrypted_header_message</source> <source>chat_message_list_encrypted_header_message</source>
<extracomment>Les messages de cette conversation sont chiffrés de bout <extracomment>Les messages de cette conversation sont chiffrés de bout
en bout. Seul votre correspondant peut les déchiffrer.</extracomment> en bout. Seul votre correspondant peut les déchiffrer.</extracomment>
@ -2154,7 +2154,7 @@ Error</extracomment>
Only your correspondent can decrypt them.</translation> Only your correspondent can decrypt them.</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="212"/> <location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="211"/>
<source>chat_message_is_writing_info</source> <source>chat_message_is_writing_info</source>
<extracomment>%1 is writing</extracomment> <extracomment>%1 is writing</extracomment>
<translation>%1 is writing</translation> <translation>%1 is writing</translation>
@ -2175,79 +2175,79 @@ Only your correspondent can decrypt them.</translation>
<translation>No conversation</translation> <translation>No conversation</translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Main/Chat/ChatPage.qml" line="68"/> <location filename="../../view/Page/Main/Chat/ChatPage.qml" line="69"/>
<source>chat_dialog_delete_chat_title</source> <source>chat_dialog_delete_chat_title</source>
<extracomment>Supprimer la conversation ?</extracomment> <extracomment>Supprimer la conversation ?</extracomment>
<translation>Delete conversation ?</translation> <translation>Delete conversation ?</translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Main/Chat/ChatPage.qml" line="70"/> <location filename="../../view/Page/Main/Chat/ChatPage.qml" line="71"/>
<source>chat_dialog_delete_chat_message</source> <source>chat_dialog_delete_chat_message</source>
<extracomment>&quot;La conversation et tous ses messages seront supprimés.&quot;</extracomment> <extracomment>&quot;La conversation et tous ses messages seront supprimés.&quot;</extracomment>
<translation>This conversation and all its messages will be deleted.</translation> <translation>This conversation and all its messages will be deleted.</translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Main/Chat/ChatPage.qml" line="99"/> <location filename="../../view/Page/Main/Chat/ChatPage.qml" line="100"/>
<source>chat_list_title</source> <source>chat_list_title</source>
<extracomment>&quot;Conversations&quot;</extracomment> <extracomment>&quot;Conversations&quot;</extracomment>
<translation>Conversations</translation> <translation>Conversations</translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Main/Chat/ChatPage.qml" line="120"/> <location filename="../../view/Page/Main/Chat/ChatPage.qml" line="121"/>
<source>menu_mark_all_as_read</source> <source>menu_mark_all_as_read</source>
<extracomment>&quot;mark all as read&quot;</extracomment> <extracomment>&quot;mark all as read&quot;</extracomment>
<translation>Mark all as read</translation> <translation>Mark all as read</translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Main/Chat/ChatPage.qml" line="151"/> <location filename="../../view/Page/Main/Chat/ChatPage.qml" line="152"/>
<source>chat_search_in_history</source> <source>chat_search_in_history</source>
<extracomment>&quot;Rechercher une conversation&quot;</extracomment> <extracomment>&quot;Rechercher une conversation&quot;</extracomment>
<translation>Search for a chat</translation> <translation>Search for a chat</translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Main/Chat/ChatPage.qml" line="174"/> <location filename="../../view/Page/Main/Chat/ChatPage.qml" line="175"/>
<source>list_filter_no_result_found</source> <source>list_filter_no_result_found</source>
<extracomment>&quot;Aucun résultat&quot;</extracomment> <extracomment>&quot;Aucun résultat&quot;</extracomment>
<translation>No result</translation> <translation>No result</translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Main/Chat/ChatPage.qml" line="176"/> <location filename="../../view/Page/Main/Chat/ChatPage.qml" line="177"/>
<source>chat_list_empty_history</source> <source>chat_list_empty_history</source>
<extracomment>&quot;Aucune conversation dans votre historique&quot;</extracomment> <extracomment>&quot;Aucune conversation dans votre historique&quot;</extracomment>
<translation>No conversation in history</translation> <translation>No conversation in history</translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Main/Chat/ChatPage.qml" line="245"/> <location filename="../../view/Page/Main/Chat/ChatPage.qml" line="250"/>
<source>chat_action_start_new_chat</source> <source>chat_action_start_new_chat</source>
<extracomment>&quot;New chat&quot;</extracomment> <extracomment>&quot;New chat&quot;</extracomment>
<translation>New conversation</translation> <translation>New conversation</translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Main/Chat/ChatPage.qml" line="281"/> <location filename="../../view/Page/Main/Chat/ChatPage.qml" line="286"/>
<source>chat_start_group_chat_title</source> <source>chat_start_group_chat_title</source>
<extracomment>&quot;Nouveau groupe&quot;</extracomment> <extracomment>&quot;Nouveau groupe&quot;</extracomment>
<translation>New group</translation> <translation>New group</translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Main/Chat/ChatPage.qml" line="283"/> <location filename="../../view/Page/Main/Chat/ChatPage.qml" line="288"/>
<source>chat_action_start_group_chat</source> <source>chat_action_start_group_chat</source>
<extracomment>&quot;Créer&quot;</extracomment> <extracomment>&quot;Créer&quot;</extracomment>
<translation>Create</translation> <translation>Create</translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Main/Chat/ChatPage.qml" line="309"/> <location filename="../../view/Page/Main/Chat/ChatPage.qml" line="314"/>
<location filename="../../view/Page/Main/Chat/ChatPage.qml" line="313"/> <location filename="../../view/Page/Main/Chat/ChatPage.qml" line="318"/>
<source>information_popup_error_title</source> <source>information_popup_error_title</source>
<translation>Error</translation> <translation>Error</translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Main/Chat/ChatPage.qml" line="311"/> <location filename="../../view/Page/Main/Chat/ChatPage.qml" line="316"/>
<source>group_chat_error_must_have_name</source> <source>group_chat_error_must_have_name</source>
<extracomment>&quot;Un nom doit être donné au groupe</extracomment> <extracomment>&quot;Un nom doit être donné au groupe</extracomment>
<translation>A name must be set for the group</translation> <translation>A name must be set for the group</translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Main/Chat/ChatPage.qml" line="315"/> <location filename="../../view/Page/Main/Chat/ChatPage.qml" line="320"/>
<source>group_call_error_not_connected</source> <source>group_call_error_not_connected</source>
<extracomment>&quot;Vous n&apos;etes pas connecté&quot;</extracomment> <extracomment>&quot;Vous n&apos;etes pas connecté&quot;</extracomment>
<translation>You are not connected</translation> <translation>You are not connected</translation>
@ -3939,13 +3939,13 @@ Expiration : %1</translation>
<context> <context>
<name>MeetingListView</name> <name>MeetingListView</name>
<message> <message>
<location filename="../../view/Control/Display/Meeting/MeetingListView.qml" line="276"/> <location filename="../../view/Control/Display/Meeting/MeetingListView.qml" line="277"/>
<source>meeting_info_cancelled</source> <source>meeting_info_cancelled</source>
<extracomment>&quot;Réunion annulée&quot;</extracomment> <extracomment>&quot;Réunion annulée&quot;</extracomment>
<translation>Meeting canceled</translation> <translation>Meeting canceled</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Meeting/MeetingListView.qml" line="300"/> <location filename="../../view/Control/Display/Meeting/MeetingListView.qml" line="301"/>
<source>meetings_list_no_meeting_for_today</source> <source>meetings_list_no_meeting_for_today</source>
<extracomment>&quot;Aucune réunion aujourd&apos;hui&quot;</extracomment> <extracomment>&quot;Aucune réunion aujourd&apos;hui&quot;</extracomment>
<translation>No meeting for today</translation> <translation>No meeting for today</translation>
@ -4206,6 +4206,21 @@ Expiration : %1</translation>
<translation>Click to delete</translation> <translation>Click to delete</translation>
</message> </message>
</context> </context>
<context>
<name>MessageSharedFilesInfos</name>
<message>
<location filename="../../view/Page/Layout/Chat/MessageSharedFilesInfos.qml" line="39"/>
<source>no_shared_medias</source>
<extracomment>No media</extracomment>
<translation>No media</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/MessageSharedFilesInfos.qml" line="41"/>
<source>no_shared_documents</source>
<extracomment>No document</extracomment>
<translation>No document</translation>
</message>
</context>
<context> <context>
<name>MultimediaSettings</name> <name>MultimediaSettings</name>
<message> <message>
@ -4983,31 +4998,31 @@ To enable them in a commercial project, please contact us.</translation>
<translation>Start a group call ?</translation> <translation>Start a group call ?</translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="431"/> <location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="427"/>
<source>reply_to_label</source> <source>reply_to_label</source>
<extracomment>Reply to %1</extracomment> <extracomment>Reply to %1</extracomment>
<translation>Reply to %1</translation> <translation>Reply to %1</translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="631"/> <location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="627"/>
<source>shared_medias_title</source> <source>shared_medias_title</source>
<extracomment>Shared medias</extracomment> <extracomment>Shared medias</extracomment>
<translation>Shared medias</translation> <translation>Shared medias</translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="633"/> <location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="629"/>
<source>shared_documents_title</source> <source>shared_documents_title</source>
<extracomment>Shared documents</extracomment> <extracomment>Shared documents</extracomment>
<translation>Shared documents</translation> <translation>Shared documents</translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="662"/> <location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="658"/>
<source>forward_to_title</source> <source>forward_to_title</source>
<extracomment>Forward to</extracomment> <extracomment>Forward to</extracomment>
<translation>Froward to</translation> <translation>Froward to</translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="696"/> <location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="692"/>
<source>conversations_title</source> <source>conversations_title</source>
<extracomment>Conversations</extracomment> <extracomment>Conversations</extracomment>
<translation>Conversations</translation> <translation>Conversations</translation>

View file

@ -1814,65 +1814,65 @@
<context> <context>
<name>ChatListView</name> <name>ChatListView</name>
<message> <message>
<location filename="../../view/Control/Display/Chat/ChatListView.qml" line="279"/> <location filename="../../view/Control/Display/Chat/ChatListView.qml" line="286"/>
<source>chat_message_is_writing_info</source> <source>chat_message_is_writing_info</source>
<extracomment>%1 is writing</extracomment> <extracomment>%1 is writing</extracomment>
<translation>%1 est en train d&apos;écrire</translation> <translation>%1 est en train d&apos;écrire</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Chat/ChatListView.qml" line="281"/> <location filename="../../view/Control/Display/Chat/ChatListView.qml" line="288"/>
<source>chat_message_draft_sending_text</source> <source>chat_message_draft_sending_text</source>
<translation>Brouillon : %1</translation> <translation>Brouillon : %1</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Chat/ChatListView.qml" line="423"/> <location filename="../../view/Control/Display/Chat/ChatListView.qml" line="430"/>
<source>chat_room_delete</source> <source>chat_room_delete</source>
<extracomment>&quot;Delete&quot;</extracomment> <extracomment>&quot;Delete&quot;</extracomment>
<translation>Supprimer</translation> <translation>Supprimer</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Chat/ChatListView.qml" line="363"/> <location filename="../../view/Control/Display/Chat/ChatListView.qml" line="370"/>
<source>chat_room_mute</source> <source>chat_room_mute</source>
<translation>Mettre en sourdine</translation> <translation>Mettre en sourdine</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Chat/ChatListView.qml" line="362"/> <location filename="../../view/Control/Display/Chat/ChatListView.qml" line="369"/>
<source>chat_room_unmute</source> <source>chat_room_unmute</source>
<extracomment>&quot;Mute&quot;</extracomment> <extracomment>&quot;Mute&quot;</extracomment>
<translation>Enlever la sourdine </translation> <translation>Enlever la sourdine </translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Chat/ChatListView.qml" line="375"/> <location filename="../../view/Control/Display/Chat/ChatListView.qml" line="382"/>
<source>chat_room_mark_as_read</source> <source>chat_room_mark_as_read</source>
<extracomment>&quot;Mark as read&quot;</extracomment> <extracomment>&quot;Mark as read&quot;</extracomment>
<translation>Marquer comme lu</translation> <translation>Marquer comme lu</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Chat/ChatListView.qml" line="394"/> <location filename="../../view/Control/Display/Chat/ChatListView.qml" line="401"/>
<source>chat_room_leave</source> <source>chat_room_leave</source>
<extracomment>&quot;leave&quot;</extracomment> <extracomment>&quot;leave&quot;</extracomment>
<translation>Quitter la conversation</translation> <translation>Quitter la conversation</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Chat/ChatListView.qml" line="400"/> <location filename="../../view/Control/Display/Chat/ChatListView.qml" line="407"/>
<source>chat_list_leave_chat_popup_title</source> <source>chat_list_leave_chat_popup_title</source>
<extracomment>leave the conversation ?</extracomment> <extracomment>leave the conversation ?</extracomment>
<translation>Quitter la conversation ?</translation> <translation>Quitter la conversation ?</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Chat/ChatListView.qml" line="402"/> <location filename="../../view/Control/Display/Chat/ChatListView.qml" line="409"/>
<source>chat_list_leave_chat_popup_message</source> <source>chat_list_leave_chat_popup_message</source>
<extracomment>You will not be able to send or receive messages in this conversation anymore. Do You want to continue ?</extracomment> <extracomment>You will not be able to send or receive messages in this conversation anymore. Do You want to continue ?</extracomment>
<translation>Vous ne pourrez plus envoyer ou recevoir de messages dans cette conversation. Souhaitez-vous continuer ?</translation> <translation>Vous ne pourrez plus envoyer ou recevoir de messages dans cette conversation. Souhaitez-vous continuer ?</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Chat/ChatListView.qml" line="429"/> <location filename="../../view/Control/Display/Chat/ChatListView.qml" line="436"/>
<source>chat_list_delete_chat_popup_title</source> <source>chat_list_delete_chat_popup_title</source>
<extracomment>Delete the conversation ?</extracomment> <extracomment>Delete the conversation ?</extracomment>
<translation>Supprimer la conversation ?</translation> <translation>Supprimer la conversation ?</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Chat/ChatListView.qml" line="431"/> <location filename="../../view/Control/Display/Chat/ChatListView.qml" line="438"/>
<source>chat_list_delete_chat_popup_message</source> <source>chat_list_delete_chat_popup_message</source>
<extracomment>This conversation and all its messages will be deleted. Do You want to continue ?</extracomment> <extracomment>This conversation and all its messages will be deleted. Do You want to continue ?</extracomment>
<translation>La conversation et tous ses messages seront supprimés. Souhaitez-vous continuer ?</translation> <translation>La conversation et tous ses messages seront supprimés. Souhaitez-vous continuer ?</translation>
@ -2115,38 +2115,38 @@ Error</extracomment>
<context> <context>
<name>ChatMessagesListView</name> <name>ChatMessagesListView</name>
<message> <message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="113"/> <location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="112"/>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="124"/> <location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="123"/>
<source>popup_info_find_message_title</source> <source>popup_info_find_message_title</source>
<extracomment>Find message</extracomment> <extracomment>Find message</extracomment>
<translation>Trouver un message</translation> <translation>Trouver un message</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="126"/> <location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="125"/>
<source>info_popup_no_result_message</source> <source>info_popup_no_result_message</source>
<extracomment>No result found</extracomment> <extracomment>No result found</extracomment>
<translation>Aucun résultat trouvé</translation> <translation>Aucun résultat trouvé</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="118"/> <location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="117"/>
<source>info_popup_first_result_message</source> <source>info_popup_first_result_message</source>
<extracomment>First result reached</extracomment> <extracomment>First result reached</extracomment>
<translation>Premier résultat atteint</translation> <translation>Premier résultat atteint</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="116"/> <location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="115"/>
<source>info_popup_last_result_message</source> <source>info_popup_last_result_message</source>
<extracomment>Last result reached</extracomment> <extracomment>Last result reached</extracomment>
<translation>Dernier résultat atteint</translation> <translation>Dernier résultat atteint</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="162"/> <location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="161"/>
<source>chat_message_list_encrypted_header_title</source> <source>chat_message_list_encrypted_header_title</source>
<extracomment>End to end encrypted chat</extracomment> <extracomment>End to end encrypted chat</extracomment>
<translation>Conversation chiffrée de bout en bout</translation> <translation>Conversation chiffrée de bout en bout</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="172"/> <location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="171"/>
<source>chat_message_list_encrypted_header_message</source> <source>chat_message_list_encrypted_header_message</source>
<extracomment>Les messages de cette conversation sont chiffrés de bout <extracomment>Les messages de cette conversation sont chiffrés de bout
en bout. Seul votre correspondant peut les déchiffrer.</extracomment> en bout. Seul votre correspondant peut les déchiffrer.</extracomment>
@ -2154,7 +2154,7 @@ Error</extracomment>
en bout. Seul votre correspondant peut les déchiffrer.</translation> en bout. Seul votre correspondant peut les déchiffrer.</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="212"/> <location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="211"/>
<source>chat_message_is_writing_info</source> <source>chat_message_is_writing_info</source>
<extracomment>%1 is writing</extracomment> <extracomment>%1 is writing</extracomment>
<translation>%1 est en train d&apos;écrire</translation> <translation>%1 est en train d&apos;écrire</translation>
@ -2175,79 +2175,79 @@ en bout. Seul votre correspondant peut les déchiffrer.</translation>
<translation>Aucune conversation</translation> <translation>Aucune conversation</translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Main/Chat/ChatPage.qml" line="68"/> <location filename="../../view/Page/Main/Chat/ChatPage.qml" line="69"/>
<source>chat_dialog_delete_chat_title</source> <source>chat_dialog_delete_chat_title</source>
<extracomment>Supprimer la conversation ?</extracomment> <extracomment>Supprimer la conversation ?</extracomment>
<translation>Supprimer la conversation ?</translation> <translation>Supprimer la conversation ?</translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Main/Chat/ChatPage.qml" line="70"/> <location filename="../../view/Page/Main/Chat/ChatPage.qml" line="71"/>
<source>chat_dialog_delete_chat_message</source> <source>chat_dialog_delete_chat_message</source>
<extracomment>&quot;La conversation et tous ses messages seront supprimés.&quot;</extracomment> <extracomment>&quot;La conversation et tous ses messages seront supprimés.&quot;</extracomment>
<translation>La conversation et tous ses messages seront supprimés.</translation> <translation>La conversation et tous ses messages seront supprimés.</translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Main/Chat/ChatPage.qml" line="99"/> <location filename="../../view/Page/Main/Chat/ChatPage.qml" line="100"/>
<source>chat_list_title</source> <source>chat_list_title</source>
<extracomment>&quot;Conversations&quot;</extracomment> <extracomment>&quot;Conversations&quot;</extracomment>
<translation>Conversations</translation> <translation>Conversations</translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Main/Chat/ChatPage.qml" line="120"/> <location filename="../../view/Page/Main/Chat/ChatPage.qml" line="121"/>
<source>menu_mark_all_as_read</source> <source>menu_mark_all_as_read</source>
<extracomment>&quot;mark all as read&quot;</extracomment> <extracomment>&quot;mark all as read&quot;</extracomment>
<translation>Tout marquer comme lu</translation> <translation>Tout marquer comme lu</translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Main/Chat/ChatPage.qml" line="151"/> <location filename="../../view/Page/Main/Chat/ChatPage.qml" line="152"/>
<source>chat_search_in_history</source> <source>chat_search_in_history</source>
<extracomment>&quot;Rechercher une conversation&quot;</extracomment> <extracomment>&quot;Rechercher une conversation&quot;</extracomment>
<translation>Rechercher une conversation</translation> <translation>Rechercher une conversation</translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Main/Chat/ChatPage.qml" line="174"/> <location filename="../../view/Page/Main/Chat/ChatPage.qml" line="175"/>
<source>list_filter_no_result_found</source> <source>list_filter_no_result_found</source>
<extracomment>&quot;Aucun résultat&quot;</extracomment> <extracomment>&quot;Aucun résultat&quot;</extracomment>
<translation>Aucun résultat</translation> <translation>Aucun résultat</translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Main/Chat/ChatPage.qml" line="176"/> <location filename="../../view/Page/Main/Chat/ChatPage.qml" line="177"/>
<source>chat_list_empty_history</source> <source>chat_list_empty_history</source>
<extracomment>&quot;Aucune conversation dans votre historique&quot;</extracomment> <extracomment>&quot;Aucune conversation dans votre historique&quot;</extracomment>
<translation>Aucune conversation dans votre historique</translation> <translation>Aucune conversation dans votre historique</translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Main/Chat/ChatPage.qml" line="245"/> <location filename="../../view/Page/Main/Chat/ChatPage.qml" line="250"/>
<source>chat_action_start_new_chat</source> <source>chat_action_start_new_chat</source>
<extracomment>&quot;New chat&quot;</extracomment> <extracomment>&quot;New chat&quot;</extracomment>
<translation>Nouvelle conversation</translation> <translation>Nouvelle conversation</translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Main/Chat/ChatPage.qml" line="281"/> <location filename="../../view/Page/Main/Chat/ChatPage.qml" line="286"/>
<source>chat_start_group_chat_title</source> <source>chat_start_group_chat_title</source>
<extracomment>&quot;Nouveau groupe&quot;</extracomment> <extracomment>&quot;Nouveau groupe&quot;</extracomment>
<translation>Nouveau groupe</translation> <translation>Nouveau groupe</translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Main/Chat/ChatPage.qml" line="283"/> <location filename="../../view/Page/Main/Chat/ChatPage.qml" line="288"/>
<source>chat_action_start_group_chat</source> <source>chat_action_start_group_chat</source>
<extracomment>&quot;Créer&quot;</extracomment> <extracomment>&quot;Créer&quot;</extracomment>
<translation>Créer</translation> <translation>Créer</translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Main/Chat/ChatPage.qml" line="309"/> <location filename="../../view/Page/Main/Chat/ChatPage.qml" line="314"/>
<location filename="../../view/Page/Main/Chat/ChatPage.qml" line="313"/> <location filename="../../view/Page/Main/Chat/ChatPage.qml" line="318"/>
<source>information_popup_error_title</source> <source>information_popup_error_title</source>
<translation>Erreur</translation> <translation>Erreur</translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Main/Chat/ChatPage.qml" line="311"/> <location filename="../../view/Page/Main/Chat/ChatPage.qml" line="316"/>
<source>group_chat_error_must_have_name</source> <source>group_chat_error_must_have_name</source>
<extracomment>&quot;Un nom doit être donné au groupe</extracomment> <extracomment>&quot;Un nom doit être donné au groupe</extracomment>
<translation>Un nom doit être donné au groupe</translation> <translation>Un nom doit être donné au groupe</translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Main/Chat/ChatPage.qml" line="315"/> <location filename="../../view/Page/Main/Chat/ChatPage.qml" line="320"/>
<source>group_call_error_not_connected</source> <source>group_call_error_not_connected</source>
<extracomment>&quot;Vous n&apos;etes pas connecté&quot;</extracomment> <extracomment>&quot;Vous n&apos;etes pas connecté&quot;</extracomment>
<translation>Vous n&apos;êtes pas connecté</translation> <translation>Vous n&apos;êtes pas connecté</translation>
@ -3939,13 +3939,13 @@ Expiration : %1</translation>
<context> <context>
<name>MeetingListView</name> <name>MeetingListView</name>
<message> <message>
<location filename="../../view/Control/Display/Meeting/MeetingListView.qml" line="276"/> <location filename="../../view/Control/Display/Meeting/MeetingListView.qml" line="277"/>
<source>meeting_info_cancelled</source> <source>meeting_info_cancelled</source>
<extracomment>&quot;Réunion annulée&quot;</extracomment> <extracomment>&quot;Réunion annulée&quot;</extracomment>
<translation>Réunion annulée</translation> <translation>Réunion annulée</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Meeting/MeetingListView.qml" line="300"/> <location filename="../../view/Control/Display/Meeting/MeetingListView.qml" line="301"/>
<source>meetings_list_no_meeting_for_today</source> <source>meetings_list_no_meeting_for_today</source>
<extracomment>&quot;Aucune réunion aujourd&apos;hui&quot;</extracomment> <extracomment>&quot;Aucune réunion aujourd&apos;hui&quot;</extracomment>
<translation>Aucune réunion aujourd&apos;hui</translation> <translation>Aucune réunion aujourd&apos;hui</translation>
@ -4206,6 +4206,21 @@ Expiration : %1</translation>
<translation>Appuyez pour supprimer</translation> <translation>Appuyez pour supprimer</translation>
</message> </message>
</context> </context>
<context>
<name>MessageSharedFilesInfos</name>
<message>
<location filename="../../view/Page/Layout/Chat/MessageSharedFilesInfos.qml" line="39"/>
<source>no_shared_medias</source>
<extracomment>No media</extracomment>
<translation>Aucun média</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/MessageSharedFilesInfos.qml" line="41"/>
<source>no_shared_documents</source>
<extracomment>No document</extracomment>
<translation>Aucun document</translation>
</message>
</context>
<context> <context>
<name>MultimediaSettings</name> <name>MultimediaSettings</name>
<message> <message>
@ -4983,31 +4998,31 @@ Pour les activer dans un projet commercial, merci de nous contacter.</translatio
<translation>Démarrer un appel de groupe ?</translation> <translation>Démarrer un appel de groupe ?</translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="431"/> <location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="427"/>
<source>reply_to_label</source> <source>reply_to_label</source>
<extracomment>Reply to %1</extracomment> <extracomment>Reply to %1</extracomment>
<translation>Réponse à %1</translation> <translation>Réponse à %1</translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="631"/> <location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="627"/>
<source>shared_medias_title</source> <source>shared_medias_title</source>
<extracomment>Shared medias</extracomment> <extracomment>Shared medias</extracomment>
<translation>Médias partagés</translation> <translation>Médias partagés</translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="633"/> <location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="629"/>
<source>shared_documents_title</source> <source>shared_documents_title</source>
<extracomment>Shared documents</extracomment> <extracomment>Shared documents</extracomment>
<translation>Documents partagés</translation> <translation>Documents partagés</translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="662"/> <location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="658"/>
<source>forward_to_title</source> <source>forward_to_title</source>
<extracomment>Forward to</extracomment> <extracomment>Forward to</extracomment>
<translation>Transférer à</translation> <translation>Transférer à</translation>
</message> </message>
<message> <message>
<location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="696"/> <location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="692"/>
<source>conversations_title</source> <source>conversations_title</source>
<extracomment>Conversations</extracomment> <extracomment>Conversations</extracomment>
<translation>Conversations</translation> <translation>Conversations</translation>

View file

@ -52,11 +52,28 @@ QDateTime ChatModel::getLastUpdateTime() {
return QDateTime::fromSecsSinceEpoch(mMonitor->getLastUpdateTime()); return QDateTime::fromSecsSinceEpoch(mMonitor->getLastUpdateTime());
} }
std::list<std::shared_ptr<linphone::ChatMessage>> ChatModel::getHistory() const { std::list<std::shared_ptr<linphone::Content>> ChatModel::getSharedMedias() const {
return mMonitor->getMediaContents();
}
std::list<std::shared_ptr<linphone::Content>> ChatModel::getSharedDocuments() const {
return mMonitor->getDocumentContents();
}
std::list<std::shared_ptr<linphone::EventLog>> ChatModel::getHistory() const {
int filter = mMonitor->hasCapability((int)linphone::ChatRoom::Capabilities::Conference)
? static_cast<int>(linphone::ChatRoom::HistoryFilter::ChatMessage) |
static_cast<int>(linphone::ChatRoom::HistoryFilter::InfoNoDevice)
: static_cast<int>(linphone::ChatRoom::HistoryFilter::ChatMessage);
return mMonitor->getHistory(0, filter);
}
std::list<std::shared_ptr<linphone::ChatMessage>> ChatModel::getChatMessageHistory() const {
auto history = mMonitor->getHistory(0, (int)linphone::ChatRoom::HistoryFilter::ChatMessage); auto history = mMonitor->getHistory(0, (int)linphone::ChatRoom::HistoryFilter::ChatMessage);
std::list<std::shared_ptr<linphone::ChatMessage>> res; std::list<std::shared_ptr<linphone::ChatMessage>> res;
for (auto &eventLog : history) { for (auto &eventLog : history) {
if (!eventLog->getChatMessage()) res.push_back(eventLog->getChatMessage()); auto chatMessage = eventLog->getChatMessage();
if (chatMessage) res.push_back(chatMessage);
} }
return res; return res;
} }
@ -106,7 +123,7 @@ int ChatModel::getUnreadMessagesCount() const {
void ChatModel::markAsRead() { void ChatModel::markAsRead() {
mMonitor->markAsRead(); mMonitor->markAsRead();
for (auto &message : getHistory()) { for (auto &message : getChatMessageHistory()) {
message->markAsRead(); message->markAsRead();
} }
emit messagesRead(); emit messagesRead();

View file

@ -46,7 +46,10 @@ public:
bool hasCapability(int capability) const; bool hasCapability(int capability) const;
int getUnreadMessagesCount() const; int getUnreadMessagesCount() const;
void markAsRead(); void markAsRead();
std::list<std::shared_ptr<linphone::ChatMessage>> getHistory() const; std::list<std::shared_ptr<linphone::Content>> getSharedMedias() const;
std::list<std::shared_ptr<linphone::Content>> getSharedDocuments() const;
std::list<std::shared_ptr<linphone::EventLog>> getHistory() const;
std::list<std::shared_ptr<linphone::ChatMessage>> getChatMessageHistory() const;
QString getIdentifier() const; QString getIdentifier() const;
void deleteHistory(); void deleteHistory();
void deleteMessage(std::shared_ptr<linphone::ChatMessage> message); void deleteMessage(std::shared_ptr<linphone::ChatMessage> message);

View file

@ -81,10 +81,7 @@ ColumnLayout {
anchors.left: selectedItemFlag.right anchors.left: selectedItemFlag.right
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
elide: Text.ElideRight elide: Text.ElideRight
font { font: Typography.p1
pixelSize: Typography.p1.pixelSize
weight: Typography.p1.weight
}
} }
} }

View file

@ -13,6 +13,8 @@ Item {
height: busyIndicator.height height: busyIndicator.height
Control.BusyIndicator { Control.BusyIndicator {
id: busyIndicator id: busyIndicator
width: Math.round(60 * DefaultStyle.dp)
height: width
running: mainItem.visible running: mainItem.visible
anchors.centerIn: mainItem anchors.centerIn: mainItem
contentItem: EffectImage { contentItem: EffectImage {

View file

@ -18,17 +18,20 @@ ListView {
property real busyIndicatorSize: Math.round(60 * DefaultStyle.dp) property real busyIndicatorSize: Math.round(60 * DefaultStyle.dp)
property ChatGui currentChatGui: model.getAt(currentIndex) || null property ChatGui currentChatGui: model.getAt(currentIndex) || null
property ChatGui chatToSelect: null
onChatToSelectChanged: {
var index = chatProxy.findChatIndex(chatToSelect)
if (index != -1) {
currentIndex = index
chatToSelect = null
}
}
onChatClicked: (chat) => {selectChat(chat)} onChatClicked: (chat) => {selectChat(chat)}
signal resultsReceived()
signal markAllAsRead() signal markAllAsRead()
signal chatClicked(ChatGui chat) signal chatClicked(ChatGui chat)
onResultsReceived: {
loading = false
// contentY = 0
}
model: ChatProxy { model: ChatProxy {
id: chatProxy id: chatProxy
Component.onCompleted: { Component.onCompleted: {
@ -41,7 +44,10 @@ ListView {
2 * mainItem.height / (Math.round(56 * DefaultStyle.dp))) 2 * mainItem.height / (Math.round(56 * DefaultStyle.dp)))
displayItemsStep: 3 * initialDisplayItems / 2 displayItemsStep: 3 * initialDisplayItems / 2
onModelReset: { onModelReset: {
mainItem.resultsReceived() loading = false
if (mainItem.chatToSelect) {
selectChat(mainItem.chatToSelect)
}
} }
onModelAboutToBeReset: { onModelAboutToBeReset: {
loading = true loading = true
@ -160,6 +166,7 @@ ListView {
} }
delegate: FocusScope { delegate: FocusScope {
visible: !mainItem.loading
width: mainItem.width width: mainItem.width
height: Math.round(63 * DefaultStyle.dp) height: Math.round(63 * DefaultStyle.dp)
Connections { Connections {

View file

@ -93,8 +93,7 @@ ListView {
markIndexAsRead(index) markIndexAsRead(index)
} }
} }
Component.onCompleted: loading = true onModelAboutToBeReset: loading = true
onListAboutToBeReset: loading = true
onModelReset: Qt.callLater(function() { onModelReset: Qt.callLater(function() {
loading = false loading = false
var index = eventLogProxy.findFirstUnreadIndex() var index = eventLogProxy.findFirstUnreadIndex()
@ -130,7 +129,7 @@ ListView {
} }
footer: Item { footer: Item {
visible: mainItem.chat && mainItem.chat.core.isEncrypted && !eventLogProxy.haveMore visible: mainItem.chat && !mainItem.loading && mainItem.chat.core.isEncrypted && !eventLogProxy.haveMore
height: visible ? headerMessage.height + headerMessage.topMargin + headerMessage.bottomMargin : Math.round(30 * DefaultStyle.dp) height: visible ? headerMessage.height + headerMessage.topMargin + headerMessage.bottomMargin : Math.round(30 * DefaultStyle.dp)
width: headerMessage.width width: headerMessage.width
anchors.horizontalCenter: parent.horizontalCenter anchors.horizontalCenter: parent.horizontalCenter
@ -216,6 +215,7 @@ ListView {
BusyIndicator { BusyIndicator {
anchors.horizontalCenter: mainItem.horizontalCenter anchors.horizontalCenter: mainItem.horizontalCenter
anchors.verticalCenter: mainItem.verticalCenter
visible: mainItem.loading visible: mainItem.loading
height: visible ? mainItem.busyIndicatorSize : 0 height: visible ? mainItem.busyIndicatorSize : 0
width: mainItem.busyIndicatorSize width: mainItem.busyIndicatorSize
@ -226,11 +226,11 @@ ListView {
delegate: DelegateChooser { delegate: DelegateChooser {
role: "eventType" role: "eventType"
DelegateChoice { DelegateChoice {
roleValue: "chatMessage" roleValue: "chatMessage"
delegate: ChatMessage { delegate: ChatMessage {
id: chatMessageDelegate id: chatMessageDelegate
visible: !mainItem.loading
property int yoff: Math.round(chatMessageDelegate.y - mainItem.contentY) property int yoff: Math.round(chatMessageDelegate.y - mainItem.contentY)
property bool isFullyVisible: (yoff > mainItem.y && yoff + height < mainItem.y + mainItem.height) property bool isFullyVisible: (yoff > mainItem.y && yoff + height < mainItem.y + mainItem.height)
chatMessage: modelData.core.chatMessageGui chatMessage: modelData.core.chatMessageGui
@ -288,6 +288,7 @@ ListView {
roleValue: "event" roleValue: "event"
delegate: Item { delegate: Item {
id: eventDelegate id: eventDelegate
visible: !mainItem.loading
property int yoff: Math.round(eventDelegate.y - mainItem.contentY) property int yoff: Math.round(eventDelegate.y - mainItem.contentY)
property bool isFullyVisible: (yoff > mainItem.y && yoff + height < mainItem.y + mainItem.height) property bool isFullyVisible: (yoff > mainItem.y && yoff + height < mainItem.y + mainItem.height)
onIsFullyVisibleChanged: { onIsFullyVisibleChanged: {
@ -312,6 +313,7 @@ ListView {
roleValue: "ephemeralEvent" roleValue: "ephemeralEvent"
delegate: Item { delegate: Item {
id: ephemeralEventDelegate id: ephemeralEventDelegate
visible: !mainItem.loading
property int yoff: Math.round(ephemeralEventDelegate.y - mainItem.contentY) property int yoff: Math.round(ephemeralEventDelegate.y - mainItem.contentY)
property bool isFullyVisible: (yoff > mainItem.y && yoff + height < mainItem.y + mainItem.height) property bool isFullyVisible: (yoff > mainItem.y && yoff + height < mainItem.y + mainItem.height)
onIsFullyVisibleChanged: { onIsFullyVisibleChanged: {

View file

@ -72,7 +72,17 @@ Item {
fillMode: Image.PreserveAspectFit fillMode: Image.PreserveAspectFit
} }
Image { Image {
visible: thumbnailSource.isImage anchors.fill: image
z: image.z + 1
visible: image.status == Image.Error || image.status == Image.Null
source: AppIcons.fileImage
sourceSize.width: mainItem.width
sourceSize.height: mainItem.height
fillMode: Image.PreserveAspectFit
}
Image {
id: image
visible: thumbnailSource.isImage && status !== Image.Loading
mipmap: false//SettingsModel.mipmapEnabled mipmap: false//SettingsModel.mipmapEnabled
source: mainItem.thumbnail source: mainItem.thumbnail
sourceSize.width: mainItem.width sourceSize.width: mainItem.width
@ -80,15 +90,6 @@ Item {
autoTransform: true autoTransform: true
fillMode: Image.PreserveAspectCrop fillMode: Image.PreserveAspectCrop
anchors.fill: parent anchors.fill: parent
Image {
anchors.fill: parent
z: parent.z + 1
visible: parent.status !== Image.Ready
source: AppIcons.fileImage
sourceSize.width: mainItem.width
sourceSize.height: mainItem.height
fillMode: Image.PreserveAspectFit
}
} }
Rectangle { Rectangle {
visible: thumbnailSource.isVideo visible: thumbnailSource.isVideo

View file

@ -160,6 +160,7 @@ ListView {
delegate: FocusScope { delegate: FocusScope {
id: itemDelegate id: itemDelegate
visible: !mainItem.loading
height: Math.round(63 * DefaultStyle.dp) + (!isFirst && dateDay.visible ? topOffset : 0) height: Math.round(63 * DefaultStyle.dp) + (!isFirst && dateDay.visible ? topOffset : 0)
width: mainItem.width width: mainItem.width
enabled: !isCanceled && haveModel enabled: !isCanceled && haveModel

View file

@ -63,10 +63,6 @@ FocusScope {
anchors.fill: parent anchors.fill: parent
spacing: 0 spacing: 0
//onEventChanged: {
// TODO : call when all messages read after scroll to unread feature available
// if (chat) chat.core.lMarkAsRead()
//}
MainRightPanel { MainRightPanel {
id: splitPanel id: splitPanel
Layout.fillWidth: true Layout.fillWidth: true

View file

@ -34,10 +34,7 @@ ColumnLayout {
} }
Text { Text {
text: mainItem.title text: mainItem.title
font { font: Typography.h4
pixelSize: Typography.h4.pixelSize
weight: Typography.h4.weight
}
} }
} }
@ -48,7 +45,6 @@ ColumnLayout {
spacing: Math.round(21 * DefaultStyle.dp) spacing: Math.round(21 * DefaultStyle.dp)
TabBar { TabBar {
id: tabbar id: tabbar
onCurrentIndexChanged: console.log("current index", currentIndex)
visible: mainItem.tabbarModel !== undefined visible: mainItem.tabbarModel !== undefined
Layout.fillWidth: true Layout.fillWidth: true
Layout.preferredWidth: implicitWidth Layout.preferredWidth: implicitWidth

View file

@ -19,9 +19,26 @@ MessageInfosLayout {
Layout.preferredHeight: contentHeight Layout.preferredHeight: contentHeight
cellWidth: mainItem.filter === ChatMessageFileProxy.FilterContentType.Documents ? width : width / 4 cellWidth: mainItem.filter === ChatMessageFileProxy.FilterContentType.Documents ? width : width / 4
cellHeight: mainItem.filter === ChatMessageFileProxy.FilterContentType.Documents ? Math.round(69 * DefaultStyle.dp) : width / 4 cellHeight: mainItem.filter === ChatMessageFileProxy.FilterContentType.Documents ? Math.round(69 * DefaultStyle.dp) : width / 4
property bool loading: true
model: ChatMessageFileProxy { model: ChatMessageFileProxy {
chat: mainItem.chatGui chat: mainItem.chatGui
filterType: mainItem.filter filterType: mainItem.filter
onModelAboutToBeReset: gridView.loading = true
onModelReset: gridView.loading = false
}
BusyIndicator {
anchors.centerIn: parent
visible: gridView.loading
}
Text {
anchors.centerIn: parent
visible: !gridView.loading && gridView.count === 0
font: Typography.p2l
text: mainItem.filter === ChatMessageFileProxy.FilterContentType.Medias
//: No media
? qsTr("no_shared_medias")
//: No document
: qsTr("no_shared_documents")
} }
delegate: FileView { delegate: FileView {
contentGui: modelData contentGui: modelData

View file

@ -641,7 +641,7 @@ Item {
} }
function onOpenChatRequested(chat) { function onOpenChatRequested(chat) {
console.log("open chat requested, open", chat.core.title) console.log("open chat requested, open", chat.core.title)
chatPage.selectedChatGui = chat chatPage.openChatRequested(chat)
} }
} }
} }

View file

@ -60,6 +60,7 @@ AbstractMainPage {
&& listStackView.currentItem.objectName != "newChatItem") && listStackView.currentItem.objectName != "newChatItem")
listStackView.push(newChatItem) listStackView.push(newChatItem)
} }
signal openChatRequested(ChatGui chat)
Dialog { Dialog {
id: deleteChatPopup id: deleteChatPopup
@ -193,9 +194,13 @@ AbstractMainPage {
Connections { Connections {
target: mainItem target: mainItem
onSelectedChatGuiChanged: { function onSelectedChatGuiChanged() {
console.log("selected chat gui changed")
chatListView.selectChat(mainItem.selectedChatGui) chatListView.selectChat(mainItem.selectedChatGui)
} }
function onOpenChatRequested(chat) {
chatListView.chatToSelect = chat
}
} }
} }
} }