summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Jan Mulder <jlmulder@xs4all.nl>2018-01-07 16:08:25 +0100
committerGravatar Jan Mulder <jlmulder@xs4all.nl>2018-01-10 20:34:16 +0100
commit6193aef9ac7678a66748d6cd410e387024cc16cb (patch)
treea756cf65533cf8ef87628faa93e2414a97144e05
parent0096284a8ef292012f2feab67db460057be6ad39 (diff)
downloadsubsurface-6193aef9ac7678a66748d6cd410e387024cc16cb.tar.gz
mobile: fix crash on delete dive from divelist
This is a somewhat hacky commit. For a very long time, the delete from the divelist on mobile crashed. That is, not always for anyone, but for me almost consistently. This commit tries to solve it. I found that trying to save the delete immediately after removing data from the underlying model seemed to cause the crash. Hacking around, I found that a simple beginResetModel/endResetModel between the delete of the underlying model data and actual save is sufficient to solve the crash. The big question is, why does this all work? I suspect some of race condition between deleting model data, and giving the QML engine the opportunity to do its thing. This is also related to issue #311, but that is not implemented here. Signed-off-by: Jan Mulder <jlmulder@xs4all.nl>
-rw-r--r--mobile-widgets/qml/DiveList.qml3
-rw-r--r--mobile-widgets/qmlmanager.cpp1
-rw-r--r--qt-models/divelistmodel.cpp10
-rw-r--r--qt-models/divelistmodel.h1
4 files changed, 13 insertions, 2 deletions
diff --git a/mobile-widgets/qml/DiveList.qml b/mobile-widgets/qml/DiveList.qml
index 263820a46..5953c1f86 100644
--- a/mobile-widgets/qml/DiveList.qml
+++ b/mobile-widgets/qml/DiveList.qml
@@ -162,9 +162,8 @@ Kirigami.ScrollablePage {
anchors.fill: parent
enabled: parent.visible
onClicked: {
- parent.visible = false
+ deleteButtonVisible = false
timer.stop()
- detailsWindow.showDiveIndex(index)
manager.deleteDive(dive.id)
}
}
diff --git a/mobile-widgets/qmlmanager.cpp b/mobile-widgets/qmlmanager.cpp
index 296243f7e..91c73752c 100644
--- a/mobile-widgets/qmlmanager.cpp
+++ b/mobile-widgets/qmlmanager.cpp
@@ -1244,6 +1244,7 @@ void QMLManager::deleteDive(int id)
}
DiveListModel::instance()->removeDiveById(id);
delete_single_dive(get_idx_by_uniq_id(id));
+ DiveListModel::instance()->resetInternalData();
changesNeedSaving();
}
diff --git a/qt-models/divelistmodel.cpp b/qt-models/divelistmodel.cpp
index b28bd58a3..b9fb99b1b 100644
--- a/qt-models/divelistmodel.cpp
+++ b/qt-models/divelistmodel.cpp
@@ -108,6 +108,16 @@ void DiveListModel::clear()
}
}
+void DiveListModel::resetInternalData()
+{
+ // this is a hack. There is a long standing issue, that seems related to a
+ // sync problem between QML engine and underlying model data. It causes delete
+ // from divelist (on mobile) to crash. But not always. This function is part of
+ // an attempt to fix this. See commit.
+ beginResetModel();
+ endResetModel();
+}
+
int DiveListModel::rowCount(const QModelIndex &) const
{
return m_dives.count();
diff --git a/qt-models/divelistmodel.h b/qt-models/divelistmodel.h
index 41bc9107c..3dc3d74e4 100644
--- a/qt-models/divelistmodel.h
+++ b/qt-models/divelistmodel.h
@@ -46,6 +46,7 @@ public:
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
QHash<int, QByteArray> roleNames() const;
QString startAddDive();
+ void resetInternalData();
Q_INVOKABLE DiveObjectHelper* at(int i);
private:
QList<DiveObjectHelper*> m_dives;