From 6183d116e4258917972776dcc220967e19ade2dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Blin?= <sebastien.blin@savoirfairelinux.com> Date: Tue, 24 Jan 2023 13:38:10 -0500 Subject: [PATCH] messagelistmodel: rework moveMessages() 1. sourceParent and destinationParent were incorrect. 2. Moving always all the message can be incorrect if parentIdx > msgIdx after a merge Change-Id: I0ab8eeabb61926d5c0c22d8fed68c60d54178bf6 GitLab: #939 --- src/libclient/messagelistmodel.cpp | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/src/libclient/messagelistmodel.cpp b/src/libclient/messagelistmodel.cpp index b1a2c2528..fe0a00fbf 100644 --- a/src/libclient/messagelistmodel.cpp +++ b/src/libclient/messagelistmodel.cpp @@ -288,17 +288,26 @@ MessageListModel::moveMessage(const QString& msgId, const QString& parentId) } } + auto endIdx = currentIndex; + auto pId = msgId; + // move a message int newIndex = indexOfMessage(parentId) + 1; if (newIndex >= interactions_.size()) { newIndex = interactions_.size() - 1; + // If we can move all the messages after the current one, we can do it directly + childMessageIdToMove.clear(); + endIdx = std::max(endIdx, newIndex - 1); } if (currentIndex == newIndex || newIndex == -1) return; // Pretty every messages is moved - moveMessages(currentIndex, interactions_.size() - 1, newIndex); + moveMessages(currentIndex, endIdx, newIndex); + // move a child message + if (!childMessageIdToMove.isEmpty()) + moveMessage(childMessageIdToMove, msgId); } void @@ -349,21 +358,14 @@ MessageListModel::removeMessage(int index, iterator it) void MessageListModel::moveMessages(int from, int last, int to) { - auto resetModel = (from <= 2 && last == interactions_.size() - 1); if (last < from) return; - if (resetModel) { - Q_EMIT beginResetModel(); - } else { - Q_EMIT beginMoveRows(QModelIndex(), from, last, QModelIndex(), to); - } + QModelIndex sourceIndex = QAbstractListModel::index(from, 0); + QModelIndex destinationIndex = QAbstractListModel::index(to, 0); + Q_EMIT beginMoveRows(sourceIndex, from, last, destinationIndex, to); for (int i = 0; i < (last - from); ++i) interactions_.move(last, to); - if (resetModel) { - Q_EMIT endResetModel(); - } else { - Q_EMIT endMoveRows(); - } + Q_EMIT endMoveRows(); } bool -- GitLab