mirror of
				https://github.com/subsurface/subsurface.git
				synced 2025-02-19 22:16:15 +00:00 
			
		
		
		
	Core: add trip_table parameter to trip-functions
Currently trips are added to the global trip table. If we want to make dive-import undoable, we should be able to parse trips of a log-file into a distinct table. Therefore, add a trip_table parameter to - insert_trip() - create_and_hookup_trip_from_dive() - autogroup_dives() - unregister_trip() - remove_dive_from_trip() Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
This commit is contained in:
		
							parent
							
								
									7df8d8c888
								
							
						
					
					
						commit
						ec37c71f5e
					
				
					 9 changed files with 45 additions and 46 deletions
				
			
		|  | @ -411,8 +411,8 @@ extern void add_dive_to_trip(struct dive *, dive_trip_t *); | |||
| struct dive *unregister_dive(int idx); | ||||
| extern void delete_single_dive(int idx); | ||||
| 
 | ||||
| extern void insert_trip(dive_trip_t *trip); | ||||
| extern void unregister_trip(dive_trip_t *trip); | ||||
| extern void insert_trip(dive_trip_t *trip, struct trip_table *trip_table); | ||||
| extern void unregister_trip(dive_trip_t *trip, struct trip_table *trip_table); | ||||
| extern void free_trip(dive_trip_t *trip); | ||||
| extern timestamp_t trip_date(const struct dive_trip *trip); | ||||
| 
 | ||||
|  |  | |||
|  | @ -16,13 +16,13 @@ | |||
|  * int init_decompression(struct dive *dive) | ||||
|  * void update_cylinder_related_info(struct dive *dive) | ||||
|  * void dump_trip_list(void) | ||||
|  * void insert_trip(dive_trip_t *dive_trip_p) | ||||
|  * void unregister_trip(dive_trip_t *trip) | ||||
|  * void insert_trip(dive_trip_t *dive_trip_p, struct trip_table *trip_table) | ||||
|  * void unregister_trip(dive_trip_t *trip, struct trip_table *table) | ||||
|  * void free_trip(dive_trip_t *trip) | ||||
|  * void remove_dive_from_trip(struct dive *dive) | ||||
|  * struct dive_trip *unregister_dive_from_trip(struct dive *dive) | ||||
|  * void remove_dive_from_trip(struct dive *dive, struct trip_table *trip_table) | ||||
|  * struct dive_trip *unregister_dive_from_trip(struct dive *dive, struct trip_table *trip_table) | ||||
|  * void add_dive_to_trip(struct dive *dive, dive_trip_t *trip) | ||||
|  * dive_trip_t *create_and_hookup_trip_from_dive(struct dive *dive) | ||||
|  * dive_trip_t *create_and_hookup_trip_from_dive(struct dive *dive, struct trip_table *trip_table) | ||||
|  * dive_trip_t *get_dives_to_autogroup(sruct dive_table *table, int start, int *from, int *to, bool *allocated) | ||||
|  * dive_trip_t *get_trip_for_new_dive(struct dive *new_dive, bool *allocated) | ||||
|  * void combine_trips(struct dive_trip *trip_a, struct dive_trip *trip_b) | ||||
|  | @ -987,17 +987,17 @@ struct dive_trip *unregister_dive_from_trip(struct dive *dive) | |||
| 	return trip; | ||||
| } | ||||
| 
 | ||||
| static void delete_trip(dive_trip_t *trip) | ||||
| static void delete_trip(dive_trip_t *trip, struct trip_table *trip_table) | ||||
| { | ||||
| 	unregister_trip(trip); | ||||
| 	unregister_trip(trip, trip_table); | ||||
| 	free_trip(trip); | ||||
| } | ||||
| 
 | ||||
| void remove_dive_from_trip(struct dive *dive) | ||||
| void remove_dive_from_trip(struct dive *dive, struct trip_table *trip_table) | ||||
| { | ||||
| 	struct dive_trip *trip = unregister_dive_from_trip(dive); | ||||
| 	if (trip && trip->dives.nr == 0) | ||||
| 		delete_trip(trip); | ||||
| 		delete_trip(trip, trip_table); | ||||
| } | ||||
| 
 | ||||
| /* Add dive to a trip. Caller is responsible for removing dive
 | ||||
|  | @ -1020,10 +1020,10 @@ dive_trip_t *alloc_trip(void) | |||
| } | ||||
| 
 | ||||
| /* insert the trip into the trip table */ | ||||
| void insert_trip(dive_trip_t *dive_trip) | ||||
| void insert_trip(dive_trip_t *dive_trip, struct trip_table *trip_table) | ||||
| { | ||||
| 	int idx = trip_table_get_insertion_index(&trip_table, dive_trip); | ||||
| 	add_to_trip_table(&trip_table, idx, dive_trip); | ||||
| 	int idx = trip_table_get_insertion_index(trip_table, dive_trip); | ||||
| 	add_to_trip_table(trip_table, idx, dive_trip); | ||||
| #ifdef DEBUG_TRIP | ||||
| 	dump_trip_list(); | ||||
| #endif | ||||
|  | @ -1039,25 +1039,25 @@ dive_trip_t *create_trip_from_dive(struct dive *dive) | |||
| 	return trip; | ||||
| } | ||||
| 
 | ||||
| dive_trip_t *create_and_hookup_trip_from_dive(struct dive *dive) | ||||
| dive_trip_t *create_and_hookup_trip_from_dive(struct dive *dive, struct trip_table *trip_table) | ||||
| { | ||||
| 	dive_trip_t *dive_trip = alloc_trip(); | ||||
| 
 | ||||
| 	dive_trip = create_trip_from_dive(dive); | ||||
| 
 | ||||
| 	add_dive_to_trip(dive, dive_trip); | ||||
| 	insert_trip(dive_trip); | ||||
| 	insert_trip(dive_trip, trip_table); | ||||
| 	return dive_trip; | ||||
| } | ||||
| 
 | ||||
| /* remove trip from the trip-list, but don't free its memory.
 | ||||
|  * caller takes ownership of the trip. */ | ||||
| void unregister_trip(dive_trip_t *trip) | ||||
| void unregister_trip(dive_trip_t *trip, struct trip_table *trip_table) | ||||
| { | ||||
| 	int idx = get_idx_in_trip_table(&trip_table, trip); | ||||
| 	int idx = get_idx_in_trip_table(trip_table, trip); | ||||
| 	assert(!trip->dives.nr); | ||||
| 	if (idx >= 0) | ||||
| 		remove_from_trip_table(&trip_table, idx); | ||||
| 		remove_from_trip_table(trip_table, idx); | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  | @ -1159,7 +1159,7 @@ dive_trip_t *get_dives_to_autogroup(struct dive_table *table, int start, int *fr | |||
|  * Walk the dives from the oldest dive in the given table, and see if we | ||||
|  * can autogroup them. But only do this when the user selected autogrouping. | ||||
|  */ | ||||
| static void autogroup_dives(struct dive_table *table) | ||||
| static void autogroup_dives(struct dive_table *table, struct trip_table *trip_table) | ||||
| { | ||||
| 	int from, to; | ||||
| 	dive_trip_t *trip; | ||||
|  | @ -1169,14 +1169,14 @@ static void autogroup_dives(struct dive_table *table) | |||
| 	if (!autogroup) | ||||
| 		return; | ||||
| 
 | ||||
| 	for (i = 0; (trip = get_dives_to_autogroup(&dive_table, i, &from, &to, &alloc)) != NULL; i = to) { | ||||
| 	for (i = 0; (trip = get_dives_to_autogroup(table, i, &from, &to, &alloc)) != NULL; i = to) { | ||||
| 		for (j = from; j < to; ++j) | ||||
| 			add_dive_to_trip(get_dive(j), trip); | ||||
| 			add_dive_to_trip(table->dives[j], trip); | ||||
| 		/* If this was newly allocated, add trip to list */ | ||||
| 		if (alloc) | ||||
| 			insert_trip(trip); | ||||
| 			insert_trip(trip, trip_table); | ||||
| 	} | ||||
| 	sort_trip_table(&trip_table); | ||||
| 	sort_trip_table(trip_table); | ||||
| #ifdef DEBUG_TRIP | ||||
| 	dump_trip_list(); | ||||
| #endif | ||||
|  | @ -1216,7 +1216,7 @@ void delete_single_dive(int idx) | |||
| 		return; /* this should never happen */ | ||||
| 	if (dive->selected) | ||||
| 		deselect_dive(dive); | ||||
| 	remove_dive_from_trip(dive); | ||||
| 	remove_dive_from_trip(dive, &trip_table); | ||||
| 	delete_dive_from_table(&dive_table, idx); | ||||
| } | ||||
| 
 | ||||
|  | @ -1430,7 +1430,7 @@ void process_loaded_dives() | |||
| 	sort_trip_table(&trip_table); | ||||
| 
 | ||||
| 	/* Autogroup dives if desired by user. */ | ||||
| 	autogroup_dives(&dive_table); | ||||
| 	autogroup_dives(&dive_table, &trip_table); | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  | @ -1472,10 +1472,10 @@ static void merge_imported_dives(struct dive_table *table) | |||
|  * will be deleted. On failure, they are untouched. | ||||
|  * If "prefer_imported" is true, use data of the new dive. | ||||
|  */ | ||||
| static bool try_to_merge_into(struct dive *dive_to_add, int idx, bool prefer_imported) | ||||
| static bool try_to_merge_into(struct dive *dive_to_add, struct trip_table *dive_to_add_trip_table, | ||||
| 			      int idx, bool prefer_imported) | ||||
| { | ||||
| 	struct dive *old_dive = dive_table.dives[idx]; | ||||
| 	struct dive_trip *trip = old_dive->divetrip; | ||||
| 	struct dive *merged = try_to_merge(old_dive, dive_to_add, prefer_imported); | ||||
| 	if (!merged) | ||||
| 		return false; | ||||
|  | @ -1483,10 +1483,9 @@ static bool try_to_merge_into(struct dive *dive_to_add, int idx, bool prefer_imp | |||
| 	merged->id = old_dive->id; | ||||
| 	merged->selected = old_dive->selected; | ||||
| 	dive_table.dives[idx] = merged; | ||||
| 	if (trip) | ||||
| 		remove_dive_from_trip(old_dive); | ||||
| 	remove_dive_from_trip(old_dive, &trip_table); | ||||
| 	free_dive(old_dive); | ||||
| 	remove_dive_from_trip(dive_to_add); | ||||
| 	remove_dive_from_trip(dive_to_add, dive_to_add_trip_table); | ||||
| 	free_dive(dive_to_add); | ||||
| 
 | ||||
| 	return true; | ||||
|  | @ -1546,7 +1545,7 @@ void process_imported_dives(struct dive_table *import_table, bool prefer_importe | |||
| 
 | ||||
| 		/* Try to merge into previous dive. */ | ||||
| 		if (j > 0 && dive_endtime(dive_table.dives[j - 1]) > dive_to_add->when) { | ||||
| 			if (try_to_merge_into(dive_to_add, j - 1, prefer_imported)) | ||||
| 			if (try_to_merge_into(dive_to_add, &trip_table, j - 1, prefer_imported)) | ||||
| 				continue; | ||||
| 		} | ||||
| 
 | ||||
|  | @ -1558,7 +1557,7 @@ void process_imported_dives(struct dive_table *import_table, bool prefer_importe | |||
| 
 | ||||
| 		/* Try to merge into next dive. */ | ||||
| 		if (dive_endtime(dive_to_add) > dive_table.dives[j]->when) { | ||||
| 			if (try_to_merge_into(dive_to_add, j, prefer_imported)) | ||||
| 			if (try_to_merge_into(dive_to_add, &trip_table, j, prefer_imported)) | ||||
| 				continue; | ||||
| 		} | ||||
| 
 | ||||
|  | @ -1580,7 +1579,7 @@ void process_imported_dives(struct dive_table *import_table, bool prefer_importe | |||
| 		try_to_renumber(preexisting); | ||||
| 
 | ||||
| 	/* Autogroup dives if desired by user. */ | ||||
| 	autogroup_dives(&dive_table); | ||||
| 	autogroup_dives(&dive_table, &trip_table); | ||||
| 
 | ||||
| 	/* Trips may have changed - make sure that they are still ordered */ | ||||
| 	sort_trip_table(&trip_table); | ||||
|  |  | |||
|  | @ -28,10 +28,10 @@ extern void get_dive_gas(const struct dive *dive, int *o2_p, int *he_p, int *o2l | |||
| extern int get_divenr(const struct dive *dive); | ||||
| extern int get_divesite_idx(const struct dive_site *ds); | ||||
| extern struct dive_trip *unregister_dive_from_trip(struct dive *dive); | ||||
| extern void remove_dive_from_trip(struct dive *dive); | ||||
| extern void remove_dive_from_trip(struct dive *dive, struct trip_table *trip_table); | ||||
| extern dive_trip_t *alloc_trip(void); | ||||
| extern dive_trip_t *create_trip_from_dive(struct dive *dive); | ||||
| extern dive_trip_t *create_and_hookup_trip_from_dive(struct dive *dive); | ||||
| extern dive_trip_t *create_and_hookup_trip_from_dive(struct dive *dive, struct trip_table *trip_table); | ||||
| extern dive_trip_t *get_dives_to_autogroup(struct dive_table *table, int start, int *from, int *to, bool *allocated); | ||||
| extern dive_trip_t *get_trip_for_new_dive(struct dive *new_dive, bool *allocated); | ||||
| extern bool consecutive_selected(); | ||||
|  |  | |||
|  | @ -826,7 +826,7 @@ static int dive_cb(const unsigned char *data, unsigned int size, | |||
| 
 | ||||
| 	if (devdata->create_new_trip) { | ||||
| 		if (!devdata->trip) | ||||
| 			devdata->trip = create_and_hookup_trip_from_dive(dive); | ||||
| 			devdata->trip = create_and_hookup_trip_from_dive(dive, &trip_table); | ||||
| 		else | ||||
| 			add_dive_to_trip(dive, devdata->trip); | ||||
| 	} | ||||
|  |  | |||
|  | @ -1178,7 +1178,7 @@ static void finish_active_trip(void) | |||
| 
 | ||||
| 	if (trip) { | ||||
| 		active_trip = NULL; | ||||
| 		insert_trip(trip); | ||||
| 		insert_trip(trip, &trip_table); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -278,7 +278,7 @@ void trip_end(struct parser_state *state) | |||
| { | ||||
| 	if (!state->cur_trip) | ||||
| 		return; | ||||
| 	insert_trip(state->cur_trip); | ||||
| 	insert_trip(state->cur_trip, &trip_table); | ||||
| 	state->cur_trip = NULL; | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -215,7 +215,7 @@ static void record_uemis_dive(device_data_t *devdata, struct dive *dive) | |||
| { | ||||
| 	if (devdata->create_new_trip) { | ||||
| 		if (!devdata->trip) | ||||
| 			devdata->trip = create_and_hookup_trip_from_dive(dive); | ||||
| 			devdata->trip = create_and_hookup_trip_from_dive(dive, &trip_table); | ||||
| 		else | ||||
| 			add_dive_to_trip(dive, devdata->trip); | ||||
| 	} | ||||
|  | @ -859,7 +859,7 @@ static bool uemis_delete_dive(device_data_t *devdata, uint32_t diveid) | |||
| 	if (dive) { | ||||
| 		devdata->download_table->dives[--devdata->download_table->nr] = NULL; | ||||
| 		if (dive->notrip) | ||||
| 			remove_dive_from_trip(dive); | ||||
| 			remove_dive_from_trip(dive, &trip_table); | ||||
| 
 | ||||
| 		free(dive->dc.sample); | ||||
| 		free((void *)dive->notes); | ||||
|  |  | |||
|  | @ -68,7 +68,7 @@ DiveToAdd DiveListBase::removeDive(struct dive *d, std::vector<OwningTripPtr> &t | |||
| 	// remove the whole trip.
 | ||||
| 	res.trip = unregister_dive_from_trip(d); | ||||
| 	if (res.trip && res.trip->dives.nr == 0) { | ||||
| 		unregister_trip(res.trip);		// Remove trip from backend
 | ||||
| 		unregister_trip(res.trip, &trip_table);	// Remove trip from backend
 | ||||
| 		tripsToAdd.emplace_back(res.trip);	// Take ownership of trip
 | ||||
| 	} | ||||
| 
 | ||||
|  | @ -164,7 +164,7 @@ std::vector<dive *> DiveListBase::addDives(DivesAndTripsToAdd &toAdd) | |||
| 	addedTrips.reserve(toAdd.trips.size()); | ||||
| 	for (OwningTripPtr &trip: toAdd.trips) { | ||||
| 		addedTrips.push_back(trip.get()); | ||||
| 		insert_trip(trip.release()); // Return ownership to backend
 | ||||
| 		insert_trip(trip.release(), &trip_table); // Return ownership to backend
 | ||||
| 	} | ||||
| 	toAdd.trips.clear(); | ||||
| 
 | ||||
|  | @ -229,7 +229,7 @@ static OwningTripPtr moveDiveToTrip(DiveToTrip &diveToTrip) | |||
| 	// Remove dive from trip - if this is the last dive in the trip, remove the whole trip.
 | ||||
| 	dive_trip *trip = unregister_dive_from_trip(diveToTrip.dive); | ||||
| 	if (trip && trip->dives.nr == 0) { | ||||
| 		unregister_trip(trip);		// Remove trip from backend
 | ||||
| 		unregister_trip(trip, &trip_table);	// Remove trip from backend
 | ||||
| 		res.reset(trip); | ||||
| 	} | ||||
| 
 | ||||
|  | @ -257,7 +257,7 @@ static void moveDivesBetweenTrips(DivesToTrip &dives) | |||
| 	for (OwningTripPtr &trip: dives.tripsToAdd) { | ||||
| 		dive_trip *t = trip.release();	// Give up ownership
 | ||||
| 		createdTrips.push_back(t); | ||||
| 		insert_trip(t);	// Return ownership to backend
 | ||||
| 		insert_trip(t, &trip_table);	// Return ownership to backend
 | ||||
| 	} | ||||
| 	dives.tripsToAdd.clear(); | ||||
| 
 | ||||
|  |  | |||
|  | @ -1280,7 +1280,7 @@ bool QMLManager::undoDelete(int id) | |||
| 		return false; | ||||
| 	} | ||||
| 	if (deletedTrip) | ||||
| 		insert_trip(deletedTrip); | ||||
| 		insert_trip(deletedTrip, &trip_table); | ||||
| 	if (deletedDive->divetrip) { | ||||
| 		struct dive_trip *trip = deletedDive->divetrip; | ||||
| 		deletedDive->divetrip = NULL; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue