Commit 9371a7c9 authored by David Edmundson's avatar David Edmundson

Fix model updates in RunnerMatchesModel

Summary:
RunnerMatchesModel is backed by a list. When this list changes
RunnerManagerModel add/removes the new number of rows then called
dataChanged on everything that remained.

It's a common pattern, but not a great one. Especially with QtQuick
where moving a delegate is faster than updating all the properties of an
existing one - unfortunately I can't find a nice solution to do this
properly in linear time.

The problem with the current code is we update the entire list in the
insert/remove rows. This is a violation of the model rules as we're
updating rows outside the rows listed inside begin/remove rows.

It works, but Qt's model test fails.

We also have a lot of duplicates of a crash in QtQuick after runner
model changes, bug 369430. I think it could be related, but can't
prove anything.

This patch updates the rows that exist in both the before and after
models before adding/removing the remaining rows.

BUG: 402439

Test Plan:
Added Qt model tester in https://phabricator.kde.org/P283
It now passes.

Reviewers: #plasma, hein

Reviewed By: #plasma, hein

Subscribers: hein, apol, plasma-devel

Tags: #plasma

Differential Revision: https://phabricator.kde.org/D17725
parent ee17fbac
......@@ -222,11 +222,14 @@ void RunnerMatchesModel::setMatches(const QList< Plasma::QueryMatch > &matches)
for (int row = 0; row < ceiling; ++row) {
if (!(m_matches.at(row) == matches.at(row))) {
emitDataChange = true;
break;
m_matches[row] = matches.at(row);
}
}
if (emitDataChange) {
emit dataChanged(index(0, 0), index(ceiling - 1, 0));
}
if (newCount > oldCount) {
beginInsertRows(QModelIndex(), oldCount, newCount - 1);
......@@ -241,12 +244,6 @@ void RunnerMatchesModel::setMatches(const QList< Plasma::QueryMatch > &matches)
endRemoveRows();
}
if (emitDataChange) {
m_matches = matches;
emit dataChanged(index(0, 0), index(ceiling - 1, 0));
}
if (emitCountChange) {
emit countChanged();
}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment