mirror of
				https://github.com/subsurface/subsurface.git
				synced 2025-02-19 22:16:15 +00:00 
			
		
		
		
	Fix a crash when changing sort column
We were using the tree model to check the selection, even though the active model is the list model after switching to a different sort column. To make things clearer I renamed the access macros to be more consistent. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
		
							parent
							
								
									ea2900a34a
								
							
						
					
					
						commit
						22ff8df880
					
				
					 1 changed files with 82 additions and 80 deletions
				
			
		
							
								
								
									
										162
									
								
								divelist.c
									
										
									
									
									
								
							
							
						
						
									
										162
									
								
								divelist.c
									
										
									
									
									
								
							|  | @ -31,9 +31,11 @@ struct DiveList { | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| static struct DiveList dive_list; | static struct DiveList dive_list; | ||||||
|  | #define MODEL(_dl) GTK_TREE_MODEL((_dl).model) | ||||||
| #define TREEMODEL(_dl) GTK_TREE_MODEL((_dl).treemodel) | #define TREEMODEL(_dl) GTK_TREE_MODEL((_dl).treemodel) | ||||||
| #define TREESTORE(_dl) GTK_TREE_STORE((_dl).treemodel) |  | ||||||
| #define LISTMODEL(_dl) GTK_TREE_MODEL((_dl).listmodel) | #define LISTMODEL(_dl) GTK_TREE_MODEL((_dl).listmodel) | ||||||
|  | #define STORE(_dl) GTK_TREE_STORE((_dl).model) | ||||||
|  | #define TREESTORE(_dl) GTK_TREE_STORE((_dl).treemodel) | ||||||
| #define LISTSTORE(_dl) GTK_TREE_STORE((_dl).listmodel) | #define LISTSTORE(_dl) GTK_TREE_STORE((_dl).listmodel) | ||||||
| 
 | 
 | ||||||
| GList *dive_trip_list; | GList *dive_trip_list; | ||||||
|  | @ -130,7 +132,7 @@ static void first_leaf(GtkTreeModel *model, GtkTreeIter *iter, int *diveidx) | ||||||
| 			return; | 			return; | ||||||
| 		if(!gtk_tree_view_row_expanded(GTK_TREE_VIEW(dive_list.tree_view), tpath)) | 		if(!gtk_tree_view_row_expanded(GTK_TREE_VIEW(dive_list.tree_view), tpath)) | ||||||
| 			gtk_tree_view_expand_row(GTK_TREE_VIEW(dive_list.tree_view), tpath, FALSE); | 			gtk_tree_view_expand_row(GTK_TREE_VIEW(dive_list.tree_view), tpath, FALSE); | ||||||
| 		gtk_tree_model_get(GTK_TREE_MODEL(model), iter, DIVE_INDEX, diveidx, -1); | 		gtk_tree_model_get(model, iter, DIVE_INDEX, diveidx, -1); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -139,7 +141,7 @@ static void first_leaf(GtkTreeModel *model, GtkTreeIter *iter, int *diveidx) | ||||||
| void row_expanded_cb(GtkTreeView *tree_view, GtkTreeIter *iter, GtkTreePath *path, gpointer data) | void row_expanded_cb(GtkTreeView *tree_view, GtkTreeIter *iter, GtkTreePath *path, gpointer data) | ||||||
| { | { | ||||||
| 	GtkTreeIter child; | 	GtkTreeIter child; | ||||||
| 	GtkTreeModel *model = TREEMODEL(dive_list); | 	GtkTreeModel *model = MODEL(dive_list); | ||||||
| 	GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(dive_list.tree_view)); | 	GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(dive_list.tree_view)); | ||||||
| 
 | 
 | ||||||
| 	if (!gtk_tree_model_iter_children(model, &child, iter)) | 	if (!gtk_tree_model_iter_children(model, &child, iter)) | ||||||
|  | @ -183,7 +185,7 @@ static int selected_children(GtkTreeModel *model, GtkTreeIter *iter) | ||||||
|    shows up as selected too */ |    shows up as selected too */ | ||||||
| void row_collapsed_cb(GtkTreeView *tree_view, GtkTreeIter *iter, GtkTreePath *path, gpointer data) | void row_collapsed_cb(GtkTreeView *tree_view, GtkTreeIter *iter, GtkTreePath *path, gpointer data) | ||||||
| { | { | ||||||
| 	GtkTreeModel *model = TREEMODEL(dive_list); | 	GtkTreeModel *model = MODEL(dive_list); | ||||||
| 	GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(dive_list.tree_view)); | 	GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(dive_list.tree_view)); | ||||||
| 
 | 
 | ||||||
| 	if (selected_children(model, iter)) | 	if (selected_children(model, iter)) | ||||||
|  | @ -267,7 +269,7 @@ static void select_dive_group(GtkTreeModel *model, GtkTreeSelection *selection, | ||||||
|  */ |  */ | ||||||
| static void check_selection_cb(GtkTreeIter *iter, GtkTreeSelection *selection) | static void check_selection_cb(GtkTreeIter *iter, GtkTreeSelection *selection) | ||||||
| { | { | ||||||
| 	GtkTreeModel *model = TREEMODEL(dive_list); | 	GtkTreeModel *model = MODEL(dive_list); | ||||||
| 	struct dive *dive; | 	struct dive *dive; | ||||||
| 	int idx, gtk_selected; | 	int idx, gtk_selected; | ||||||
| 
 | 
 | ||||||
|  | @ -808,7 +810,7 @@ static void fill_one_dive(struct dive *dive, | ||||||
| 			  GtkTreeIter *iter) | 			  GtkTreeIter *iter) | ||||||
| { | { | ||||||
| 	char *location, *cylinder, *suit; | 	char *location, *cylinder, *suit; | ||||||
| 	GtkTreeStore *othermodel; | 	GtkTreeModel *othermodel; | ||||||
| 
 | 
 | ||||||
| 	get_cylinder(dive, &cylinder); | 	get_cylinder(dive, &cylinder); | ||||||
| 	get_location(dive, &location); | 	get_location(dive, &location); | ||||||
|  | @ -830,12 +832,12 @@ static void fill_one_dive(struct dive *dive, | ||||||
| 	free(suit); | 	free(suit); | ||||||
| 
 | 
 | ||||||
| 	if (model == TREEMODEL(dive_list)) | 	if (model == TREEMODEL(dive_list)) | ||||||
| 		othermodel = dive_list.listmodel; | 		othermodel = LISTMODEL(dive_list); | ||||||
| 	else | 	else | ||||||
| 		othermodel = dive_list.treemodel; | 		othermodel = TREEMODEL(dive_list); | ||||||
| 	if (othermodel != dive_list.model) | 	if (othermodel != MODEL(dive_list)) | ||||||
| 		/* recursive call */ | 		/* recursive call */ | ||||||
| 		gtk_tree_model_foreach(GTK_TREE_MODEL(othermodel), set_one_dive, dive); | 		gtk_tree_model_foreach(othermodel, set_one_dive, dive); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static gboolean set_one_dive(GtkTreeModel *model, | static gboolean set_one_dive(GtkTreeModel *model, | ||||||
|  | @ -862,7 +864,7 @@ static gboolean set_one_dive(GtkTreeModel *model, | ||||||
| 
 | 
 | ||||||
| void flush_divelist(struct dive *dive) | void flush_divelist(struct dive *dive) | ||||||
| { | { | ||||||
| 	GtkTreeModel *model = TREEMODEL(dive_list); | 	GtkTreeModel *model = MODEL(dive_list); | ||||||
| 
 | 
 | ||||||
| 	gtk_tree_model_foreach(model, set_one_dive, dive); | 	gtk_tree_model_foreach(model, set_one_dive, dive); | ||||||
| } | } | ||||||
|  | @ -877,7 +879,7 @@ void set_divelist_font(const char *font) | ||||||
| void update_dive_list_units(void) | void update_dive_list_units(void) | ||||||
| { | { | ||||||
| 	const char *unit; | 	const char *unit; | ||||||
| 	GtkTreeModel *model = TREEMODEL(dive_list); | 	GtkTreeModel *model = MODEL(dive_list); | ||||||
| 
 | 
 | ||||||
| 	(void) get_depth_units(0, NULL, &unit); | 	(void) get_depth_units(0, NULL, &unit); | ||||||
| 	gtk_tree_view_column_set_title(dive_list.depth, unit); | 	gtk_tree_view_column_set_title(dive_list.depth, unit); | ||||||
|  | @ -1035,12 +1037,12 @@ static void fill_dive_list(void) | ||||||
| 				DIVE_LOCATION, dive_trip->location, | 				DIVE_LOCATION, dive_trip->location, | ||||||
| 				-1); | 				-1); | ||||||
| 	update_dive_list_units(); | 	update_dive_list_units(); | ||||||
| 	if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(dive_list.model), &iter)) { | 	if (gtk_tree_model_get_iter_first(MODEL(dive_list), &iter)) { | ||||||
| 		GtkTreeSelection *selection; | 		GtkTreeSelection *selection; | ||||||
| 
 | 
 | ||||||
| 		/* select the last dive (and make sure it's an actual dive that is selected) */ | 		/* select the last dive (and make sure it's an actual dive that is selected) */ | ||||||
| 		gtk_tree_model_get(GTK_TREE_MODEL(dive_list.model), &iter, DIVE_INDEX, &selected_dive, -1); | 		gtk_tree_model_get(MODEL(dive_list), &iter, DIVE_INDEX, &selected_dive, -1); | ||||||
| 		first_leaf(GTK_TREE_MODEL(dive_list.model), &iter, &selected_dive); | 		first_leaf(MODEL(dive_list), &iter, &selected_dive); | ||||||
| 		selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(dive_list.tree_view)); | 		selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(dive_list.tree_view)); | ||||||
| 		gtk_tree_selection_select_iter(selection, &iter); | 		gtk_tree_selection_select_iter(selection, &iter); | ||||||
| 	} | 	} | ||||||
|  | @ -1134,10 +1136,10 @@ static void row_activated_cb(GtkTreeView *tree_view, | ||||||
| 	int index; | 	int index; | ||||||
| 	GtkTreeIter iter; | 	GtkTreeIter iter; | ||||||
| 
 | 
 | ||||||
| 	if (!gtk_tree_model_get_iter(GTK_TREE_MODEL(dive_list.model), &iter, path)) | 	if (!gtk_tree_model_get_iter(MODEL(dive_list), &iter, path)) | ||||||
| 		return; | 		return; | ||||||
| 
 | 
 | ||||||
| 	gtk_tree_model_get(GTK_TREE_MODEL(dive_list.model), &iter, DIVE_INDEX, &index, -1); | 	gtk_tree_model_get(MODEL(dive_list), &iter, DIVE_INDEX, &index, -1); | ||||||
| 	/* a negative index is special for the "group by date" entries */ | 	/* a negative index is special for the "group by date" entries */ | ||||||
| 	if (index < 0) { | 	if (index < 0) { | ||||||
| 		collapse_expand(tree_view, path); | 		collapse_expand(tree_view, path); | ||||||
|  | @ -1166,12 +1168,12 @@ void edit_trip_cb(GtkWidget *menuitem, GtkTreePath *path) | ||||||
| 	struct dive *dive_trip; | 	struct dive *dive_trip; | ||||||
| 	GList *trip; | 	GList *trip; | ||||||
| 
 | 
 | ||||||
| 	gtk_tree_model_get_iter(TREEMODEL(dive_list), &iter, path); | 	gtk_tree_model_get_iter(MODEL(dive_list), &iter, path); | ||||||
| 	gtk_tree_model_get(TREEMODEL(dive_list), &iter, DIVE_DATE, &when, -1); | 	gtk_tree_model_get(MODEL(dive_list), &iter, DIVE_DATE, &when, -1); | ||||||
| 	trip = FIND_TRIP(when); | 	trip = FIND_TRIP(when); | ||||||
| 	dive_trip = DIVE_TRIP(trip); | 	dive_trip = DIVE_TRIP(trip); | ||||||
| 	if (edit_trip(dive_trip)) | 	if (edit_trip(dive_trip)) | ||||||
| 		gtk_tree_store_set(TREESTORE(dive_list), &iter, DIVE_LOCATION, dive_trip->location, -1); | 		gtk_tree_store_set(STORE(dive_list), &iter, DIVE_LOCATION, dive_trip->location, -1); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void edit_selected_dives_cb(GtkWidget *menuitem, gpointer data) | void edit_selected_dives_cb(GtkWidget *menuitem, gpointer data) | ||||||
|  | @ -1185,8 +1187,8 @@ void edit_dive_from_path_cb(GtkWidget *menuitem, GtkTreePath *path) | ||||||
| 	int idx; | 	int idx; | ||||||
| 	struct dive *dive; | 	struct dive *dive; | ||||||
| 
 | 
 | ||||||
| 	gtk_tree_model_get_iter(TREEMODEL(dive_list), &iter, path); | 	gtk_tree_model_get_iter(MODEL(dive_list), &iter, path); | ||||||
| 	gtk_tree_model_get(TREEMODEL(dive_list), &iter, DIVE_INDEX, &idx, -1); | 	gtk_tree_model_get(MODEL(dive_list), &iter, DIVE_INDEX, &idx, -1); | ||||||
| 	dive = get_dive(idx); | 	dive = get_dive(idx); | ||||||
| 
 | 
 | ||||||
| 	edit_multi_dive_info(dive); | 	edit_multi_dive_info(dive); | ||||||
|  | @ -1209,7 +1211,7 @@ static int copy_tree_node(GtkTreeIter *a, GtkTreeIter *b) | ||||||
| 	int totalweight, idx; | 	int totalweight, idx; | ||||||
| 	char *cylinder_text; | 	char *cylinder_text; | ||||||
| 
 | 
 | ||||||
| 	gtk_tree_model_get(TREEMODEL(dive_list), a, | 	gtk_tree_model_get(MODEL(dive_list), a, | ||||||
| 		DIVE_INDEX, &idx, | 		DIVE_INDEX, &idx, | ||||||
| 		DIVE_NR, &store_dive.number, | 		DIVE_NR, &store_dive.number, | ||||||
| 		DIVE_DATE, &store_dive.when, | 		DIVE_DATE, &store_dive.when, | ||||||
|  | @ -1224,7 +1226,7 @@ static int copy_tree_node(GtkTreeIter *a, GtkTreeIter *b) | ||||||
| 		DIVE_OTU, &store_dive.otu, | 		DIVE_OTU, &store_dive.otu, | ||||||
| 		DIVE_LOCATION, &store_dive.location, | 		DIVE_LOCATION, &store_dive.location, | ||||||
| 		-1); | 		-1); | ||||||
| 	gtk_tree_store_set(TREESTORE(dive_list), b, | 	gtk_tree_store_set(STORE(dive_list), b, | ||||||
| 		DIVE_INDEX, idx, | 		DIVE_INDEX, idx, | ||||||
| 		DIVE_NR, store_dive.number, | 		DIVE_NR, store_dive.number, | ||||||
| 		DIVE_DATE, store_dive.when, | 		DIVE_DATE, store_dive.when, | ||||||
|  | @ -1251,15 +1253,15 @@ static void update_trip_timestamp(GtkTreeIter *parent, struct dive *divetrip) | ||||||
| 	int nr; | 	int nr; | ||||||
| 	time_t t1, t2, tnew; | 	time_t t1, t2, tnew; | ||||||
| 
 | 
 | ||||||
| 	if (gtk_tree_store_iter_depth(TREESTORE(dive_list), parent) != 0) | 	if (gtk_tree_store_iter_depth(STORE(dive_list), parent) != 0) | ||||||
| 		return; | 		return; | ||||||
| 	nr = gtk_tree_model_iter_n_children(TREEMODEL(dive_list), parent); | 	nr = gtk_tree_model_iter_n_children(MODEL(dive_list), parent); | ||||||
| 	gtk_tree_model_iter_nth_child(TREEMODEL(dive_list), &first_child, parent, 0); | 	gtk_tree_model_iter_nth_child(MODEL(dive_list), &first_child, parent, 0); | ||||||
| 	gtk_tree_model_get(TREEMODEL(dive_list), &first_child, DIVE_DATE, &t1, -1); | 	gtk_tree_model_get(MODEL(dive_list), &first_child, DIVE_DATE, &t1, -1); | ||||||
| 	gtk_tree_model_iter_nth_child(TREEMODEL(dive_list), &last_child, parent, nr - 1); | 	gtk_tree_model_iter_nth_child(MODEL(dive_list), &last_child, parent, nr - 1); | ||||||
| 	gtk_tree_model_get(TREEMODEL(dive_list), &last_child, DIVE_DATE, &t2, -1); | 	gtk_tree_model_get(MODEL(dive_list), &last_child, DIVE_DATE, &t2, -1); | ||||||
| 	tnew = MIN(t1, t2); | 	tnew = MIN(t1, t2); | ||||||
| 	gtk_tree_store_set(TREESTORE(dive_list), parent, DIVE_DATE, tnew, -1); | 	gtk_tree_store_set(STORE(dive_list), parent, DIVE_DATE, tnew, -1); | ||||||
| 	if (divetrip) | 	if (divetrip) | ||||||
| 		divetrip->when = tnew; | 		divetrip->when = tnew; | ||||||
| } | } | ||||||
|  | @ -1278,20 +1280,20 @@ static GtkTreeIter *move_dive_between_trips(GtkTreeIter *dive_iter, GtkTreeIter | ||||||
| 	GtkTreeIter *new_iter = malloc(sizeof(GtkTreeIter)); | 	GtkTreeIter *new_iter = malloc(sizeof(GtkTreeIter)); | ||||||
| 
 | 
 | ||||||
| 	if (before) | 	if (before) | ||||||
| 		gtk_tree_store_insert_before(GTK_TREE_STORE(TREEMODEL(dive_list)), new_iter, new_trip, sibling); | 		gtk_tree_store_insert_before(STORE(dive_list), new_iter, new_trip, sibling); | ||||||
| 	else | 	else | ||||||
| 		gtk_tree_store_insert_after(GTK_TREE_STORE(TREEMODEL(dive_list)), new_iter, new_trip, sibling); | 		gtk_tree_store_insert_after(STORE(dive_list), new_iter, new_trip, sibling); | ||||||
| 	idx = copy_tree_node(dive_iter, new_iter); | 	idx = copy_tree_node(dive_iter, new_iter); | ||||||
| 	gtk_tree_model_get(TREEMODEL(dive_list), new_iter, DIVE_INDEX, &idx, -1); | 	gtk_tree_model_get(MODEL(dive_list), new_iter, DIVE_INDEX, &idx, -1); | ||||||
| 	dive = get_dive(idx); | 	dive = get_dive(idx); | ||||||
| 	gtk_tree_store_remove(GTK_TREE_STORE(TREEMODEL(dive_list)), dive_iter); | 	gtk_tree_store_remove(STORE(dive_list), dive_iter); | ||||||
| 	if (old_trip) { | 	if (old_trip) { | ||||||
| 		gtk_tree_model_get(TREEMODEL(dive_list), old_trip, DIVE_DATE, &old_when, -1); | 		gtk_tree_model_get(MODEL(dive_list), old_trip, DIVE_DATE, &old_when, -1); | ||||||
| 		old_divetrip = DIVE_TRIP(find_matching_trip(old_when)); | 		old_divetrip = DIVE_TRIP(find_matching_trip(old_when)); | ||||||
| 		update_trip_timestamp(old_trip, old_divetrip); | 		update_trip_timestamp(old_trip, old_divetrip); | ||||||
| 	} | 	} | ||||||
| 	if (new_trip) { | 	if (new_trip) { | ||||||
| 		gtk_tree_model_get(TREEMODEL(dive_list), new_trip, DIVE_DATE, &new_when, -1); | 		gtk_tree_model_get(MODEL(dive_list), new_trip, DIVE_DATE, &new_when, -1); | ||||||
| 		new_divetrip = dive->divetrip; | 		new_divetrip = dive->divetrip; | ||||||
| 		update_trip_timestamp(new_trip, new_divetrip); | 		update_trip_timestamp(new_trip, new_divetrip); | ||||||
| 	} | 	} | ||||||
|  | @ -1313,15 +1315,15 @@ static void turn_dive_into_trip(GtkTreePath *path) | ||||||
| 
 | 
 | ||||||
| 	/* this is a dive on the top level, insert trip AFTER it, populate its date / location, and
 | 	/* this is a dive on the top level, insert trip AFTER it, populate its date / location, and
 | ||||||
| 	 * then move the dive below that trip */ | 	 * then move the dive below that trip */ | ||||||
| 	gtk_tree_model_get_iter(TREEMODEL(dive_list), &iter, path); | 	gtk_tree_model_get_iter(MODEL(dive_list), &iter, path); | ||||||
| 	gtk_tree_store_insert_after(TREESTORE(dive_list), &newparent, NULL, &iter); | 	gtk_tree_store_insert_after(STORE(dive_list), &newparent, NULL, &iter); | ||||||
| 	gtk_tree_model_get(TREEMODEL(dive_list), &iter, | 	gtk_tree_model_get(MODEL(dive_list), &iter, | ||||||
| 			DIVE_INDEX, &idx, DIVE_DATE, &when, DIVE_LOCATION, &location, -1); | 			DIVE_INDEX, &idx, DIVE_DATE, &when, DIVE_LOCATION, &location, -1); | ||||||
| 	gtk_tree_store_set(TREESTORE(dive_list), &newparent, | 	gtk_tree_store_set(STORE(dive_list), &newparent, | ||||||
| 			DIVE_INDEX, -1, DIVE_DATE, when, DIVE_LOCATION, location, -1); | 			DIVE_INDEX, -1, DIVE_DATE, when, DIVE_LOCATION, location, -1); | ||||||
| 	free(location); | 	free(location); | ||||||
| 	newiter = move_dive_between_trips(&iter, NULL, &newparent, NULL, FALSE); | 	newiter = move_dive_between_trips(&iter, NULL, &newparent, NULL, FALSE); | ||||||
| 	treepath = gtk_tree_model_get_path(TREEMODEL(dive_list), newiter); | 	treepath = gtk_tree_model_get_path(MODEL(dive_list), newiter); | ||||||
| 	gtk_tree_view_expand_to_path(GTK_TREE_VIEW(dive_list.tree_view), treepath); | 	gtk_tree_view_expand_to_path(GTK_TREE_VIEW(dive_list.tree_view), treepath); | ||||||
| 	dive = get_dive(idx); | 	dive = get_dive(idx); | ||||||
| 	/* we don't need the return value - everything is hooked up in the function */ | 	/* we don't need the return value - everything is hooked up in the function */ | ||||||
|  | @ -1336,17 +1338,17 @@ static void insert_trip_before(GtkTreePath *path) | ||||||
| 	struct dive *dive, *prev_dive, *new_divetrip; | 	struct dive *dive, *prev_dive, *new_divetrip; | ||||||
| 	int idx, nr, i; | 	int idx, nr, i; | ||||||
| 
 | 
 | ||||||
| 	gtk_tree_model_get_iter(TREEMODEL(dive_list), &iter, path); | 	gtk_tree_model_get_iter(MODEL(dive_list), &iter, path); | ||||||
| 	prev_path = gtk_tree_path_copy(path); | 	prev_path = gtk_tree_path_copy(path); | ||||||
| 	if (!gtk_tree_path_prev(prev_path) || | 	if (!gtk_tree_path_prev(prev_path) || | ||||||
| 	    !gtk_tree_model_iter_parent(TREEMODEL(dive_list), &parent, &iter)) | 	    !gtk_tree_model_iter_parent(MODEL(dive_list), &parent, &iter)) | ||||||
| 		return; | 		return; | ||||||
| 	gtk_tree_model_get_iter(TREEMODEL(dive_list), &prev_iter, prev_path); | 	gtk_tree_model_get_iter(MODEL(dive_list), &prev_iter, prev_path); | ||||||
| 	gtk_tree_model_get(TREEMODEL(dive_list), &prev_iter, DIVE_INDEX, &idx, -1); | 	gtk_tree_model_get(MODEL(dive_list), &prev_iter, DIVE_INDEX, &idx, -1); | ||||||
| 	prev_dive = get_dive(idx); | 	prev_dive = get_dive(idx); | ||||||
| 	gtk_tree_store_insert_after(TREESTORE(dive_list), &newparent, NULL, &parent); | 	gtk_tree_store_insert_after(STORE(dive_list), &newparent, NULL, &parent); | ||||||
| 	copy_tree_node(&parent, &newparent); | 	copy_tree_node(&parent, &newparent); | ||||||
| 	gtk_tree_model_get(TREEMODEL(dive_list), &iter, DIVE_INDEX, &idx, -1); | 	gtk_tree_model_get(MODEL(dive_list), &iter, DIVE_INDEX, &idx, -1); | ||||||
| 	dive = get_dive(idx); | 	dive = get_dive(idx); | ||||||
| 	/* make sure that the time_t of the previous divetrip is correct before
 | 	/* make sure that the time_t of the previous divetrip is correct before
 | ||||||
| 	 * inserting a new one */ | 	 * inserting a new one */ | ||||||
|  | @ -1358,11 +1360,11 @@ static void insert_trip_before(GtkTreePath *path) | ||||||
| 	/* in order for the data structures to stay consistent we need to walk from
 | 	/* in order for the data structures to stay consistent we need to walk from
 | ||||||
| 	 * the last child backwards to this one. The easiest way seems to be to do | 	 * the last child backwards to this one. The easiest way seems to be to do | ||||||
| 	 * this with the nth iterator API */ | 	 * this with the nth iterator API */ | ||||||
| 	nr = gtk_tree_model_iter_n_children(TREEMODEL(dive_list), &parent); | 	nr = gtk_tree_model_iter_n_children(MODEL(dive_list), &parent); | ||||||
| 	for (i = nr - 1; i >= 0; i--) { | 	for (i = nr - 1; i >= 0; i--) { | ||||||
| 		gtk_tree_model_iter_nth_child(TREEMODEL(dive_list), &nextsibling, &parent, i); | 		gtk_tree_model_iter_nth_child(MODEL(dive_list), &nextsibling, &parent, i); | ||||||
| 		treepath = gtk_tree_model_get_path(TREEMODEL(dive_list), &nextsibling); | 		treepath = gtk_tree_model_get_path(MODEL(dive_list), &nextsibling); | ||||||
| 		gtk_tree_model_get(TREEMODEL(dive_list), &nextsibling, DIVE_INDEX, &idx, -1); | 		gtk_tree_model_get(MODEL(dive_list), &nextsibling, DIVE_INDEX, &idx, -1); | ||||||
| 		dive = get_dive(idx); | 		dive = get_dive(idx); | ||||||
| 		dive->divetrip = new_divetrip; | 		dive->divetrip = new_divetrip; | ||||||
| 		if (dive->when < dive->divetrip->when) | 		if (dive->when < dive->divetrip->when) | ||||||
|  | @ -1372,7 +1374,7 @@ static void insert_trip_before(GtkTreePath *path) | ||||||
| 			/* we copied the dive we were called with; we are done */ | 			/* we copied the dive we were called with; we are done */ | ||||||
| 			break; | 			break; | ||||||
| 	} | 	} | ||||||
| 	treepath = gtk_tree_model_get_path(TREEMODEL(dive_list), &newparent); | 	treepath = gtk_tree_model_get_path(MODEL(dive_list), &newparent); | ||||||
| 	gtk_tree_view_expand_to_path(GTK_TREE_VIEW(dive_list.tree_view), treepath); | 	gtk_tree_view_expand_to_path(GTK_TREE_VIEW(dive_list.tree_view), treepath); | ||||||
| #ifdef DEBUG_TRIP | #ifdef DEBUG_TRIP | ||||||
| 	dump_trip_list(); | 	dump_trip_list(); | ||||||
|  | @ -1395,30 +1397,30 @@ static void remove_from_trip_cb(GtkWidget *menuitem, GtkTreePath *path) | ||||||
| 	struct dive *dive; | 	struct dive *dive; | ||||||
| 	int idx; | 	int idx; | ||||||
| 
 | 
 | ||||||
| 	gtk_tree_model_get_iter(TREEMODEL(dive_list), &iter, path); | 	gtk_tree_model_get_iter(MODEL(dive_list), &iter, path); | ||||||
| 	if (!gtk_tree_model_iter_parent(TREEMODEL(dive_list), &parent, &iter)) | 	if (!gtk_tree_model_iter_parent(MODEL(dive_list), &parent, &iter)) | ||||||
| 		return; | 		return; | ||||||
| 
 | 
 | ||||||
| 	/* if this isn't the last dive in a trip we simply split the trip
 | 	/* if this isn't the last dive in a trip we simply split the trip
 | ||||||
| 	   in two right after this dive */ | 	   in two right after this dive */ | ||||||
| 	nextpath = gtk_tree_path_copy(path); | 	nextpath = gtk_tree_path_copy(path); | ||||||
| 	gtk_tree_path_next(nextpath); | 	gtk_tree_path_next(nextpath); | ||||||
| 	if (gtk_tree_model_get_iter(TREEMODEL(dive_list), &newiter, nextpath)) | 	if (gtk_tree_model_get_iter(MODEL(dive_list), &newiter, nextpath)) | ||||||
| 		insert_trip_before(nextpath); | 		insert_trip_before(nextpath); | ||||||
| 	/* now create a new node as sibling right after the current parent */ | 	/* now create a new node as sibling right after the current parent */ | ||||||
| 	gtk_tree_store_insert_after(TREESTORE(dive_list), &newiter, NULL, &parent); | 	gtk_tree_store_insert_after(STORE(dive_list), &newiter, NULL, &parent); | ||||||
| 	copy_tree_node(&iter, &newiter); | 	copy_tree_node(&iter, &newiter); | ||||||
| 
 | 
 | ||||||
| 	gtk_tree_model_get(TREEMODEL(dive_list), &iter, DIVE_INDEX, &idx, -1); | 	gtk_tree_model_get(MODEL(dive_list), &iter, DIVE_INDEX, &idx, -1); | ||||||
| 	dive = get_dive(idx); | 	dive = get_dive(idx); | ||||||
| 	if (dive->selected) { | 	if (dive->selected) { | ||||||
| 		GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(dive_list.tree_view)); | 		GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(dive_list.tree_view)); | ||||||
| 		gtk_tree_selection_select_iter(selection, &newiter); | 		gtk_tree_selection_select_iter(selection, &newiter); | ||||||
| 	} | 	} | ||||||
| 	gtk_tree_store_remove(TREESTORE(dive_list), &iter); | 	gtk_tree_store_remove(STORE(dive_list), &iter); | ||||||
| 	/* if this was the last dive on the trip, remove the trip */ | 	/* if this was the last dive on the trip, remove the trip */ | ||||||
| 	if (! gtk_tree_model_iter_has_child(TREEMODEL(dive_list), &parent)) { | 	if (! gtk_tree_model_iter_has_child(MODEL(dive_list), &parent)) { | ||||||
| 		gtk_tree_store_remove(TREESTORE(dive_list), &parent); | 		gtk_tree_store_remove(STORE(dive_list), &parent); | ||||||
| 		delete_trip(FIND_TRIP(dive->divetrip->when)); | 		delete_trip(FIND_TRIP(dive->divetrip->when)); | ||||||
| 	} | 	} | ||||||
| 	dive->tripflag = NO_TRIP; | 	dive->tripflag = NO_TRIP; | ||||||
|  | @ -1435,16 +1437,16 @@ void remove_trip_cb(GtkWidget *menuitem, GtkTreePath *trippath) | ||||||
| 
 | 
 | ||||||
| 	/* what a pain - we can't just move the nodes, we have to
 | 	/* what a pain - we can't just move the nodes, we have to
 | ||||||
| 	 * create new ones and delete the existing ones instead */ | 	 * create new ones and delete the existing ones instead */ | ||||||
| 	gtk_tree_model_get_iter(TREEMODEL(dive_list), &parent, trippath); | 	gtk_tree_model_get_iter(MODEL(dive_list), &parent, trippath); | ||||||
| 	childpath = gtk_tree_path_copy(trippath); | 	childpath = gtk_tree_path_copy(trippath); | ||||||
| 	gtk_tree_path_down(childpath); | 	gtk_tree_path_down(childpath); | ||||||
| 	for (;;) { | 	for (;;) { | ||||||
| 		if( ! gtk_tree_model_get_iter(TREEMODEL(dive_list), &child, childpath)) | 		if( ! gtk_tree_model_get_iter(MODEL(dive_list), &child, childpath)) | ||||||
| 			break; | 			break; | ||||||
| 		gtk_tree_store_insert_after(TREESTORE(dive_list), &newiter, NULL, lastiter); | 		gtk_tree_store_insert_after(STORE(dive_list), &newiter, NULL, lastiter); | ||||||
| 		copy_tree_node(&child, &newiter); | 		copy_tree_node(&child, &newiter); | ||||||
| 		/* we need to track what was selected */ | 		/* we need to track what was selected */ | ||||||
| 		gtk_tree_model_get(TREEMODEL(dive_list), &child, DIVE_INDEX, &idx, -1); | 		gtk_tree_model_get(MODEL(dive_list), &child, DIVE_INDEX, &idx, -1); | ||||||
| 		dive = get_dive(idx); | 		dive = get_dive(idx); | ||||||
| 		if (dive->selected) | 		if (dive->selected) | ||||||
| 			gtk_tree_selection_select_iter(selection, &newiter); | 			gtk_tree_selection_select_iter(selection, &newiter); | ||||||
|  | @ -1453,11 +1455,11 @@ void remove_trip_cb(GtkWidget *menuitem, GtkTreePath *trippath) | ||||||
| 			dive_trip = dive->divetrip; | 			dive_trip = dive->divetrip; | ||||||
| 		dive->divetrip = NULL; | 		dive->divetrip = NULL; | ||||||
| 		/* this removes the child - now childpath points to the next child */ | 		/* this removes the child - now childpath points to the next child */ | ||||||
| 		gtk_tree_store_remove(TREESTORE(dive_list), &child); | 		gtk_tree_store_remove(STORE(dive_list), &child); | ||||||
| 		lastiter = &newiter; | 		lastiter = &newiter; | ||||||
| 	} | 	} | ||||||
| 	/* finally, remove the trip */ | 	/* finally, remove the trip */ | ||||||
| 	gtk_tree_store_remove(TREESTORE(dive_list), &parent); | 	gtk_tree_store_remove(STORE(dive_list), &parent); | ||||||
| 	delete_trip(FIND_TRIP(dive_trip->when)); | 	delete_trip(FIND_TRIP(dive_trip->when)); | ||||||
| 	free(dive_trip); | 	free(dive_trip); | ||||||
| } | } | ||||||
|  | @ -1466,7 +1468,7 @@ void merge_trips_cb(GtkWidget *menuitem, GtkTreePath *trippath) | ||||||
| { | { | ||||||
| 	GtkTreePath *prevpath; | 	GtkTreePath *prevpath; | ||||||
| 	GtkTreeIter thistripiter, prevtripiter, newiter, iter; | 	GtkTreeIter thistripiter, prevtripiter, newiter, iter; | ||||||
| 	GtkTreeModel *tm = TREEMODEL(dive_list); | 	GtkTreeModel *tm = MODEL(dive_list); | ||||||
| 	GList *trip, *prevtrip; | 	GList *trip, *prevtrip; | ||||||
| 	time_t when; | 	time_t when; | ||||||
| 
 | 
 | ||||||
|  | @ -1481,15 +1483,15 @@ void merge_trips_cb(GtkWidget *menuitem, GtkTreePath *trippath) | ||||||
| 	prevtrip = find_matching_trip(when); | 	prevtrip = find_matching_trip(when); | ||||||
| 	while (gtk_tree_model_iter_children(tm, &iter, &thistripiter)) { | 	while (gtk_tree_model_iter_children(tm, &iter, &thistripiter)) { | ||||||
| 		int idx; | 		int idx; | ||||||
| 		gtk_tree_store_insert_before(TREESTORE(dive_list), &newiter, &prevtripiter, NULL); | 		gtk_tree_store_insert_before(STORE(dive_list), &newiter, &prevtripiter, NULL); | ||||||
| 		idx = copy_tree_node(&iter, &newiter); | 		idx = copy_tree_node(&iter, &newiter); | ||||||
| 		gtk_tree_store_remove(TREESTORE(dive_list), &iter); | 		gtk_tree_store_remove(STORE(dive_list), &iter); | ||||||
| 		get_dive(idx)->divetrip = DIVE_TRIP(prevtrip); | 		get_dive(idx)->divetrip = DIVE_TRIP(prevtrip); | ||||||
| 	} | 	} | ||||||
| 	update_trip_timestamp(&prevtripiter, DIVE_TRIP(prevtrip)); | 	update_trip_timestamp(&prevtripiter, DIVE_TRIP(prevtrip)); | ||||||
| 	free(DIVE_TRIP(trip)); | 	free(DIVE_TRIP(trip)); | ||||||
| 	delete_trip(trip); | 	delete_trip(trip); | ||||||
| 	gtk_tree_store_remove(TREESTORE(dive_list), &thistripiter); | 	gtk_tree_store_remove(STORE(dive_list), &thistripiter); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void popup_divelist_menu(GtkTreeView *tree_view, GtkTreeModel *model, int button, GdkEventButton *event) | static void popup_divelist_menu(GtkTreeView *tree_view, GtkTreeModel *model, int button, GdkEventButton *event) | ||||||
|  | @ -1503,8 +1505,8 @@ static void popup_divelist_menu(GtkTreeView *tree_view, GtkTreeModel *model, int | ||||||
| 
 | 
 | ||||||
| 	if (!gtk_tree_view_get_path_at_pos(tree_view, event->x, event->y, &path, NULL, NULL, NULL)) | 	if (!gtk_tree_view_get_path_at_pos(tree_view, event->x, event->y, &path, NULL, NULL, NULL)) | ||||||
| 		return; | 		return; | ||||||
| 	gtk_tree_model_get_iter(TREEMODEL(dive_list), &iter, path); | 	gtk_tree_model_get_iter(MODEL(dive_list), &iter, path); | ||||||
| 	gtk_tree_model_get(TREEMODEL(dive_list), &iter, DIVE_INDEX, &idx, -1); | 	gtk_tree_model_get(MODEL(dive_list), &iter, DIVE_INDEX, &idx, -1); | ||||||
| 
 | 
 | ||||||
| 	menu = gtk_menu_new(); | 	menu = gtk_menu_new(); | ||||||
| 	menuitem = gtk_image_menu_item_new_with_label("Add dive"); | 	menuitem = gtk_image_menu_item_new_with_label("Add dive"); | ||||||
|  | @ -1520,8 +1522,8 @@ static void popup_divelist_menu(GtkTreeView *tree_view, GtkTreeModel *model, int | ||||||
| 		gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); | 		gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); | ||||||
| 		prevpath = gtk_tree_path_copy(path); | 		prevpath = gtk_tree_path_copy(path); | ||||||
| 		if (gtk_tree_path_prev(prevpath) && | 		if (gtk_tree_path_prev(prevpath) && | ||||||
| 		    gtk_tree_model_get_iter(TREEMODEL(dive_list), &previter, prevpath)) { | 		    gtk_tree_model_get_iter(MODEL(dive_list), &previter, prevpath)) { | ||||||
| 			gtk_tree_model_get(TREEMODEL(dive_list), &previter, DIVE_INDEX, &previdx, -1); | 			gtk_tree_model_get(MODEL(dive_list), &previter, DIVE_INDEX, &previdx, -1); | ||||||
| 			if (previdx < 0) { | 			if (previdx < 0) { | ||||||
| 				menuitem = gtk_menu_item_new_with_label("Merge trip with previous"); | 				menuitem = gtk_menu_item_new_with_label("Merge trip with previous"); | ||||||
| 				g_signal_connect(menuitem, "activate", G_CALLBACK(merge_trips_cb), path); | 				g_signal_connect(menuitem, "activate", G_CALLBACK(merge_trips_cb), path); | ||||||
|  | @ -1577,14 +1579,14 @@ static void popup_divelist_menu(GtkTreeView *tree_view, GtkTreeModel *model, int | ||||||
| 
 | 
 | ||||||
| static void popup_menu_cb(GtkTreeView *tree_view, gpointer userdata) | static void popup_menu_cb(GtkTreeView *tree_view, gpointer userdata) | ||||||
| { | { | ||||||
| 	popup_divelist_menu(tree_view, GTK_TREE_MODEL(dive_list.model), 0, NULL); | 	popup_divelist_menu(tree_view, MODEL(dive_list), 0, NULL); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static gboolean button_press_cb(GtkWidget *treeview, GdkEventButton *event, gpointer userdata) | static gboolean button_press_cb(GtkWidget *treeview, GdkEventButton *event, gpointer userdata) | ||||||
| { | { | ||||||
| 	/* Right-click? Bring up the menu */ | 	/* Right-click? Bring up the menu */ | ||||||
| 	if (event->type == GDK_BUTTON_PRESS  &&  event->button == 3) { | 	if (event->type == GDK_BUTTON_PRESS  &&  event->button == 3) { | ||||||
| 		popup_divelist_menu(GTK_TREE_VIEW(treeview), GTK_TREE_MODEL(dive_list.model), 3, event); | 		popup_divelist_menu(GTK_TREE_VIEW(treeview), MODEL(dive_list), 3, event); | ||||||
| 		return TRUE; | 		return TRUE; | ||||||
| 	} | 	} | ||||||
| 	return FALSE; | 	return FALSE; | ||||||
|  | @ -1675,9 +1677,9 @@ static void sort_column_change_cb(GtkTreeSortable *treeview, gpointer data) | ||||||
| 	if (dive_list.model != currentmodel) { | 	if (dive_list.model != currentmodel) { | ||||||
| 		GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(dive_list.tree_view)); | 		GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(dive_list.tree_view)); | ||||||
| 
 | 
 | ||||||
| 		gtk_tree_view_set_model(GTK_TREE_VIEW(dive_list.tree_view), GTK_TREE_MODEL(dive_list.model)); | 		gtk_tree_view_set_model(GTK_TREE_VIEW(dive_list.tree_view), MODEL(dive_list)); | ||||||
| 		update_column_and_order(colid); | 		update_column_and_order(colid); | ||||||
| 		gtk_tree_model_foreach(GTK_TREE_MODEL(dive_list.model), set_selected, selection); | 		gtk_tree_model_foreach(MODEL(dive_list), set_selected, selection); | ||||||
| 	} else { | 	} else { | ||||||
| 		if (order != sortorder[colid]) { | 		if (order != sortorder[colid]) { | ||||||
| 			update_column_and_order(colid); | 			update_column_and_order(colid); | ||||||
|  | @ -1722,7 +1724,7 @@ GtkWidget *dive_list_create(void) | ||||||
| 				G_TYPE_STRING			/* Location */ | 				G_TYPE_STRING			/* Location */ | ||||||
| 				); | 				); | ||||||
| 	dive_list.model = dive_list.treemodel; | 	dive_list.model = dive_list.treemodel; | ||||||
| 	dive_list.tree_view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(dive_list.model)); | 	dive_list.tree_view = gtk_tree_view_new_with_model(TREEMODEL(dive_list)); | ||||||
| 	set_divelist_font(divelist_font); | 	set_divelist_font(divelist_font); | ||||||
| 
 | 
 | ||||||
| 	selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(dive_list.tree_view)); | 	selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(dive_list.tree_view)); | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue