fix search in history + move search button in the top bar of the chat message view

This commit is contained in:
Gaelle Braud 2025-08-04 14:55:05 +02:00
parent 3f3f29b2ec
commit 55ce938d0b
21 changed files with 459 additions and 268 deletions

View file

@ -23,6 +23,7 @@
#include "core/chat/message/content/ChatMessageContentGui.hpp"
#include "core/friend/FriendCore.hpp"
#include "core/setting/SettingsCore.hpp"
#include "model/chat/message/EventLogModel.hpp"
#include "model/core/CoreModel.hpp"
#include "model/friend/FriendModel.hpp"
#include "model/tool/ToolModel.hpp"
@ -604,6 +605,10 @@ std::shared_ptr<ChatModel> ChatCore::getModel() const {
return mChatModel;
}
QSharedPointer<SafeConnection<ChatCore, ChatModel>> ChatCore::getChatModelConnection() const {
return mChatModelConnection;
}
bool ChatCore::isMuted() const {
return mIsMuted;
}

View file

@ -135,6 +135,7 @@ public:
void setComposingAddress(QString composingAddress);
std::shared_ptr<ChatModel> getModel() const;
QSharedPointer<SafeConnection<ChatCore, ChatModel>> getChatModelConnection() const;
QList<QSharedPointer<ParticipantCore>> buildParticipants(const std::shared_ptr<linphone::ChatRoom> &chatRoom) const;
QList<QSharedPointer<ParticipantCore>> getParticipants() const;

View file

@ -21,6 +21,7 @@
#include "EventLogCore.hpp"
#include "core/App.hpp"
#include "core/chat/ChatCore.hpp"
#include "model/chat/message/EventLogModel.hpp"
#include "model/tool/ToolModel.hpp"
DEFINE_ABSTRACT_OBJECT(EventLogCore)
@ -36,6 +37,7 @@ EventLogCore::EventLogCore(const std::shared_ptr<const linphone::EventLog> &even
mustBeInLinphoneThread(getClassName());
App::getInstance()->mEngine->setObjectOwnership(this, QQmlEngine::CppOwnership);
mEventLogType = LinphoneEnums::fromLinphone(eventLog->getType());
mEventLogModel = Utils::makeQObject_ptr<EventLogModel>(eventLog);
mTimestamp = QDateTime::fromMSecsSinceEpoch(eventLog->getCreationTime() * 1000);
auto chatmessage = eventLog->getChatMessage();
if (chatmessage) {
@ -86,6 +88,10 @@ QDateTime EventLogCore::getTimestamp() const {
return mTimestamp;
}
std::shared_ptr<EventLogModel> EventLogCore::getModel() const {
return mEventLogModel;
}
// Events (other than ChatMessage and CallLog which are handled in their respective Core)
void EventLogCore::computeEvent(const std::shared_ptr<const linphone::EventLog> &eventLog) {

View file

@ -36,6 +36,7 @@
class ChatMessageCore;
class ChatMessageGui;
class EventLogModel;
class EventLogCore : public QObject, public AbstractObject {
Q_OBJECT
@ -68,6 +69,8 @@ public:
return mEphemeralRelated;
}
std::shared_ptr<EventLogModel> getModel() const;
private:
DECLARE_ABSTRACT_OBJECT
QString mEventId;
@ -83,6 +86,7 @@ private:
ChatMessageCore *getChatMessageCorePointer();
CallHistoryCore *getCallHistoryCorePointer();
std::shared_ptr<EventLogModel> mEventLogModel;
void computeEvent(const std::shared_ptr<const linphone::EventLog> &eventLog);
};

View file

@ -26,6 +26,7 @@
#include "core/call-history/CallHistoryGui.hpp"
#include "core/chat/ChatCore.hpp"
#include "core/chat/ChatGui.hpp"
#include "model/chat/message/EventLogModel.hpp"
#include <QSharedPointer>
#include <linphone++/linphone.hh>
@ -75,8 +76,11 @@ void EventLogList::connectItem(const QSharedPointer<EventLogCore> item) {
void EventLogList::setChatCore(QSharedPointer<ChatCore> core) {
if (mChatCore != core) {
if (mChatCore) disconnect(mChatCore.get(), &ChatCore::eventListChanged, this, nullptr);
if (mChatCore) disconnect(mChatCore.get(), &ChatCore::eventsInserted, this, nullptr);
if (mChatCore) {
disconnect(mChatCore.get(), &ChatCore::eventListChanged, this, nullptr);
disconnect(mChatCore.get(), &ChatCore::eventsInserted, this, nullptr);
mModelConnection->disconnect();
}
mChatCore = core;
if (mChatCore) {
connect(mChatCore.get(), &ChatCore::eventListChanged, this, &EventLogList::lUpdate);
@ -93,6 +97,7 @@ void EventLogList::setChatCore(QSharedPointer<ChatCore> core) {
}
}
});
mModelConnection = SafeConnection<ChatCore, ChatModel>::create(mChatCore, mChatCore->getModel());
}
emit eventChanged();
lUpdate();
@ -112,6 +117,39 @@ int EventLogList::findFirstUnreadIndex() {
return it == eventList.end() ? -1 : std::distance(eventList.begin(), it);
}
void EventLogList::findChatMessageWithFilter(QString filter,
QSharedPointer<EventLogCore> startEvent,
bool forward,
bool isFirstResearch) {
if (mChatCore) {
auto modelConnection = mChatCore->getChatModelConnection();
auto chatModel = mChatCore->getModel();
auto startEventModel = startEvent ? startEvent->getModel() : nullptr;
modelConnection->invokeToModel(
[this, chatModel, startEventModel, filter, forward, modelConnection, isFirstResearch] {
auto linStartEvent = startEventModel ? startEventModel->getEventLog() : nullptr;
auto eventLog = chatModel->searchMessageByText(filter, linStartEvent, forward);
// If it is the first research and event was not found from the start event, search in the
// entire history
if (!eventLog && isFirstResearch) {
auto firstEvent = getAt<EventLogCore>(0);
auto linFirst = firstEvent ? firstEvent->getModel()->getEventLog() : nullptr;
eventLog = chatModel->searchMessageByText(filter, nullptr, forward);
}
int index = -1;
if (eventLog) {
auto eventList = getSharedList<EventLogCore>();
auto it = std::find_if(eventList.begin(), eventList.end(),
[eventLog](const QSharedPointer<EventLogCore> item) {
return item->getModel()->getEventLog() == eventLog;
});
index = it == eventList.end() ? -1 : std::distance(eventList.begin(), it);
}
modelConnection->invokeToCore([this, index] { emit messageWithFilterFound(index); });
});
}
}
void EventLogList::setSelf(QSharedPointer<EventLogList> me) {
connect(this, &EventLogList::lUpdate, this, [this]() {
for (auto &event : getSharedList<EventLogCore>()) {

View file

@ -30,6 +30,7 @@ class EventLogGui;
class EventLogCore;
class ChatCore;
class ChatGui;
class ChatModel;
// =============================================================================
class EventLogList : public ListProxy, public AbstractObject {
@ -48,6 +49,11 @@ public:
int findFirstUnreadIndex();
void findChatMessageWithFilter(QString filter,
QSharedPointer<EventLogCore> startEvent,
bool forward = true,
bool isFirstResearch = true);
void setSelf(QSharedPointer<EventLogList> me);
virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
QHash<int, QByteArray> roleNames() const override;
@ -57,10 +63,12 @@ signals:
void filterChanged(QString filter);
void eventChanged();
void eventInserted(int index, EventLogGui *message);
void messageWithFilterFound(int index);
private:
QString mFilter;
QSharedPointer<ChatCore> mChatCore;
QSharedPointer<SafeConnection<ChatCore, ChatModel>> mModelConnection;
DECLARE_ABSTRACT_OBJECT
};

View file

@ -51,8 +51,20 @@ void EventLogProxy::setSourceModel(QAbstractItemModel *model) {
.row();
if (mMaxDisplayItems <= index) setMaxDisplayItems(index + mDisplayItemsStep);
}
loadUntil(index);
emit eventInserted(index, event);
});
connect(newEventLogList, &EventLogList::messageWithFilterFound, this, [this, newEventLogList](int index) {
if (index != -1) {
auto model = getListModel<EventLogList>();
mLastSearchStart = model->getAt<EventLogCore>(index);
index = dynamic_cast<SortFilterList *>(sourceModel())
->mapFromSource(newEventLogList->index(index, 0))
.row();
loadUntil(index);
}
emit indexWithFilterFound(index);
});
}
setSourceModels(new SortFilterList(model, Qt::DescendingOrder));
sort(0);
@ -69,14 +81,17 @@ void EventLogProxy::setChatGui(ChatGui *chat) {
}
EventLogGui *EventLogProxy::getEventAtIndex(int i) {
auto model = getListModel<EventLogList>();
auto sourceIndex = mapToSource(index(i, 0)).row();
if (model) {
auto event = model->getAt<EventLogCore>(sourceIndex);
if (event) return new EventLogGui(event);
else return nullptr;
}
return nullptr;
auto eventCore = getEventCoreAtIndex(i);
return eventCore == nullptr ? nullptr : new EventLogGui(eventCore);
}
QSharedPointer<EventLogCore> EventLogProxy::getEventCoreAtIndex(int i) {
return getItemAt<SortFilterList, EventLogList, EventLogCore>(i);
}
void EventLogProxy::loadUntil(int index) {
auto confInfoList = getListModel<EventLogList>();
if (mMaxDisplayItems < index) setMaxDisplayItems(index + mDisplayItemsStep);
}
int EventLogProxy::findFirstUnreadIndex() {
@ -100,21 +115,17 @@ void EventLogProxy::markIndexAsRead(int proxyIndex) {
if (event && event->getChatMessageCore()) event->getChatMessageCore()->lMarkAsRead();
}
int EventLogProxy::findIndexCorrespondingToFilter(int startIndex, bool goingBackward) {
void EventLogProxy::findIndexCorrespondingToFilter(int startIndex, bool forward, bool isFirstResearch) {
auto filter = getFilterText();
if (filter.isEmpty()) return startIndex;
int endIndex = goingBackward ? 0 : getCount() - 1;
startIndex = goingBackward ? startIndex - 1 : startIndex + 1;
for (int i = startIndex; (goingBackward ? i >= 0 : i < getCount() - 1); (goingBackward ? --i : ++i)) {
auto eventLog = getItemAt<SortFilterList, EventLogList, EventLogCore>(i);
if (!eventLog) continue;
if (auto message = eventLog->getChatMessageCore()) {
auto text = message->getText();
int regexIndex = text.indexOf(filter, 0, Qt::CaseInsensitive);
if (regexIndex != -1) return i;
if (filter.isEmpty()) return;
auto eventLogList = getListModel<EventLogList>();
if (eventLogList) {
auto startEvent = mLastSearchStart;
if (!startEvent) {
startEvent = getItemAt<SortFilterList, EventLogList, EventLogCore>(startIndex);
}
eventLogList->findChatMessageWithFilter(filter, startEvent, forward, isFirstResearch);
}
return -1;
}
bool EventLogProxy::SortFilterList::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const {

View file

@ -44,17 +44,21 @@ public:
void setSourceModel(QAbstractItemModel *sourceModel) override;
Q_INVOKABLE EventLogGui *getEventAtIndex(int index);
Q_INVOKABLE void loadUntil(int index);
Q_INVOKABLE EventLogGui *getEventAtIndex(int i);
QSharedPointer<EventLogCore> getEventCoreAtIndex(int i);
Q_INVOKABLE int findFirstUnreadIndex();
Q_INVOKABLE void markIndexAsRead(int proxyIndex);
Q_INVOKABLE int findIndexCorrespondingToFilter(int startIndex, bool goingBackward = false);
Q_INVOKABLE void findIndexCorrespondingToFilter(int startIndex, bool forward = true, bool isFirstResearch = true);
signals:
void eventChanged();
void eventInserted(int index, EventLogGui *message);
void indexWithFilterFound(int index);
protected:
QSharedPointer<EventLogList> mList;
QSharedPointer<EventLogCore> mLastSearchStart;
ChatGui *mChatGui = nullptr;
DECLARE_ABSTRACT_OBJECT
};

View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#000000" viewBox="0 0 256 256"><path d="M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z"></path></svg>

After

Width:  |  Height:  |  Size: 371 B

View file

@ -1748,13 +1748,13 @@
<context>
<name>ChatCore</name>
<message>
<location filename="../../core/chat/ChatCore.cpp" line="165"/>
<location filename="../../core/chat/ChatCore.cpp" line="175"/>
<source>info_toast_deleted_title</source>
<extracomment>Deleted</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../core/chat/ChatCore.cpp" line="167"/>
<location filename="../../core/chat/ChatCore.cpp" line="177"/>
<source>info_toast_deleted_message_history</source>
<extracomment>Message history has been deleted</extracomment>
<translation type="unfinished"></translation>
@ -2072,45 +2072,45 @@ Error</extracomment>
<context>
<name>ChatMessagesListView</name>
<message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="36"/>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="50"/>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="101"/>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="112"/>
<source>popup_info_find_message_title</source>
<extracomment>Find message</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="38"/>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="114"/>
<source>info_popup_no_result_message</source>
<extracomment>No result found</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="52"/>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="106"/>
<source>info_popup_first_result_message</source>
<extracomment>First result reached</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="54"/>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="104"/>
<source>info_popup_last_result_message</source>
<extracomment>Last result reached</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="143"/>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="150"/>
<source>chat_message_list_encrypted_header_title</source>
<extracomment>End to end encrypted chat</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="153"/>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="160"/>
<source>chat_message_list_encrypted_header_message</source>
<extracomment>Les messages de cette conversation sont chiffrés de bout
en bout. Seul votre correspondant peut les déchiffrer.</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="191"/>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="200"/>
<source>chat_message_is_writing_info</source>
<extracomment>%1 is writing</extracomment>
<translation type="unfinished"></translation>
@ -2825,142 +2825,143 @@ Error</extracomment>
<context>
<name>ConversationInfos</name>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="185"/>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="184"/>
<source>one_one_infos_call</source>
<extracomment>&quot;Appel&quot;</extracomment>
<translation type="unfinished">Anrufen</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="199"/>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="198"/>
<source>one_one_infos_unmute</source>
<extracomment>&quot;Sourdine&quot;</extracomment>
<translation type="unfinished">Unmute</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="199"/>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="198"/>
<source>one_one_infos_mute</source>
<translation type="unfinished">Stummschalten</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="215"/>
<source>one_one_infos_search</source>
<extracomment>&quot;Rechercher&quot;</extracomment>
<translation type="unfinished">Suchen</translation>
<translation type="obsolete">Suchen</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="241"/>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="258"/>
<source>group_infos_participants</source>
<translation type="unfinished">Participants (%1)</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="258"/>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="275"/>
<source>group_infos_media_docs</source>
<extracomment>Medias &amp; documents</extracomment>
<translation type="unfinished">Medien &amp; Dokumente</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="264"/>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="281"/>
<source>group_infos_shared_medias</source>
<extracomment>Shared medias</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="275"/>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="292"/>
<source>group_infos_shared_docs</source>
<extracomment>Shared documents</extracomment>
<translation type="unfinished">Geteilte Dokumente</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="288"/>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="305"/>
<source>group_infos_other_actions</source>
<extracomment>Other actions</extracomment>
<translation type="unfinished">Weitere Aktionen</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="294"/>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="311"/>
<source>group_infos_ephemerals</source>
<translation type="unfinished">Ephemeral messages : </translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="294"/>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="311"/>
<source>group_infos_enable_ephemerals</source>
<translation type="unfinished">Flüchtige Nachrichten aktivieren</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="307"/>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="220"/>
<source>group_infos_meeting</source>
<extracomment>Schedule a meeting</extracomment>
<translation type="unfinished">Meeting</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="316"/>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="322"/>
<source>group_infos_leave_room</source>
<extracomment>Leave chat room</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="321"/>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="327"/>
<source>group_infos_leave_room_toast_title</source>
<extracomment>Leave Chat Room ?</extracomment>
<translation type="unfinished">Chatraum verlassen?</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="323"/>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="329"/>
<source>group_infos_leave_room_toast_message</source>
<extracomment>All the messages will be removed from the chat room. Do you want to continue ?</extracomment>
<translation type="unfinished">Alle Nachrichten werden aus dem Chat entfernt. Möchten Sie fortfahren?</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="336"/>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="342"/>
<source>group_infos_delete_history</source>
<extracomment>Delete history</extracomment>
<translation type="unfinished">Verlauf löschen</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="341"/>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="347"/>
<source>group_infos_delete_history_toast_title</source>
<extracomment>Delete history ?</extracomment>
<translation type="unfinished">Verlauf löschen?</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="343"/>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="349"/>
<source>group_infos_delete_history_toast_message</source>
<extracomment>All the messages will be removed from the chat room. Do you want to continue ?</extracomment>
<translation type="unfinished">Alle Nachrichten werden aus dem Chat entfernt. Möchten Sie fortfahren?</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="357"/>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="223"/>
<source>one_one_infos_open_contact</source>
<extracomment>Show contact</extracomment>
<translation type="unfinished">Kontakt öffnen</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="357"/>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="225"/>
<source>one_one_infos_create_contact</source>
<extracomment>Create contact</extracomment>
<translation type="unfinished">Kontakt erstellen</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="371"/>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="363"/>
<source>one_one_infos_ephemerals</source>
<translation type="unfinished">Ephemeral messages : </translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="371"/>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="363"/>
<source>one_one_infos_enable_ephemerals</source>
<translation type="unfinished">Flüchtige Nachrichten aktivieren</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="381"/>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="373"/>
<source>one_one_infos_delete_history</source>
<translation type="unfinished">Verlauf löschen</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="386"/>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="378"/>
<source>one_one_infos_delete_history_toast_title</source>
<extracomment>Delete history ?</extracomment>
<translation type="unfinished">Verlauf löschen?</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="388"/>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="380"/>
<source>one_one_infos_delete_history_toast_message</source>
<extracomment>All the messages will be removed from the chat room. Do you want to continue ?</extracomment>
<translation type="unfinished">Alle Nachrichten werden aus dem Chat entfernt. Möchten Sie fortfahren?</translation>
@ -3198,58 +3199,58 @@ Error</extracomment>
<context>
<name>EventLogCore</name>
<message>
<location filename="../../core/chat/message/EventLogCore.cpp" line="101"/>
<location filename="../../core/chat/message/EventLogCore.cpp" line="107"/>
<source>conference_created_event</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../core/chat/message/EventLogCore.cpp" line="104"/>
<location filename="../../core/chat/message/EventLogCore.cpp" line="110"/>
<source>conference_created_terminated</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../core/chat/message/EventLogCore.cpp" line="108"/>
<location filename="../../core/chat/message/EventLogCore.cpp" line="114"/>
<source>conference_participant_added_event</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../core/chat/message/EventLogCore.cpp" line="112"/>
<location filename="../../core/chat/message/EventLogCore.cpp" line="118"/>
<source>conference_participant_removed_event</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../core/chat/message/EventLogCore.cpp" line="121"/>
<location filename="../../core/chat/message/EventLogCore.cpp" line="123"/>
<location filename="../../core/chat/message/EventLogCore.cpp" line="127"/>
<location filename="../../core/chat/message/EventLogCore.cpp" line="129"/>
<source>conference_security_event</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../core/chat/message/EventLogCore.cpp" line="130"/>
<location filename="../../core/chat/message/EventLogCore.cpp" line="136"/>
<source>conference_ephemeral_message_enabled_event</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../core/chat/message/EventLogCore.cpp" line="136"/>
<location filename="../../core/chat/message/EventLogCore.cpp" line="142"/>
<source>conference_ephemeral_message_lifetime_changed_event</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../core/chat/message/EventLogCore.cpp" line="141"/>
<location filename="../../core/chat/message/EventLogCore.cpp" line="147"/>
<source>conference_ephemeral_message_disabled_event</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../core/chat/message/EventLogCore.cpp" line="145"/>
<location filename="../../core/chat/message/EventLogCore.cpp" line="151"/>
<source>conference_subject_changed_event</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../core/chat/message/EventLogCore.cpp" line="153"/>
<location filename="../../core/chat/message/EventLogCore.cpp" line="159"/>
<source>conference_participant_unset_admin_event</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../core/chat/message/EventLogCore.cpp" line="149"/>
<location filename="../../core/chat/message/EventLogCore.cpp" line="155"/>
<source>conference_participant_set_admin_event</source>
<translation type="unfinished"></translation>
</message>
@ -4982,36 +4983,36 @@ Pour les activer dans un projet commercial, merci de nous contacter.</source>
<context>
<name>SelectedChatView</name>
<message>
<location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="38"/>
<location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="37"/>
<source>chat_view_group_call_toast_message</source>
<translation>Start a group call ?</translation>
</message>
<message>
<location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="376"/>
<location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="400"/>
<source>reply_to_label</source>
<extracomment>Reply to %1</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="570"/>
<location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="590"/>
<source>shared_medias_title</source>
<extracomment>Shared medias</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="572"/>
<location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="592"/>
<source>shared_documents_title</source>
<extracomment>Shared documents</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="601"/>
<location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="621"/>
<source>forward_to_title</source>
<extracomment>Forward to</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="635"/>
<location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="655"/>
<source>conversations_title</source>
<extracomment>Conversations</extracomment>
<translation type="unfinished"></translation>

View file

@ -1710,13 +1710,13 @@
<context>
<name>ChatCore</name>
<message>
<location filename="../../core/chat/ChatCore.cpp" line="165"/>
<location filename="../../core/chat/ChatCore.cpp" line="175"/>
<source>info_toast_deleted_title</source>
<extracomment>Deleted</extracomment>
<translation>Deleted</translation>
</message>
<message>
<location filename="../../core/chat/ChatCore.cpp" line="167"/>
<location filename="../../core/chat/ChatCore.cpp" line="177"/>
<source>info_toast_deleted_message_history</source>
<extracomment>Message history has been deleted</extracomment>
<translation>Message history has been deleted</translation>
@ -2034,38 +2034,38 @@ Error</extracomment>
<context>
<name>ChatMessagesListView</name>
<message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="36"/>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="50"/>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="101"/>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="112"/>
<source>popup_info_find_message_title</source>
<extracomment>Find message</extracomment>
<translation>Find message</translation>
</message>
<message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="38"/>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="114"/>
<source>info_popup_no_result_message</source>
<extracomment>No result found</extracomment>
<translation>No result found</translation>
</message>
<message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="52"/>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="106"/>
<source>info_popup_first_result_message</source>
<extracomment>First result reached</extracomment>
<translation>First result reached</translation>
</message>
<message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="54"/>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="104"/>
<source>info_popup_last_result_message</source>
<extracomment>Last result reached</extracomment>
<translation>Last result reached</translation>
</message>
<message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="143"/>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="150"/>
<source>chat_message_list_encrypted_header_title</source>
<extracomment>End to end encrypted chat</extracomment>
<translation>End to end encrypted chat</translation>
</message>
<message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="153"/>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="160"/>
<source>chat_message_list_encrypted_header_message</source>
<extracomment>Les messages de cette conversation sont chiffrés de bout
en bout. Seul votre correspondant peut les déchiffrer.</extracomment>
@ -2073,7 +2073,7 @@ Error</extracomment>
Only your correspondent can decrypt them.</translation>
</message>
<message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="191"/>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="200"/>
<source>chat_message_is_writing_info</source>
<extracomment>%1 is writing</extracomment>
<translation>%1 is writing</translation>
@ -2748,142 +2748,138 @@ Only your correspondent can decrypt them.</translation>
<context>
<name>ConversationInfos</name>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="185"/>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="184"/>
<source>one_one_infos_call</source>
<extracomment>&quot;Appel&quot;</extracomment>
<translation>Call</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="199"/>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="198"/>
<source>one_one_infos_unmute</source>
<extracomment>&quot;Sourdine&quot;</extracomment>
<translation>Unmute</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="199"/>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="198"/>
<source>one_one_infos_mute</source>
<translation>Mute</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="215"/>
<source>one_one_infos_search</source>
<extracomment>&quot;Rechercher&quot;</extracomment>
<translation>Search</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="241"/>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="258"/>
<source>group_infos_participants</source>
<translation>Participants (%1)</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="258"/>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="275"/>
<source>group_infos_media_docs</source>
<extracomment>Medias &amp; documents</extracomment>
<translation>Medias &amp; documents</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="264"/>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="281"/>
<source>group_infos_shared_medias</source>
<extracomment>Shared medias</extracomment>
<translation>Shared medias</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="275"/>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="292"/>
<source>group_infos_shared_docs</source>
<extracomment>Shared documents</extracomment>
<translation>Shared documents</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="288"/>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="305"/>
<source>group_infos_other_actions</source>
<extracomment>Other actions</extracomment>
<translation>Other actions</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="294"/>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="311"/>
<source>group_infos_ephemerals</source>
<translation>Ephemeral messages : </translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="294"/>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="311"/>
<source>group_infos_enable_ephemerals</source>
<translation>Enable ephemeral messages</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="307"/>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="220"/>
<source>group_infos_meeting</source>
<extracomment>Schedule a meeting</extracomment>
<translation>Schedule a meeting</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="316"/>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="322"/>
<source>group_infos_leave_room</source>
<extracomment>Leave chat room</extracomment>
<translation>Leave Chat Room</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="321"/>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="327"/>
<source>group_infos_leave_room_toast_title</source>
<extracomment>Leave Chat Room ?</extracomment>
<translation>Leave Chat Room ?</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="323"/>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="329"/>
<source>group_infos_leave_room_toast_message</source>
<extracomment>All the messages will be removed from the chat room. Do you want to continue ?</extracomment>
<translation>All the messages will be removed from the chat room. Do you want to continue ?</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="336"/>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="342"/>
<source>group_infos_delete_history</source>
<extracomment>Delete history</extracomment>
<translation>Delete history</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="341"/>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="347"/>
<source>group_infos_delete_history_toast_title</source>
<extracomment>Delete history ?</extracomment>
<translation>Delete history ?</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="343"/>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="349"/>
<source>group_infos_delete_history_toast_message</source>
<extracomment>All the messages will be removed from the chat room. Do you want to continue ?</extracomment>
<translation>All the messages will be removed from the chat room. Do you want to continue ?</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="357"/>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="223"/>
<source>one_one_infos_open_contact</source>
<extracomment>Show contact</extracomment>
<translation>Show contact</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="357"/>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="225"/>
<source>one_one_infos_create_contact</source>
<extracomment>Create contact</extracomment>
<translation>Create contact</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="371"/>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="363"/>
<source>one_one_infos_ephemerals</source>
<translation>Ephemeral messages : </translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="371"/>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="363"/>
<source>one_one_infos_enable_ephemerals</source>
<translation>Enable ephemeral messages</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="381"/>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="373"/>
<source>one_one_infos_delete_history</source>
<translation>Delete history</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="386"/>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="378"/>
<source>one_one_infos_delete_history_toast_title</source>
<extracomment>Delete history ?</extracomment>
<translation>Delete history ?</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="388"/>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="380"/>
<source>one_one_infos_delete_history_toast_message</source>
<extracomment>All the messages will be removed from the chat room. Do you want to continue ?</extracomment>
<translation>All the messages will be removed from the chat room. Do you want to continue ?</translation>
@ -3121,59 +3117,59 @@ Only your correspondent can decrypt them.</translation>
<context>
<name>EventLogCore</name>
<message>
<location filename="../../core/chat/message/EventLogCore.cpp" line="101"/>
<location filename="../../core/chat/message/EventLogCore.cpp" line="107"/>
<source>conference_created_event</source>
<translation>You have joined the group</translation>
</message>
<message>
<location filename="../../core/chat/message/EventLogCore.cpp" line="104"/>
<location filename="../../core/chat/message/EventLogCore.cpp" line="110"/>
<source>conference_created_terminated</source>
<translation>You have left the group</translation>
</message>
<message>
<location filename="../../core/chat/message/EventLogCore.cpp" line="108"/>
<location filename="../../core/chat/message/EventLogCore.cpp" line="114"/>
<source>conference_participant_added_event</source>
<translation>%1 has joined</translation>
</message>
<message>
<location filename="../../core/chat/message/EventLogCore.cpp" line="112"/>
<location filename="../../core/chat/message/EventLogCore.cpp" line="118"/>
<source>conference_participant_removed_event</source>
<translation>%1 is no longer in the conversation</translation>
</message>
<message>
<location filename="../../core/chat/message/EventLogCore.cpp" line="149"/>
<location filename="../../core/chat/message/EventLogCore.cpp" line="155"/>
<source>conference_participant_set_admin_event</source>
<translation>%1 is now an admin</translation>
</message>
<message>
<location filename="../../core/chat/message/EventLogCore.cpp" line="153"/>
<location filename="../../core/chat/message/EventLogCore.cpp" line="159"/>
<source>conference_participant_unset_admin_event</source>
<translation>%1 is no longer an admin</translation>
</message>
<message>
<location filename="../../core/chat/message/EventLogCore.cpp" line="121"/>
<location filename="../../core/chat/message/EventLogCore.cpp" line="123"/>
<location filename="../../core/chat/message/EventLogCore.cpp" line="127"/>
<location filename="../../core/chat/message/EventLogCore.cpp" line="129"/>
<source>conference_security_event</source>
<translation>Security level degraded by %1</translation>
</message>
<message>
<location filename="../../core/chat/message/EventLogCore.cpp" line="130"/>
<location filename="../../core/chat/message/EventLogCore.cpp" line="136"/>
<source>conference_ephemeral_message_enabled_event</source>
<translation>Ephemeral messages enabled
Expiration : %1</translation>
</message>
<message>
<location filename="../../core/chat/message/EventLogCore.cpp" line="141"/>
<location filename="../../core/chat/message/EventLogCore.cpp" line="147"/>
<source>conference_ephemeral_message_disabled_event</source>
<translation>Ephemeral messages disabled</translation>
</message>
<message>
<location filename="../../core/chat/message/EventLogCore.cpp" line="145"/>
<location filename="../../core/chat/message/EventLogCore.cpp" line="151"/>
<source>conference_subject_changed_event</source>
<translation>New subject: %1</translation>
</message>
<message>
<location filename="../../core/chat/message/EventLogCore.cpp" line="136"/>
<location filename="../../core/chat/message/EventLogCore.cpp" line="142"/>
<source>conference_ephemeral_message_lifetime_changed_event</source>
<translation>Ephemeral messages updated
Expiration : %1</translation>
@ -4881,36 +4877,36 @@ To enable them in a commercial project, please contact us.</translation>
<context>
<name>SelectedChatView</name>
<message>
<location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="38"/>
<location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="37"/>
<source>chat_view_group_call_toast_message</source>
<translation>Start a group call ?</translation>
</message>
<message>
<location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="376"/>
<location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="400"/>
<source>reply_to_label</source>
<extracomment>Reply to %1</extracomment>
<translation>Reply to %1</translation>
</message>
<message>
<location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="570"/>
<location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="590"/>
<source>shared_medias_title</source>
<extracomment>Shared medias</extracomment>
<translation>Shared medias</translation>
</message>
<message>
<location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="572"/>
<location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="592"/>
<source>shared_documents_title</source>
<extracomment>Shared documents</extracomment>
<translation>Shared documents</translation>
</message>
<message>
<location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="601"/>
<location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="621"/>
<source>forward_to_title</source>
<extracomment>Forward to</extracomment>
<translation>Froward to</translation>
</message>
<message>
<location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="635"/>
<location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="655"/>
<source>conversations_title</source>
<extracomment>Conversations</extracomment>
<translation>Conversations</translation>

View file

@ -1710,13 +1710,13 @@
<context>
<name>ChatCore</name>
<message>
<location filename="../../core/chat/ChatCore.cpp" line="165"/>
<location filename="../../core/chat/ChatCore.cpp" line="175"/>
<source>info_toast_deleted_title</source>
<extracomment>Deleted</extracomment>
<translation>Supprimé</translation>
</message>
<message>
<location filename="../../core/chat/ChatCore.cpp" line="167"/>
<location filename="../../core/chat/ChatCore.cpp" line="177"/>
<source>info_toast_deleted_message_history</source>
<extracomment>Message history has been deleted</extracomment>
<translation>L&apos;historique des messages a é supprimé</translation>
@ -2034,38 +2034,38 @@ Error</extracomment>
<context>
<name>ChatMessagesListView</name>
<message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="36"/>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="50"/>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="101"/>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="112"/>
<source>popup_info_find_message_title</source>
<extracomment>Find message</extracomment>
<translation>Trouver un message</translation>
</message>
<message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="38"/>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="114"/>
<source>info_popup_no_result_message</source>
<extracomment>No result found</extracomment>
<translation>Aucun résultat trouvé</translation>
</message>
<message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="52"/>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="106"/>
<source>info_popup_first_result_message</source>
<extracomment>First result reached</extracomment>
<translation>Premier résultat atteint</translation>
</message>
<message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="54"/>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="104"/>
<source>info_popup_last_result_message</source>
<extracomment>Last result reached</extracomment>
<translation>Dernier résultat atteint</translation>
</message>
<message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="143"/>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="150"/>
<source>chat_message_list_encrypted_header_title</source>
<extracomment>End to end encrypted chat</extracomment>
<translation>Conversation chiffrée de bout en bout</translation>
</message>
<message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="153"/>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="160"/>
<source>chat_message_list_encrypted_header_message</source>
<extracomment>Les messages de cette conversation sont chiffrés de bout
en bout. Seul votre correspondant peut les déchiffrer.</extracomment>
@ -2073,7 +2073,7 @@ Error</extracomment>
en bout. Seul votre correspondant peut les déchiffrer.</translation>
</message>
<message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="191"/>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="200"/>
<source>chat_message_is_writing_info</source>
<extracomment>%1 is writing</extracomment>
<translation>%1 est en train d&apos;écrire</translation>
@ -2748,142 +2748,138 @@ en bout. Seul votre correspondant peut les déchiffrer.</translation>
<context>
<name>ConversationInfos</name>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="185"/>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="184"/>
<source>one_one_infos_call</source>
<extracomment>&quot;Appel&quot;</extracomment>
<translation>Appel</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="199"/>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="198"/>
<source>one_one_infos_unmute</source>
<extracomment>&quot;Sourdine&quot;</extracomment>
<translation>Réactiver les notifications</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="199"/>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="198"/>
<source>one_one_infos_mute</source>
<translation>Sourdine</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="215"/>
<source>one_one_infos_search</source>
<extracomment>&quot;Rechercher&quot;</extracomment>
<translation>Rechercher</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="241"/>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="258"/>
<source>group_infos_participants</source>
<translation>Participants (%1)</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="258"/>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="275"/>
<source>group_infos_media_docs</source>
<extracomment>Medias &amp; documents</extracomment>
<translation>Medias &amp; documents</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="264"/>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="281"/>
<source>group_infos_shared_medias</source>
<extracomment>Shared medias</extracomment>
<translation>Médias partagés</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="275"/>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="292"/>
<source>group_infos_shared_docs</source>
<extracomment>Shared documents</extracomment>
<translation>Documents partagés</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="288"/>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="305"/>
<source>group_infos_other_actions</source>
<extracomment>Other actions</extracomment>
<translation>Autres actions</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="294"/>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="311"/>
<source>group_infos_ephemerals</source>
<translation>Messages éphémères : </translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="294"/>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="311"/>
<source>group_infos_enable_ephemerals</source>
<translation>Activer les messages éphémères</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="307"/>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="220"/>
<source>group_infos_meeting</source>
<extracomment>Schedule a meeting</extracomment>
<translation>Programmer une réunion</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="316"/>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="322"/>
<source>group_infos_leave_room</source>
<extracomment>Leave chat room</extracomment>
<translation>Quitter la conversation</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="321"/>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="327"/>
<source>group_infos_leave_room_toast_title</source>
<extracomment>Leave Chat Room ?</extracomment>
<translation>Quitter la conversation ?</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="323"/>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="329"/>
<source>group_infos_leave_room_toast_message</source>
<extracomment>All the messages will be removed from the chat room. Do you want to continue ?</extracomment>
<translation>Vous ne recevrez ni pourrez envoyer des messages dans cette conversation, quitter ?</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="336"/>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="342"/>
<source>group_infos_delete_history</source>
<extracomment>Delete history</extracomment>
<translation>Supprimer l&apos;historique</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="341"/>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="347"/>
<source>group_infos_delete_history_toast_title</source>
<extracomment>Delete history ?</extracomment>
<translation>Supprimer l&apos;historique ?</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="343"/>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="349"/>
<source>group_infos_delete_history_toast_message</source>
<extracomment>All the messages will be removed from the chat room. Do you want to continue ?</extracomment>
<translation>Tous les messages seront supprimés. Souhaitez-vous continuer ?</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="357"/>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="223"/>
<source>one_one_infos_open_contact</source>
<extracomment>Show contact</extracomment>
<translation>Voir le contact</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="357"/>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="225"/>
<source>one_one_infos_create_contact</source>
<extracomment>Create contact</extracomment>
<translation>Créer un contact</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="371"/>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="363"/>
<source>one_one_infos_ephemerals</source>
<translation>Messages éphémères : </translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="371"/>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="363"/>
<source>one_one_infos_enable_ephemerals</source>
<translation>Activer les messages éphémères</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="381"/>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="373"/>
<source>one_one_infos_delete_history</source>
<translation>Supprimer l&apos;historique</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="386"/>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="378"/>
<source>one_one_infos_delete_history_toast_title</source>
<extracomment>Delete history ?</extracomment>
<translation>Supprimer l&apos;historique ?</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="388"/>
<location filename="../../view/Page/Layout/Chat/ConversationInfos.qml" line="380"/>
<source>one_one_infos_delete_history_toast_message</source>
<extracomment>All the messages will be removed from the chat room. Do you want to continue ?</extracomment>
<translation>Tous les messages seront supprimés. Souhaitez-vous continuer ?</translation>
@ -3121,60 +3117,60 @@ en bout. Seul votre correspondant peut les déchiffrer.</translation>
<context>
<name>EventLogCore</name>
<message>
<location filename="../../core/chat/message/EventLogCore.cpp" line="101"/>
<location filename="../../core/chat/message/EventLogCore.cpp" line="107"/>
<source>conference_created_event</source>
<translation>Vous avez rejoint le groupe</translation>
</message>
<message>
<location filename="../../core/chat/message/EventLogCore.cpp" line="104"/>
<location filename="../../core/chat/message/EventLogCore.cpp" line="110"/>
<source>conference_created_terminated</source>
<translation>Vous avez quitté le groupe</translation>
</message>
<message>
<location filename="../../core/chat/message/EventLogCore.cpp" line="108"/>
<location filename="../../core/chat/message/EventLogCore.cpp" line="114"/>
<source>conference_participant_added_event</source>
<translation>%1 a rejoint le groupe</translation>
</message>
<message>
<location filename="../../core/chat/message/EventLogCore.cpp" line="112"/>
<location filename="../../core/chat/message/EventLogCore.cpp" line="118"/>
<source>conference_participant_removed_event</source>
<translation>%1 ne fait plus partie du groupe</translation>
</message>
<message>
<location filename="../../core/chat/message/EventLogCore.cpp" line="121"/>
<location filename="../../core/chat/message/EventLogCore.cpp" line="123"/>
<location filename="../../core/chat/message/EventLogCore.cpp" line="127"/>
<location filename="../../core/chat/message/EventLogCore.cpp" line="129"/>
<source>conference_security_event</source>
<translation>Niveau de sécurité dégradé par %1</translation>
</message>
<message>
<location filename="../../core/chat/message/EventLogCore.cpp" line="130"/>
<location filename="../../core/chat/message/EventLogCore.cpp" line="136"/>
<source>conference_ephemeral_message_enabled_event</source>
<translation>Messages éphémères activés
Expiration : %1</translation>
</message>
<message>
<location filename="../../core/chat/message/EventLogCore.cpp" line="136"/>
<location filename="../../core/chat/message/EventLogCore.cpp" line="142"/>
<source>conference_ephemeral_message_lifetime_changed_event</source>
<translation>Messages éphémères mis à jour
Expiration : %1</translation>
</message>
<message>
<location filename="../../core/chat/message/EventLogCore.cpp" line="141"/>
<location filename="../../core/chat/message/EventLogCore.cpp" line="147"/>
<source>conference_ephemeral_message_disabled_event</source>
<translation>Messages éphémères désactivés</translation>
</message>
<message>
<location filename="../../core/chat/message/EventLogCore.cpp" line="145"/>
<location filename="../../core/chat/message/EventLogCore.cpp" line="151"/>
<source>conference_subject_changed_event</source>
<translation>Nouveau sujet : %1</translation>
</message>
<message>
<location filename="../../core/chat/message/EventLogCore.cpp" line="153"/>
<location filename="../../core/chat/message/EventLogCore.cpp" line="159"/>
<source>conference_participant_unset_admin_event</source>
<translation>%1 n&apos;est plus admin</translation>
</message>
<message>
<location filename="../../core/chat/message/EventLogCore.cpp" line="149"/>
<location filename="../../core/chat/message/EventLogCore.cpp" line="155"/>
<source>conference_participant_set_admin_event</source>
<translation>%1 est maintenant admin</translation>
</message>
@ -4881,36 +4877,36 @@ Pour les activer dans un projet commercial, merci de nous contacter.</translatio
<context>
<name>SelectedChatView</name>
<message>
<location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="38"/>
<location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="37"/>
<source>chat_view_group_call_toast_message</source>
<translation>Démarrer un appel de groupe ?</translation>
</message>
<message>
<location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="376"/>
<location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="400"/>
<source>reply_to_label</source>
<extracomment>Reply to %1</extracomment>
<translation>Réponse à %1</translation>
</message>
<message>
<location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="570"/>
<location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="590"/>
<source>shared_medias_title</source>
<extracomment>Shared medias</extracomment>
<translation>Médias partagés</translation>
</message>
<message>
<location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="572"/>
<location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="592"/>
<source>shared_documents_title</source>
<extracomment>Shared documents</extracomment>
<translation>Documents partagés</translation>
</message>
<message>
<location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="601"/>
<location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="621"/>
<source>forward_to_title</source>
<extracomment>Forward to</extracomment>
<translation>Transférer à</translation>
</message>
<message>
<location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="635"/>
<location filename="../../view/Page/Form/Chat/SelectedChatView.qml" line="655"/>
<source>conversations_title</source>
<extracomment>Conversations</extracomment>
<translation>Conversations</translation>

View file

@ -13,6 +13,7 @@ list(APPEND _LINPHONEAPP_SOURCES
model/chat/ChatModel.cpp
model/chat/message/ChatMessageModel.cpp
model/chat/message/EventLogModel.cpp
model/chat/message/content/ChatMessageContentModel.cpp
model/conference/ConferenceInfoModel.cpp

View file

@ -175,6 +175,12 @@ ChatModel::createMessage(QString text, QList<std::shared_ptr<ChatMessageContentM
return message;
}
std::shared_ptr<linphone::EventLog>
ChatModel::searchMessageByText(QString text, std::shared_ptr<const linphone::EventLog> from, bool forward) {
return mMonitor->searchChatMessageByText(Utils::appStringToCoreString(text), from,
forward ? linphone::SearchDirection::Down : linphone::SearchDirection::Up);
}
void ChatModel::compose() {
mMonitor->compose();
}

View file

@ -61,6 +61,10 @@ public:
std::shared_ptr<linphone::ChatMessage> createTextMessageFromText(QString text);
std::shared_ptr<linphone::ChatMessage> createMessage(QString text,
QList<std::shared_ptr<ChatMessageContentModel>> filesContent);
std::shared_ptr<linphone::EventLog>
searchMessageByText(QString text, std::shared_ptr<const linphone::EventLog> = nullptr, bool forward = true);
void compose();
linphone::ChatRoom::State getState() const;
void setMuted(bool muted);

View file

@ -0,0 +1,45 @@
/*
* Copyright (c) 2010-2024 Belledonne Communications SARL.
*
* This file is part of linphone-desktop
* (see https://www.linphone.org).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "EventLogModel.hpp"
#include <QDebug>
#include "core/path/Paths.hpp"
#include "model/core/CoreModel.hpp"
#include "model/setting/SettingsModel.hpp"
#include "model/tool/ToolModel.hpp"
#include "tool/Utils.hpp"
DEFINE_ABSTRACT_OBJECT(EventLogModel)
EventLogModel::EventLogModel(const std::shared_ptr<const linphone::EventLog> &eventLog, QObject *parent)
: mEventLog(eventLog) {
// lDebug() << "[EventLogModel] new" << this << " / SDKModel=" << eventLog.get();
mustBeInLinphoneThread(getClassName());
}
EventLogModel::~EventLogModel() {
mustBeInLinphoneThread("~" + getClassName());
}
std::shared_ptr<const linphone::EventLog> EventLogModel::getEventLog() const {
return mEventLog;
}

View file

@ -0,0 +1,45 @@
/*
* Copyright (c) 2010-2024 Belledonne Communications SARL.
*
* This file is part of linphone-desktop
* (see https://www.linphone.org).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef EVENT_LOG_MODEL_H_
#define EVENT_LOG_MODEL_H_
#include "model/listener/Listener.hpp"
#include "tool/AbstractObject.hpp"
#include "tool/LinphoneEnums.hpp"
#include <QObject>
#include <QTimer>
#include <linphone++/linphone.hh>
class EventLogModel : public QObject, public AbstractObject {
Q_OBJECT
public:
EventLogModel(const std::shared_ptr<const linphone::EventLog> &eventLog, QObject *parent = nullptr);
~EventLogModel();
std::shared_ptr<const linphone::EventLog> getEventLog() const;
private:
std::shared_ptr<const linphone::EventLog> mEventLog;
DECLARE_ABSTRACT_OBJECT
};
#endif

View file

@ -28,6 +28,7 @@ ColumnLayout {
Text {
id: text
Layout.alignment: Qt.AlignHCenter
Layout.fillWidth: true
text: labelButton.label
font {
pixelSize: Typography.p1.pixelSize

View file

@ -13,6 +13,7 @@ ListView {
property ChatGui chat
property color backgroundColor
property bool lastItemVisible: false
property int lastIndexFoundWithFilter: -1
verticalLayoutDirection: ListView.BottomToTop
signal showReactionsForMessageRequested(ChatMessageGui chatMessage)
signal showImdnStatusForMessageRequested(ChatMessageGui chatMessage)
@ -20,39 +21,21 @@ ListView {
signal forwardMessageRequested(ChatMessageGui chatMessage)
signal requestHighlight(int indexToHighlight)
signal requestAutoPlayVoiceRecording(int indexToPlay)
currentIndex: -1
property string filterText
onFilterTextChanged: {
lastIndexFoundWithFilter = -1
if (filterText === "") return
eventLogProxy.filterText = filterText
var indexVisible = indexAt(contentX, contentY)
var found = eventLogProxy.findIndexCorrespondingToFilter(indexVisible)
if (found !== -1) {
currentIndex = found
positionViewAtIndex(found, ListView.Center)
requestHighlight(found)
} else {
//: Find message
UtilsCpp.showInformationPopup(qsTr("popup_info_find_message_title"),
//: No result found
qsTr("info_popup_no_result_message"), false)
}
}
signal findIndexWithFilter(bool goingBackward)
onFindIndexWithFilter: (goingBackward) => {
var nextIndex = eventLogProxy.findIndexCorrespondingToFilter(currentIndex, goingBackward)
if (nextIndex !== -1 && nextIndex !== currentIndex) {
currentIndex = nextIndex
positionViewAtIndex(nextIndex, ListView.Center)
requestHighlight(nextIndex)
} else if (currentIndex !== -1) {
//: Find message
UtilsCpp.showInformationPopup(qsTr("popup_info_find_message_title"),
//: First result reached
goingBackward ? qsTr("info_popup_first_result_message")
//: Last result reached
: qsTr("info_popup_last_result_message"), false)
eventLogProxy.findIndexCorrespondingToFilter(indexVisible, true, true)
}
signal findIndexWithFilter(bool forward)
property bool searchForward: true
onFindIndexWithFilter: (forward) => {
searchForward = forward
eventLogProxy.findIndexCorrespondingToFilter(currentIndex, forward, false)
}
Component.onCompleted: {
@ -63,9 +46,6 @@ ListView {
})
}
onCountChanged: if (atYEnd) {
positionViewAtEnd()
}
onChatChanged: lastItemVisible = false
Button {
@ -109,6 +89,32 @@ ListView {
positionViewAtIndex(index, ListView.Beginning)
eventLogProxy.markIndexAsRead(index)
})
onIndexWithFilterFound: (index) => {
if (index !== -1) {
currentIndex = index
mainItem.positionViewAtIndex(index, ListView.Center)
mainItem.requestHighlight(index)
mainItem.lastIndexFoundWithFilter = index
} else {
if (mainItem.lastIndexFoundWithFilter !== index) {
//: Find message
UtilsCpp.showInformationPopup(qsTr("popup_info_find_message_title"),
mainItem.searchForward
//: Last result reached
? qsTr("info_popup_last_result_message")
//: First result reached
: qsTr("info_popup_first_result_message"), false)
mainItem.positionViewAtIndex(mainItem.lastIndexFoundWithFilter, ListView.Center)
mainItem.requestHighlight(mainItem.lastIndexFoundWithFilter)
}
else {
//: Find message
UtilsCpp.showInformationPopup(qsTr("popup_info_find_message_title"),
//: No result found
qsTr("info_popup_no_result_message"), false)
}
}
}
}
footer: Item {

View file

@ -19,7 +19,6 @@ RowLayout {
property CallGui call
property alias callHeaderContent: splitPanel.headerContentItem
property bool replyingToMessage: false
property bool showSearchBar: false
spacing: 0
enum PanelType { MessageReactions, SharedFiles, Medias, ImdnStatus, ForwardToList, ManageParticipants, EphemeralSettings, None}
@ -51,6 +50,10 @@ RowLayout {
})
}
Keys.onPressed: (event) => {
if (event.modifiers & Qt.ControlModifier && event.key === Qt.Key_F) searchBarLayout.visible = true
}
//onEventChanged: {
// TODO : call when all messages read after scroll to unread feature available
// if (chat) chat.core.lMarkAsRead()
@ -65,7 +68,7 @@ RowLayout {
header.leftPadding: Math.round(32 * DefaultStyle.dp)
header.rightPadding: Math.round(32 * DefaultStyle.dp)
header.topPadding: Math.round(6 * DefaultStyle.dp)
header.bottomPadding: mainItem.showSearchBar ? Math.round(3 * DefaultStyle.dp) : Math.round(6 * DefaultStyle.dp)
header.bottomPadding: searchBarLayout.visible ? Math.round(3 * DefaultStyle.dp) : Math.round(6 * DefaultStyle.dp)
headerContentItem: ColumnLayout {
anchors.left: parent?.left
@ -119,6 +122,18 @@ RowLayout {
}
}
}
RoundButton {
id: searchInHistoryButton
style: ButtonStyle.noBackground
icon.source: AppIcons.search
checkable: true
checkedImageColor: DefaultStyle.main1_500_main
onCheckedChanged: searchBarLayout.visible = checked
Connections {
target: searchBarLayout
function onVisibleChanged() {searchInHistoryButton.checked = searchBarLayout.visible}
}
}
RoundButton {
style: ButtonStyle.noBackground
icon.source: AppIcons.videoCamera
@ -140,7 +155,7 @@ RowLayout {
}
RowLayout {
id: searchBarLayout
visible: mainItem.showSearchBar
visible: searchInHistoryButton.checked
onVisibleChanged: {
if(!visible) chatMessagesSearchBar.clearText()
else chatMessagesSearchBar.forceActiveFocus()
@ -151,18 +166,24 @@ RowLayout {
id: chatMessagesSearchBar
Layout.fillWidth: true
Layout.rightMargin: Math.round(10 * DefaultStyle.dp)
property ChatMessageGui messageFound
delaySearch: false
Keys.onPressed: (event) => {
event.accepted = false
if (event.key === Qt.Key_Enter || event.key === Qt.Key_Return) {
if (chatMessagesListView.filterText !== text) {
chatMessagesListView.filterText = text
} else {
if (event.modifiers & Qt.ShiftModifier) {
chatMessagesListView.findIndexWithFilter(true)
} else {
chatMessagesListView.findIndexWithFilter(false)
} else {
chatMessagesListView.findIndexWithFilter(true)
}
}
event.accepted = true
} else if (event.key === Qt.Key_Escape) {
searchBarLayout.visible = false
event.accepted = true
}
}
}
@ -171,18 +192,21 @@ RowLayout {
RoundButton {
icon.source: AppIcons.upArrow
style: ButtonStyle.noBackground
onClicked: chatMessagesListView.findIndexWithFilter(true)
onClicked: chatMessagesListView.findIndexWithFilter(false)
}
RoundButton {
icon.source: AppIcons.downArrow
style: ButtonStyle.noBackground
onClicked: chatMessagesListView.findIndexWithFilter(false)
onClicked: chatMessagesListView.findIndexWithFilter(true)
}
}
RoundButton {
icon.source: AppIcons.closeX
Layout.rightMargin: Math.round(20 * DefaultStyle.dp)
onClicked: mainItem.showSearchBar = false
onClicked: {
chatMessagesListView.filterText = ""
searchBarLayout.visible = false
}
style: ButtonStyle.noBackground
}
}
@ -204,7 +228,7 @@ RowLayout {
ChatMessagesListView {
id: chatMessagesListView
clip: true
height: contentHeight
height: implicitHeight
backgroundColor: splitPanel.panelColor
width: parent.width - anchors.leftMargin - anchors.rightMargin
chat: mainItem.chat
@ -502,6 +526,7 @@ RowLayout {
// anchors.top: parent.top
anchors.fill: parent
anchors.topMargin: Math.round(39 * DefaultStyle.dp)
anchors.rightMargin: Math.round(15 * DefaultStyle.dp)
sourceComponent: panelType === SelectedChatView.PanelType.EphemeralSettings
? ephemeralSettingsComponent
: panelType === SelectedChatView.PanelType.MessageReactions
@ -531,10 +556,6 @@ RowLayout {
onEphemeralSettingsRequested: contentLoader.panelType = SelectedChatView.PanelType.EphemeralSettings
onShowSharedFilesRequested: (showMedias) => {
contentLoader.panelType = showMedias ? SelectedChatView.PanelType.Medias : SelectedChatView.PanelType.SharedFiles
}
onSearchInHistoryRequested: {
mainItem.showSearchBar = true
detailsPanel.visible = false
}
onManageParticipantsRequested: contentLoader.panelType = SelectedChatView.PanelType.ManageParticipants
}

View file

@ -19,7 +19,6 @@ ColumnLayout {
spacing: 0
signal ephemeralSettingsRequested()
signal showSharedFilesRequested(bool showMedias)
signal searchInHistoryRequested()
signal manageParticipantsRequested()
Avatar {
@ -202,6 +201,7 @@ ColumnLayout {
}
}
LabelButton {
visible: !mainItem.isGroup || !SettingsCpp.disableMeetingsFeature
text.Layout.fillWidth: true
text.horizontalAlignment: Text.AlignHCenter
text.wrapMode: Text.Wrap
@ -210,11 +210,28 @@ ColumnLayout {
Layout.maximumWidth: Math.round(130 * DefaultStyle.dp)
button.icon.width: Math.round(24 * DefaultStyle.dp)
button.icon.height: Math.round(24 * DefaultStyle.dp)
button.icon.source: AppIcons.search
//: "Rechercher"
label: qsTr("one_one_infos_search")
button.icon.source: mainItem.isGroup
? AppIcons.videoconference
: contactObj.value
? AppIcons.adressBook
: AppIcons.plusCircle
label: mainItem.isGroup
//: Schedule a meeting
? qsTr("group_infos_meeting")
: contactObj.value
//: Show contact
? qsTr("one_one_infos_open_contact")
//: Create contact
: qsTr("one_one_infos_create_contact")
button.onClicked: {
mainItem.searchInHistoryRequested()
if (mainItem.isGroup)
UtilsCpp.getMainWindow().scheduleMeeting(mainItem.chatCore.title, mainItem.chatCore.participantsAddresses)
else {
if (contactObj.value)
mainWindow.displayContactPage(contactObj.value.core.defaultAddress)
else
mainWindow.displayCreateContactPage("",mainItem.chatCore.peerAddress)
}
}
}
}
@ -226,7 +243,6 @@ ColumnLayout {
Layout.topMargin: Math.round(30 * DefaultStyle.dp)
clip: true
Layout.leftMargin: Math.round(15 * DefaultStyle.dp)
Layout.rightMargin: Math.round(15 * DefaultStyle.dp)
ColumnLayout {
spacing: 0
@ -298,17 +314,6 @@ ColumnLayout {
mainItem.ephemeralSettingsRequested()
}
},
{
visible: !SettingsCpp.disableMeetingsFeature,
icon: AppIcons.videoconference,
color: DefaultStyle.main2_600,
showRightArrow: false,
//: Schedule a meeting
text: qsTr("group_infos_meeting"),
action: function() {
UtilsCpp.getMainWindow().scheduleMeeting(mainItem.chatCore.title, mainItem.chatCore.participantsAddresses)
}
},
{
icon: AppIcons.signOut,
visible: !mainItem.chatCore.isReadOnly,
@ -351,20 +356,6 @@ ColumnLayout {
}
]
: [
{
icon: contactObj.value ? AppIcons.adressBook : AppIcons.plusCircle,
visible: true,
text: contactObj.value ? qsTr("one_one_infos_open_contact") : qsTr("one_one_infos_create_contact"),
color: DefaultStyle.main2_600,
showRightArrow: false,
action: function() {
// contactObj.value = friendGui
if (contactObj.value)
mainWindow.displayContactPage(contactObj.value.core.defaultAddress)
else
mainWindow.displayCreateContactPage("",mainItem.chatCore.peerAddress)
}
},
{
icon: AppIcons.clockCountDown,
visible: !mainItem.chatCore.isReadOnly,