mirror of
				https://github.com/subsurface/subsurface.git
				synced 2025-02-19 22:16:15 +00:00 
			
		
		
		
	Dive pictures: don't update all images on drag&drop to profile
Gracefully handle drag & drop to the profile, which changes the offset of the pictures. To do this, keep the pictures in the DivePictureModel and the ProfileWidget2 sorted by offset and re-arrange if needed to keep the list sorted. This needs some code reshuffling. Introduce a helper-function that moves ranges in arrays. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
		
							parent
							
								
									0aaa1bf386
								
							
						
					
					
						commit
						9efb56e2d4
					
				
					 5 changed files with 174 additions and 38 deletions
				
			
		|  | @ -56,8 +56,14 @@ void DivePictureModel::updateDivePictures() | |||
| 	struct dive *dive; | ||||
| 	for_each_dive (i, dive) { | ||||
| 		if (dive->selected) { | ||||
| 			int first = pictures.count(); | ||||
| 			FOR_EACH_PICTURE(dive) | ||||
| 				pictures.push_back({picture, picture->filename, {}, picture->offset.seconds}); | ||||
| 				pictures.push_back({ dive->id, picture, picture->filename, {}, picture->offset.seconds }); | ||||
| 
 | ||||
| 			// Sort pictures of this dive by offset.
 | ||||
| 			// Thus, the list will be sorted by (diveId, offset).
 | ||||
| 			std::sort(pictures.begin() + first, pictures.end(), | ||||
| 				  [](const PictureEntry &a, const PictureEntry &b) { return a.offsetSeconds < b.offsetSeconds; }); | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
|  | @ -166,11 +172,39 @@ void DivePictureModel::updateThumbnail(QString filename, QImage thumbnail) | |||
| 	} | ||||
| } | ||||
| 
 | ||||
| void DivePictureModel::updateDivePictureOffset(const QString &filename, int offsetSeconds) | ||||
| void DivePictureModel::updateDivePictureOffset(int diveId, const QString &filename, int offsetSeconds) | ||||
| { | ||||
| 	int i = findPictureId(filename); | ||||
| 	if (i >= 0) { | ||||
| 		pictures[i].offsetSeconds = offsetSeconds; | ||||
| 		emit dataChanged(createIndex(i, 0), createIndex(i, 1)); | ||||
| 	// Find the pictures of the given dive.
 | ||||
| 	auto from = std::find_if(pictures.begin(), pictures.end(), [diveId](const PictureEntry &e) { return e.diveId == diveId; }); | ||||
| 	auto to = std::find_if(from, pictures.end(), [diveId](const PictureEntry &e) { return e.diveId != diveId; }); | ||||
| 
 | ||||
| 	// Find picture with the given filename
 | ||||
| 	auto oldPos = std::find_if(from, to, [filename](const PictureEntry &e) { return e.filename == filename; }); | ||||
| 	if (oldPos == to) | ||||
| 		return; | ||||
| 
 | ||||
| 	// Find new position
 | ||||
| 	auto newPos = std::find_if(from, to, [offsetSeconds](const PictureEntry &e) { return e.offsetSeconds > offsetSeconds; }); | ||||
| 
 | ||||
| 	// Update the offset here and in the backend
 | ||||
| 	oldPos->offsetSeconds = offsetSeconds; | ||||
| 	if (struct dive *dive = get_dive_by_uniq_id(diveId)) { | ||||
| 		FOR_EACH_PICTURE(dive) { | ||||
| 			if (picture->filename == filename) { | ||||
| 				picture->offset.seconds = offsetSeconds; | ||||
| 				mark_divelist_changed(true); | ||||
| 				break; | ||||
| 			} | ||||
| 		} | ||||
| 		copy_dive(current_dive, &displayed_dive); | ||||
| 	} | ||||
| 
 | ||||
| 	// Henceforth we will work with indices instead of iterators
 | ||||
| 	int oldIndex = oldPos - pictures.begin(); | ||||
| 	int newIndex = newPos - pictures.begin(); | ||||
| 	if (oldIndex == newIndex || oldIndex + 1 == newIndex) | ||||
| 		return; | ||||
| 	beginMoveRows(QModelIndex(), oldIndex, oldIndex, QModelIndex(), newIndex); | ||||
| 	moveInVector(pictures, oldIndex, oldIndex + 1, newIndex); | ||||
| 	endMoveRows(); | ||||
| } | ||||
|  |  | |||
|  | @ -7,6 +7,7 @@ | |||
| #include <QFuture> | ||||
| 
 | ||||
| struct PictureEntry { | ||||
| 	int diveId; | ||||
| 	struct picture *picture; | ||||
| 	QString filename; | ||||
| 	QImage image; | ||||
|  | @ -22,7 +23,7 @@ public: | |||
| 	virtual int rowCount(const QModelIndex &parent = QModelIndex()) const; | ||||
| 	virtual void updateDivePictures(); | ||||
| 	void removePictures(const QVector<QString> &fileUrls); | ||||
| 	void updateDivePictureOffset(const QString &filename, int offsetSeconds); | ||||
| 	void updateDivePictureOffset(int diveId, const QString &filename, int offsetSeconds); | ||||
| signals: | ||||
| 	void picturesRemoved(const QVector<QString> &fileUrls); | ||||
| public slots: | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue