mirror of
				https://github.com/subsurface/subsurface.git
				synced 2025-02-19 22:16:15 +00:00 
			
		
		
		
	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>
This commit is contained in:
		
							parent
							
								
									0096284a8e
								
							
						
					
					
						commit
						6193aef9ac
					
				
					 4 changed files with 13 additions and 2 deletions
				
			
		|  | @ -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) | ||||
| 						} | ||||
| 					} | ||||
|  |  | |||
|  | @ -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(); | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -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(); | ||||
|  |  | |||
|  | @ -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; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue