From b39f2406c6a520f0b3743324744f3c55914adc52 Mon Sep 17 00:00:00 2001 From: Berthold Stoeger Date: Fri, 30 Aug 2019 16:51:59 +0200 Subject: Map: don't fully reset model on selection change When changing the selection the MapLocationModel was reset. This lead to crashes on Qt-5.9 which are due to QML accessing data that was freed during model reset. This putative Qt bug doesn't happen on newer Qt versions. At least Qt-5.12 is known to work. Instead of fighting the bug, let's simply not reset the model but send a dataChanged() for every element of the MapLocationModel. Signed-off-by: Berthold Stoeger --- qt-models/maplocationmodel.cpp | 9 +++++++++ qt-models/maplocationmodel.h | 1 + 2 files changed, 10 insertions(+) (limited to 'qt-models') diff --git a/qt-models/maplocationmodel.cpp b/qt-models/maplocationmodel.cpp index 0fe86f596..ea7d4f098 100644 --- a/qt-models/maplocationmodel.cpp +++ b/qt-models/maplocationmodel.cpp @@ -150,6 +150,15 @@ static bool hasSelectedDive(const dive_site *ds) [] (const dive *d) { return d->selected; }); } +void MapLocationModel::selectionChanged() +{ + if (m_mapLocations.isEmpty()) + return; + for(MapLocation *m: m_mapLocations) + m->m_selected = m_selectedDs.contains(m->divesite()); + emit dataChanged(createIndex(0, 0), createIndex(m_mapLocations.size() - 1, 0)); +} + void MapLocationModel::reload(QObject *map) { beginResetModel(); diff --git a/qt-models/maplocationmodel.h b/qt-models/maplocationmodel.h index 8cec08818..25ae159bd 100644 --- a/qt-models/maplocationmodel.h +++ b/qt-models/maplocationmodel.h @@ -67,6 +67,7 @@ public: void add(MapLocation *); // If map is not null, it will be used to place new dive sites without GPS location at the center of the map void reload(QObject *map); + void selectionChanged(); MapLocation *getMapLocation(const struct dive_site *ds); const QVector &selectedDs() const; Q_INVOKABLE void setSelected(struct dive_site *ds); -- cgit v1.2.3-70-g09d2