From 704462755146caff2df063771452a12bd81d22c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Blin?= <sebastien.blin@savoirfairelinux.com> Date: Wed, 11 Jan 2023 11:20:13 -0500 Subject: [PATCH] messagelistmodel: improve moveMessages + moveMessage was doing useless computation to move messages one by one even if blocks are supported + beginMoveRows/endMoveRows seems to do weird stuff if all the rows should be moved causing some crashes. beginReset in this case doesn't trigger this weird behaviour and is more efficient. Change-Id: Ia4eb3cdbbe74bf9215fb673cb9af571f67225ffe --- src/libclient/messagelistmodel.cpp | 28 ++++++++++++++++++---------- src/libclient/messagelistmodel.h | 2 +- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/src/libclient/messagelistmodel.cpp b/src/libclient/messagelistmodel.cpp index 614153bcb..b1a2c2528 100644 --- a/src/libclient/messagelistmodel.cpp +++ b/src/libclient/messagelistmodel.cpp @@ -297,12 +297,8 @@ MessageListModel::moveMessage(const QString& msgId, const QString& parentId) if (currentIndex == newIndex || newIndex == -1) return; - moveMessage(currentIndex, newIndex); - - // move a child message - if (!childMessageIdToMove.isEmpty()) { - moveMessage(childMessageIdToMove, msgId); - } + // Pretty every messages is moved + moveMessages(currentIndex, interactions_.size() - 1, newIndex); } void @@ -351,11 +347,23 @@ MessageListModel::removeMessage(int index, iterator it) } void -MessageListModel::moveMessage(int from, int to) +MessageListModel::moveMessages(int from, int last, int to) { - Q_EMIT beginMoveRows(QModelIndex(), from, from, QModelIndex(), to); - interactions_.move(from, to); - Q_EMIT endMoveRows(); + 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); + } + for (int i = 0; i < (last - from); ++i) + interactions_.move(last, to); + if (resetModel) { + Q_EMIT endResetModel(); + } else { + Q_EMIT endMoveRows(); + } } bool diff --git a/src/libclient/messagelistmodel.h b/src/libclient/messagelistmodel.h index a32a756cb..b79b2eefa 100644 --- a/src/libclient/messagelistmodel.h +++ b/src/libclient/messagelistmodel.h @@ -171,7 +171,7 @@ private: void insertMessage(int index, item_t& message); iterator insertMessage(iterator it, item_t& message); void removeMessage(int index, iterator it); - void moveMessage(int from, int to); + void moveMessages(int from, int last, int to); QTimer* timestampTimer_ {nullptr}; }; -- GitLab