From d978f8de505976034b7ff185b1263df2ec81b953 Mon Sep 17 00:00:00 2001 From: Vlad Zahorodnii Date: Mon, 15 Sep 2025 18:15:56 +0000 Subject: [PATCH] Fix inserting UserListModel items without beginInsertRows() If an item is added, the corresponding code should be wrapped with beginInsertRows() and endInsertRows(), otherwise proxy or filter models can end up with corrupted internal state. m_members.insert() in refreshMember() should be unnecessary because if pos is not the same as m_members.size(), then it means there's already a member.id() item in the member list. (cherry picked from commit 161815acff0cc3204e4077ce31a7d63e682a8a8c) Co-authored-by: Vlad Zahorodnii --- src/libneochat/models/userlistmodel.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/libneochat/models/userlistmodel.cpp b/src/libneochat/models/userlistmodel.cpp index 63caf072c..00b064678 100644 --- a/src/libneochat/models/userlistmodel.cpp +++ b/src/libneochat/models/userlistmodel.cpp @@ -136,9 +136,13 @@ bool UserListModel::event(QEvent *event) void UserListModel::memberJoined(const Quotient::RoomMember &member) { - auto pos = findUserPos(member); - beginInsertRows(QModelIndex(), pos, pos); - m_members.insert(pos, member.id()); + if (m_members.contains(member.id())) { + return; + } + + const int row = m_members.size(); + beginInsertRows(QModelIndex(), row, row); + m_members.append(member.id()); endInsertRows(); } @@ -158,8 +162,6 @@ void UserListModel::refreshMember(const Quotient::RoomMember &member, const QLis { auto pos = findUserPos(member); if (pos != m_members.size()) { - // The update will have changed the state event so we need to insert the updated member object. - m_members.insert(pos, member.id()); Q_EMIT dataChanged(index(pos), index(pos), roles); } else { qWarning() << "Trying to access a room member not in the user list";