From 6193aef9ac7678a66748d6cd410e387024cc16cb Mon Sep 17 00:00:00 2001 From: Jan Mulder Date: Sun, 7 Jan 2018 16:08:25 +0100 Subject: 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 --- qt-models/divelistmodel.cpp | 10 ++++++++++ qt-models/divelistmodel.h | 1 + 2 files changed, 11 insertions(+) (limited to 'qt-models') 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 roleNames() const; QString startAddDive(); + void resetInternalData(); Q_INVOKABLE DiveObjectHelper* at(int i); private: QList m_dives; -- cgit v1.2.3-70-g09d2