clone the linphone conference info pointer when created to get the diff with the old ones (needed to fix participant removing) #SDK-1001

fix position chat message list to first unread index #LINQT-2371

force sending chat message messageRead() callback when chat room is marked as read

try to fix crash with const & in MagicSearchList
This commit is contained in:
Gaelle Braud 2026-01-26 17:05:37 +01:00
parent 4c9d6b4d7c
commit 50efe4d54a
14 changed files with 65 additions and 43 deletions

View file

@ -230,8 +230,10 @@ void ChatMessageCore::setSelf(QSharedPointer<ChatMessageCore> me) {
}); });
} }
}); });
mChatMessageModelConnection->makeConnectToModel(&ChatMessageModel::messageRead, [this]() { mChatMessageModelConnection->makeConnectToModel(
mChatMessageModelConnection->invokeToCore([this] { setIsRead(true); }); &ChatMessageModel::messageRead, [this](const std::shared_ptr<linphone::ChatMessage> &chatMessage) {
bool isRead = chatMessage->isRead();
mChatMessageModelConnection->invokeToCore([this, isRead] { setIsRead(isRead); });
}); });
mChatMessageModelConnection->makeConnectToCore(&ChatMessageCore::lSendReaction, [this](const QString &reaction) { mChatMessageModelConnection->makeConnectToCore(&ChatMessageCore::lSendReaction, [this](const QString &reaction) {
mChatMessageModelConnection->invokeToModel([this, reaction] { mChatMessageModel->sendReaction(reaction); }); mChatMessageModelConnection->invokeToModel([this, reaction] { mChatMessageModel->sendReaction(reaction); });

View file

@ -298,12 +298,14 @@ void EventLogList::setSelf(QSharedPointer<EventLogList> me) {
if (!mChatCore) { if (!mChatCore) {
endResetModel(); endResetModel();
setIsUpdating(false); setIsUpdating(false);
emit modelUpdated();
return; return;
} }
auto chatModel = mChatCore->getModel(); auto chatModel = mChatCore->getModel();
if (!chatModel) { if (!chatModel) {
endResetModel(); endResetModel();
setIsUpdating(false); setIsUpdating(false);
emit modelUpdated();
return; return;
} }
mCoreModelConnection->invokeToModel([this, chatModel]() { mCoreModelConnection->invokeToModel([this, chatModel]() {
@ -321,6 +323,7 @@ void EventLogList::setSelf(QSharedPointer<EventLogList> me) {
} }
endResetModel(); endResetModel();
setIsUpdating(false); setIsUpdating(false);
emit modelUpdated();
}); });
}); });
}); });

View file

@ -67,6 +67,7 @@ public:
signals: signals:
void lUpdate(); void lUpdate();
void modelUpdated();
void filterChanged(QString filter); void filterChanged(QString filter);
void eventInsertedByUser(int index); void eventInsertedByUser(int index);
void messageWithFilterFound(int index); void messageWithFilterFound(int index);

View file

@ -57,6 +57,7 @@ void EventLogProxy::setSourceModel(QAbstractItemModel *model) {
int proxyIndex = mapFromSource(newEventLogList->index(i, 0)).row(); int proxyIndex = mapFromSource(newEventLogList->index(i, 0)).row();
emit eventInsertedByUser(proxyIndex); emit eventInsertedByUser(proxyIndex);
}); });
connect(newEventLogList, &EventLogList::modelUpdated, this, &EventLogProxy::modelUpdated);
} }
QSortFilterProxyModel::setSourceModel(model); QSortFilterProxyModel::setSourceModel(model);
} }

View file

@ -87,6 +87,7 @@ signals:
void maxDisplayItemsChanged(); void maxDisplayItemsChanged();
void displayItemsStepChanged(); void displayItemsStepChanged();
void filterTextChanged(); void filterTextChanged();
void modelUpdated();
protected: protected:
QSharedPointer<EventLogList> mList; QSharedPointer<EventLogList> mList;

View file

@ -49,7 +49,7 @@ MagicSearchList::~MagicSearchList() {
mustBeInMainThread("~" + getClassName()); mustBeInMainThread("~" + getClassName());
} }
void MagicSearchList::setSelf(QSharedPointer<MagicSearchList> me) { void MagicSearchList::setSelf(const QSharedPointer<MagicSearchList> &me) {
mCoreModelConnection = SafeConnection<MagicSearchList, CoreModel>::create(me, CoreModel::getInstance()); mCoreModelConnection = SafeConnection<MagicSearchList, CoreModel>::create(me, CoreModel::getInstance());
mCoreModelConnection->makeConnectToModel( mCoreModelConnection->makeConnectToModel(
&CoreModel::friendCreated, [this](const std::shared_ptr<linphone::Friend> &f) { &CoreModel::friendCreated, [this](const std::shared_ptr<linphone::Friend> &f) {

View file

@ -40,7 +40,7 @@ public:
MagicSearchList(QObject *parent = Q_NULLPTR); MagicSearchList(QObject *parent = Q_NULLPTR);
~MagicSearchList(); ~MagicSearchList();
void setSelf(QSharedPointer<MagicSearchList> me); void setSelf(const QSharedPointer<MagicSearchList> &me);
void connectContact(FriendCore *data); void connectContact(FriendCore *data);
void setSearch(const QString &search); void setSearch(const QString &search);
void setResults(const QList<QSharedPointer<FriendCore>> &contacts); void setResults(const QList<QSharedPointer<FriendCore>> &contacts);

View file

@ -2472,44 +2472,44 @@ Error</extracomment>
<context> <context>
<name>ChatMessagesListView</name> <name>ChatMessagesListView</name>
<message> <message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="107"/> <location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="110"/>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="118"/> <location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="121"/>
<source>popup_info_find_message_title</source> <source>popup_info_find_message_title</source>
<extracomment>Find message</extracomment> <extracomment>Find message</extracomment>
<translation>Nachricht suchen</translation> <translation>Nachricht suchen</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="120"/> <location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="123"/>
<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>Keine Ergebnisse gefunden</translation> <translation>Keine Ergebnisse gefunden</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="112"/> <location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="115"/>
<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>Erstes Ergebnis erreicht</translation> <translation>Erstes Ergebnis erreicht</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="110"/> <location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="113"/>
<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>Letztes Ergebnis erreicht</translation> <translation>Letztes Ergebnis erreicht</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="157"/> <location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="160"/>
<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>Ende-zu-Ende-verschlüsselter Chat</translation> <translation>Ende-zu-Ende-verschlüsselter Chat</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="159"/> <location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="162"/>
<source>unencrypted_conversation_warning</source> <source>unencrypted_conversation_warning</source>
<extracomment>This conversation is not encrypted !</extracomment> <extracomment>This conversation is not encrypted !</extracomment>
<translation>Dieser Chat ist nicht verschlüsselt!</translation> <translation>Dieser Chat ist nicht verschlüsselt!</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="170"/> <location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="173"/>
<source>chat_message_list_encrypted_header_message</source> <source>chat_message_list_encrypted_header_message</source>
<extracomment>Messages in this conversation are e2e encrypted. <extracomment>Messages in this conversation are e2e encrypted.
Only your correspondent can decrypt them.</extracomment> Only your correspondent can decrypt them.</extracomment>
@ -2517,7 +2517,7 @@ Error</extracomment>
Nur Ihr Gesprächspartner kann sie entschlüsseln.</translation> Nur Ihr Gesprächspartner kann sie entschlüsseln.</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="172"/> <location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="175"/>
<source>chat_message_list_not_encrypted_header_message</source> <source>chat_message_list_not_encrypted_header_message</source>
<extracomment>Messages are not end to end encrypted, <extracomment>Messages are not end to end encrypted,
may sure you don&apos;t share any sensitive information !</extracomment> may sure you don&apos;t share any sensitive information !</extracomment>
@ -2525,7 +2525,7 @@ Nur Ihr Gesprächspartner kann sie entschlüsseln.</translation>
Stellen Sie sicher, dass Sie keine sensiblen Informationen teilen!</translation> Stellen Sie sicher, dass Sie keine sensiblen Informationen teilen!</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="212"/> <location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="215"/>
<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 schreibt</translation> <translation>%1 schreibt</translation>

View file

@ -2430,44 +2430,44 @@ Error</extracomment>
<context> <context>
<name>ChatMessagesListView</name> <name>ChatMessagesListView</name>
<message> <message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="107"/> <location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="110"/>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="118"/> <location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="121"/>
<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="120"/> <location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="123"/>
<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="112"/> <location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="115"/>
<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="110"/> <location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="113"/>
<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="157"/> <location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="160"/>
<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="159"/> <location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="162"/>
<source>unencrypted_conversation_warning</source> <source>unencrypted_conversation_warning</source>
<extracomment>This conversation is not encrypted !</extracomment> <extracomment>This conversation is not encrypted !</extracomment>
<translation>This conversation is not encrypted !</translation> <translation>This conversation is not encrypted !</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="170"/> <location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="173"/>
<source>chat_message_list_encrypted_header_message</source> <source>chat_message_list_encrypted_header_message</source>
<extracomment>Messages in this conversation are e2e encrypted. <extracomment>Messages in this conversation are e2e encrypted.
Only your correspondent can decrypt them.</extracomment> Only your correspondent can decrypt them.</extracomment>
@ -2475,7 +2475,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="172"/> <location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="175"/>
<source>chat_message_list_not_encrypted_header_message</source> <source>chat_message_list_not_encrypted_header_message</source>
<extracomment>Messages are not end to end encrypted, <extracomment>Messages are not end to end encrypted,
may sure you don&apos;t share any sensitive information !</extracomment> may sure you don&apos;t share any sensitive information !</extracomment>
@ -2483,7 +2483,7 @@ Only your correspondent can decrypt them.</translation>
may sure you don&apos;t share any sensitive information !</translation> may sure you don&apos;t share any sensitive information !</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="212"/> <location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="215"/>
<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>

View file

@ -2405,44 +2405,44 @@ Error</extracomment>
<context> <context>
<name>ChatMessagesListView</name> <name>ChatMessagesListView</name>
<message> <message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="107"/> <location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="110"/>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="118"/> <location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="121"/>
<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="120"/> <location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="123"/>
<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="112"/> <location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="115"/>
<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="110"/> <location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="113"/>
<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="157"/> <location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="160"/>
<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="159"/> <location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="162"/>
<source>unencrypted_conversation_warning</source> <source>unencrypted_conversation_warning</source>
<extracomment>This conversation is not encrypted !</extracomment> <extracomment>This conversation is not encrypted !</extracomment>
<translation>Cette conversation n&apos;est pas chiffrée !</translation> <translation>Cette conversation n&apos;est pas chiffrée !</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="170"/> <location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="173"/>
<source>chat_message_list_encrypted_header_message</source> <source>chat_message_list_encrypted_header_message</source>
<extracomment>Messages in this conversation are e2e encrypted. <extracomment>Messages in this conversation are e2e encrypted.
Only your correspondent can decrypt them.</extracomment> Only your correspondent can decrypt them.</extracomment>
@ -2450,7 +2450,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="172"/> <location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="175"/>
<source>chat_message_list_not_encrypted_header_message</source> <source>chat_message_list_not_encrypted_header_message</source>
<extracomment>Messages are not end to end encrypted, <extracomment>Messages are not end to end encrypted,
may sure you don&apos;t share any sensitive information !</extracomment> may sure you don&apos;t share any sensitive information !</extracomment>
@ -2458,7 +2458,7 @@ en bout. Seul votre correspondant peut les déchiffrer.</translation>
assurez-vous de ne pas partager dinformations sensibles !</translation> assurez-vous de ne pas partager dinformations sensibles !</translation>
</message> </message>
<message> <message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="212"/> <location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="215"/>
<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>

View file

@ -44,6 +44,15 @@ ChatMessageModel::ChatMessageModel(const std::shared_ptr<linphone::ChatMessage>
mEphemeralTimer.stop(); mEphemeralTimer.stop();
deleteMessageFromChatRoom(false); deleteMessageFromChatRoom(false);
}); });
// We need to force this signal sending because there is no callback to know when a message has been read
connect(CoreModel::getInstance().get(), &CoreModel::chatRoomRead, this,
[this](const std::shared_ptr<linphone::Core> &core, const std::shared_ptr<linphone::ChatRoom> &chatRoom) {
if (chatRoom == mMonitor->getChatRoom()) {
if (mMonitor->isRead()) {
emit messageRead(mMonitor);
}
}
});
} }
ChatMessageModel::~ChatMessageModel() { ChatMessageModel::~ChatMessageModel() {
@ -91,7 +100,7 @@ bool ChatMessageModel::isRead() const {
void ChatMessageModel::markAsRead() { void ChatMessageModel::markAsRead() {
mMonitor->markAsRead(); mMonitor->markAsRead();
emit messageRead(); emit messageRead(mMonitor);
emit CoreModel::getInstance()->messageReadInChatRoom(mMonitor->getChatRoom()); emit CoreModel::getInstance()->messageReadInChatRoom(mMonitor->getChatRoom());
} }

View file

@ -65,7 +65,7 @@ public:
signals: signals:
void messageDeleted(bool deletedByUser); void messageDeleted(bool deletedByUser);
void messageRead(); void messageRead(const std::shared_ptr<linphone::ChatMessage> &chatMessage);
void msgStateChanged(const std::shared_ptr<linphone::ChatMessage> &message, linphone::ChatMessage::State state); void msgStateChanged(const std::shared_ptr<linphone::ChatMessage> &message, linphone::ChatMessage::State state);
void newMessageReaction(const std::shared_ptr<linphone::ChatMessage> &message, void newMessageReaction(const std::shared_ptr<linphone::ChatMessage> &message,
@ -99,6 +99,7 @@ signals:
private: private:
linphone::ChatMessage::State mMessageState; linphone::ChatMessage::State mMessageState;
QTimer mEphemeralTimer; QTimer mEphemeralTimer;
std::weak_ptr<linphone::ChatRoom> mChatRoom;
DECLARE_ABSTRACT_OBJECT DECLARE_ABSTRACT_OBJECT

View file

@ -32,7 +32,8 @@ DEFINE_ABSTRACT_OBJECT(ConferenceInfoModel)
ConferenceInfoModel::ConferenceInfoModel(const std::shared_ptr<linphone::ConferenceInfo> &conferenceInfo, ConferenceInfoModel::ConferenceInfoModel(const std::shared_ptr<linphone::ConferenceInfo> &conferenceInfo,
QObject *parent) QObject *parent)
: mConferenceInfo(conferenceInfo) { // TODO : remove cloning when a fix will be done in SDK (#SDK-1001 ticket)
: mConferenceInfo(conferenceInfo->clone()) {
mustBeInLinphoneThread(getClassName()); mustBeInLinphoneThread(getClassName());
} }

View file

@ -18,7 +18,7 @@ ListView {
property real busyIndicatorSize: Utils.getSizeWithScreenRatio(60) property real busyIndicatorSize: Utils.getSizeWithScreenRatio(60)
property bool loading: false property bool loading: false
property bool isEncrypted: chat && chat.core.isEncrypted property bool isEncrypted: chat && chat.core.isEncrypted
highlightFollowsCurrentItem: false highlightFollowsCurrentItem: true
verticalLayoutDirection: ListView.BottomToTop verticalLayoutDirection: ListView.BottomToTop
signal showReactionsForMessageRequested(ChatMessageGui chatMessage) signal showReactionsForMessageRequested(ChatMessageGui chatMessage)
@ -73,7 +73,7 @@ ListView {
onAtYBeginningChanged: if (atYBeginning && count !== 0) { onAtYBeginningChanged: if (atYBeginning && count !== 0) {
eventLogProxy.displayMore() eventLogProxy.displayMore()
} }
onAtYEndChanged: if (atYEnd && chat) { onAtYEndChanged: if (atYEnd && chat && count !== 0) {
chat.core.lMarkAsRead() chat.core.lMarkAsRead()
} }
@ -86,10 +86,13 @@ ListView {
onModelAboutToBeReset: { onModelAboutToBeReset: {
loading = true loading = true
} }
onModelReset: { onModelUpdated: {
loading = false loading = false
var index = eventLogProxy.findFirstUnreadIndex() var index = eventLogProxy.findFirstUnreadIndex()
mainItem.positionViewAtIndex(index, ListView.Contain) var itemToSelect = mainItem.itemAtIndex(index)
mainItem.positionViewAtIndex(index, ListView.Beginning)
var lastMessage = itemAtIndex(0)
mainItem.lastItemVisible = lastMessage.isFullyVisible
eventLogProxy.markIndexAsRead(index) eventLogProxy.markIndexAsRead(index)
} }
onEventInsertedByUser: (index) => { onEventInsertedByUser: (index) => {