mirror of
				https://github.com/subsurface/subsurface.git
				synced 2025-02-19 22:16:15 +00:00 
			
		
		
		
	filter: implement importing of filter presets
When importing a divelog, import filter presets. If there are equal names, import only if the presets differ. In that case, disambiguate the name. This made things a bit more complicated, as comparison of filter presets had to be implemented. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
This commit is contained in:
		
							parent
							
								
									631be569fe
								
							
						
					
					
						commit
						f9721fce4b
					
				
					 14 changed files with 81 additions and 13 deletions
				
			
		|  | @ -17,9 +17,10 @@ void addDive(dive *d, bool autogroup, bool newNumber) | |||
| 	execute(new AddDive(d, autogroup, newNumber)); | ||||
| } | ||||
| 
 | ||||
| void importDives(struct dive_table *dives, struct trip_table *trips, struct dive_site_table *sites, int flags, const QString &source) | ||||
| void importDives(struct dive_table *dives, struct trip_table *trips, struct dive_site_table *sites, | ||||
| 		 filter_preset_table_t *presets, int flags, const QString &source) | ||||
| { | ||||
| 	execute(new ImportDives(dives, trips, sites, flags, source)); | ||||
| 	execute(new ImportDives(dives, trips, sites, presets, flags, source)); | ||||
| } | ||||
| 
 | ||||
| void deleteDive(const QVector<struct dive*> &divesToDelete) | ||||
|  |  | |||
|  | @ -3,6 +3,7 @@ | |||
| #define COMMAND_H | ||||
| 
 | ||||
| #include "core/dive.h" | ||||
| #include "core/filterpreset.h" | ||||
| #include "core/pictureobj.h" | ||||
| #include <QVector> | ||||
| #include <QAction> | ||||
|  | @ -32,7 +33,8 @@ QString changesMade();			// return a string with the texts from all commands on | |||
| // insertion position.
 | ||||
| void addDive(dive *d, bool autogroup, bool newNumber); | ||||
| void importDives(struct dive_table *dives, struct trip_table *trips, | ||||
| 		 struct dive_site_table *sites, int flags, const QString &source); // The tables are consumed!
 | ||||
| 		 struct dive_site_table *sites, filter_preset_table_t *filter_presets, | ||||
| 		 int flags, const QString &source); // The tables are consumed!
 | ||||
| void deleteDive(const QVector<struct dive*> &divesToDelete); | ||||
| void shiftTime(const std::vector<dive *> &changedDives, int amount); | ||||
| void renumberDives(const QVector<QPair<dive *, int>> &divesToRenumber); | ||||
|  |  | |||
|  | @ -469,7 +469,8 @@ void AddDive::undoit() | |||
| 	setSelection(selection, currentDive); | ||||
| } | ||||
| 
 | ||||
| ImportDives::ImportDives(struct dive_table *dives, struct trip_table *trips, struct dive_site_table *sites, int flags, const QString &source) | ||||
| ImportDives::ImportDives(struct dive_table *dives, struct trip_table *trips, struct dive_site_table *sites, | ||||
| 			 filter_preset_table_t *filter_presets, int flags, const QString &source) | ||||
| { | ||||
| 	setText(Command::Base::tr("import %n dive(s) from %1", "", dives->nr).arg(source)); | ||||
| 
 | ||||
|  | @ -509,6 +510,22 @@ ImportDives::ImportDives(struct dive_table *dives, struct trip_table *trips, str | |||
| 	divesAndSitesToRemove.dives.reserve(dives_to_remove.nr); | ||||
| 	for (int i = 0; i < dives_to_remove.nr; ++i) | ||||
| 		divesAndSitesToRemove.dives.push_back(dives_to_remove.dives[i]); | ||||
| 
 | ||||
| 	// When encountering filter presets with equal names, check whether they are
 | ||||
| 	// the same. If they are, ignore them.
 | ||||
| 	if (filter_presets) { | ||||
| 		for (const filter_preset &preset: *filter_presets) { | ||||
| 			QString name = preset.name; | ||||
| 			auto it = std::find_if(filter_preset_table.begin(), filter_preset_table.end(), | ||||
| 					       [&name](const filter_preset &preset) { return preset.name == name; }); | ||||
| 			if (it != filter_preset_table.end() && it->data == preset.data) | ||||
| 				continue; | ||||
| 			filterPresetsToAdd.emplace_back(preset.name, preset.data); | ||||
| 		} | ||||
| 
 | ||||
| 		// Consume the table for analogy with the other tables.
 | ||||
| 		filter_presets->clear(); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| bool ImportDives::workToBeDone() | ||||
|  | @ -532,6 +549,13 @@ void ImportDives::redoit() | |||
| 
 | ||||
| 	// Remember dives and sites to remove
 | ||||
| 	divesAndSitesToRemove = std::move(divesAndSitesToRemoveNew); | ||||
| 
 | ||||
| 	// Add new filter presets
 | ||||
| 	for (auto &it: filterPresetsToAdd) { | ||||
| 		filterPresetsToRemove.push_back(filter_preset_add(it.first, it.second)); | ||||
| 		emit diveListNotifier.filterPresetAdded(filterPresetsToRemove.back()); | ||||
| 	} | ||||
| 	filterPresetsToAdd.clear(); | ||||
| } | ||||
| 
 | ||||
| void ImportDives::undoit() | ||||
|  | @ -547,6 +571,18 @@ void ImportDives::undoit() | |||
| 
 | ||||
| 	// ...and restore the selection
 | ||||
| 	setSelection(selection, currentDive); | ||||
| 
 | ||||
| 	// Remove filter presets. Do this in reverse order.
 | ||||
| 	for (auto it = filterPresetsToRemove.rbegin(); it != filterPresetsToRemove.rend(); ++it) { | ||||
| 		int index = *it; | ||||
| 		QString oldName = filter_preset_name_qstring(index); | ||||
| 		FilterData oldData = filter_preset_get(index); | ||||
| 		filter_preset_delete(index); | ||||
| 		emit diveListNotifier.filterPresetRemoved(index); | ||||
| 		filterPresetsToAdd.emplace_back(oldName, oldData); | ||||
| 	} | ||||
| 	filterPresetsToRemove.clear(); | ||||
| 	std::reverse(filterPresetsToAdd.begin(), filterPresetsToAdd.end()); | ||||
| } | ||||
| 
 | ||||
| DeleteDive::DeleteDive(const QVector<struct dive*> &divesToDeleteIn) | ||||
|  |  | |||
|  | @ -5,6 +5,7 @@ | |||
| #define COMMAND_DIVELIST_H | ||||
| 
 | ||||
| #include "command_base.h" | ||||
| #include "core/filterpreset.h" | ||||
| 
 | ||||
| #include <QVector> | ||||
| 
 | ||||
|  | @ -97,7 +98,8 @@ private: | |||
| class ImportDives : public DiveListBase { | ||||
| public: | ||||
| 	// Note: dives and trips are consumed - after the call they will be empty.
 | ||||
| 	ImportDives(struct dive_table *dives, struct trip_table *trips, struct dive_site_table *sites, int flags, const QString &source); | ||||
| 	ImportDives(struct dive_table *dives, struct trip_table *trips, struct dive_site_table *sites, | ||||
| 		    filter_preset_table_t *filter_presets, int flags, const QString &source); | ||||
| private: | ||||
| 	void undoit() override; | ||||
| 	void redoit() override; | ||||
|  | @ -109,11 +111,14 @@ private: | |||
| 
 | ||||
| 	// For redo
 | ||||
| 	std::vector<OwningDiveSitePtr>	sitesToAdd; | ||||
| 	std::vector<std::pair<QString,FilterData>> | ||||
| 					filterPresetsToAdd; | ||||
| 
 | ||||
| 	// For undo
 | ||||
| 	std::vector<dive_site *>	sitesToRemove; | ||||
| 	std::vector<dive *>	selection; | ||||
| 	dive *			currentDive; | ||||
| 	std::vector<dive *>		selection; | ||||
| 	dive				*currentDive; | ||||
| 	std::vector<int>		filterPresetsToRemove; | ||||
| }; | ||||
| 
 | ||||
| class DeleteDive : public DiveListBase { | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue