mirror of
				https://github.com/subsurface/subsurface.git
				synced 2025-02-19 22:16:15 +00:00 
			
		
		
		
	Improving the yearly statistics code
This will update the yearly statistics window (if open) whenever there are changes to the dive list. I also added a check not to open multiple statistics windows. Signed-off-by: Miika Turkia <miika.turkia@gmail.com> Reworded commit message Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
		
							parent
							
								
									b150c4fd41
								
							
						
					
					
						commit
						e7d4bbdd72
					
				
					 1 changed files with 57 additions and 23 deletions
				
			
		
							
								
								
									
										80
									
								
								statistics.c
									
										
									
									
									
								
							
							
						
						
									
										80
									
								
								statistics.c
									
										
									
									
									
								
							| 
						 | 
					@ -80,6 +80,7 @@ static stats_t *stats_monthly = NULL;
 | 
				
			||||||
static stats_t *stats_yearly = NULL;
 | 
					static stats_t *stats_yearly = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GtkTreeIter yearly_iter;
 | 
					GtkTreeIter yearly_iter;
 | 
				
			||||||
 | 
					GtkWidget *yearly_tree = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum {
 | 
					enum {
 | 
				
			||||||
	YEAR,
 | 
						YEAR,
 | 
				
			||||||
| 
						 | 
					@ -143,7 +144,7 @@ static void process_dive(struct dive *dp, stats_t *stats)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void init_tree(GtkWidget *tree)
 | 
					static void init_tree()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	GtkCellRenderer *renderer;
 | 
						GtkCellRenderer *renderer;
 | 
				
			||||||
	GtkTreeViewColumn *column;
 | 
						GtkTreeViewColumn *column;
 | 
				
			||||||
| 
						 | 
					@ -151,7 +152,7 @@ static void init_tree(GtkWidget *tree)
 | 
				
			||||||
	int i;
 | 
						int i;
 | 
				
			||||||
	PangoFontDescription *font_desc = pango_font_description_from_string(divelist_font);
 | 
						PangoFontDescription *font_desc = pango_font_description_from_string(divelist_font);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	gtk_widget_modify_font(tree, font_desc);
 | 
						gtk_widget_modify_font(yearly_tree, font_desc);
 | 
				
			||||||
	pango_font_description_free(font_desc);
 | 
						pango_font_description_free(font_desc);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	renderer = gtk_cell_renderer_text_new ();
 | 
						renderer = gtk_cell_renderer_text_new ();
 | 
				
			||||||
| 
						 | 
					@ -165,7 +166,7 @@ static void init_tree(GtkWidget *tree)
 | 
				
			||||||
	for (i = 0; i < N_COLUMNS; ++i) {
 | 
						for (i = 0; i < N_COLUMNS; ++i) {
 | 
				
			||||||
		column = gtk_tree_view_column_new();
 | 
							column = gtk_tree_view_column_new();
 | 
				
			||||||
		gtk_tree_view_column_set_title(column, columns[i]);
 | 
							gtk_tree_view_column_set_title(column, columns[i]);
 | 
				
			||||||
		gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column);
 | 
							gtk_tree_view_append_column(GTK_TREE_VIEW(yearly_tree), column);
 | 
				
			||||||
		renderer = gtk_cell_renderer_text_new();
 | 
							renderer = gtk_cell_renderer_text_new();
 | 
				
			||||||
		gtk_tree_view_column_pack_start(column, renderer, TRUE);
 | 
							gtk_tree_view_column_pack_start(column, renderer, TRUE);
 | 
				
			||||||
		gtk_tree_view_column_add_attribute(column, renderer, "text", i);
 | 
							gtk_tree_view_column_add_attribute(column, renderer, "text", i);
 | 
				
			||||||
| 
						 | 
					@ -192,7 +193,7 @@ static void init_tree(GtkWidget *tree)
 | 
				
			||||||
			G_TYPE_STRING	// Maximum temperature
 | 
								G_TYPE_STRING	// Maximum temperature
 | 
				
			||||||
			);
 | 
								);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	gtk_tree_view_set_model (GTK_TREE_VIEW (tree), GTK_TREE_MODEL (store));
 | 
						gtk_tree_view_set_model (GTK_TREE_VIEW (yearly_tree), GTK_TREE_MODEL (store));
 | 
				
			||||||
	g_object_unref (store);
 | 
						g_object_unref (store);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -227,14 +228,14 @@ void add_cell(GtkTreeStore *store, GtkTreeIter *parent, unsigned int val, int ce
 | 
				
			||||||
	add_cell_to_tree(store, value_str, cell, FALSE, parent);
 | 
						add_cell_to_tree(store, value_str, cell, FALSE, parent);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void process_interval_stats(GtkWidget *tree, stats_t stats_interval, GtkTreeIter *parent)
 | 
					void process_interval_stats(stats_t stats_interval, GtkTreeIter *parent)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	double value;
 | 
						double value;
 | 
				
			||||||
	const char *unit;
 | 
						const char *unit;
 | 
				
			||||||
	char value_str[40];
 | 
						char value_str[40];
 | 
				
			||||||
	GtkTreeStore *store;
 | 
						GtkTreeStore *store;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	store = GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(tree)));
 | 
						store = GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(yearly_tree)));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Year or month */
 | 
						/* Year or month */
 | 
				
			||||||
	snprintf(value_str, sizeof(value_str), "%d", stats_interval.period);
 | 
						snprintf(value_str, sizeof(value_str), "%d", stats_interval.period);
 | 
				
			||||||
| 
						 | 
					@ -279,24 +280,63 @@ void process_interval_stats(GtkWidget *tree, stats_t stats_interval, GtkTreeIter
 | 
				
			||||||
	add_cell_to_tree(store, value_str, 14, FALSE, parent);
 | 
						add_cell_to_tree(store, value_str, 14, FALSE, parent);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void clear_statistics()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						GtkTreeStore *store;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						store = GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(yearly_tree)));
 | 
				
			||||||
 | 
						gtk_tree_store_clear(store);
 | 
				
			||||||
 | 
						yearly_tree = NULL;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static gboolean on_delete(GtkWidget *window, GdkEvent *event, gpointer data)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						clear_statistics();
 | 
				
			||||||
 | 
						gtk_widget_destroy(window);
 | 
				
			||||||
 | 
						return TRUE;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void key_press_event(GtkWidget *window, GdkEventKey *event, gpointer data)
 | 
					static void key_press_event(GtkWidget *window, GdkEventKey *event, gpointer data)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if ((event->string != NULL && event->keyval == GDK_Escape) ||
 | 
						if ((event->string != NULL && event->keyval == GDK_Escape) ||
 | 
				
			||||||
			(event->string != NULL && event->keyval == GDK_w && event->state & GDK_CONTROL_MASK))
 | 
								(event->string != NULL && event->keyval == GDK_w && event->state & GDK_CONTROL_MASK)) {
 | 
				
			||||||
 | 
							clear_statistics();
 | 
				
			||||||
		gtk_widget_destroy(window);
 | 
							gtk_widget_destroy(window);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void update_yearly_stats()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int i, j, combined_months, month_iter = 0;
 | 
				
			||||||
 | 
						GtkTreeIter parent_iter;
 | 
				
			||||||
 | 
						GtkTreeStore *store;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						store = GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(yearly_tree)));
 | 
				
			||||||
 | 
						gtk_tree_store_clear(store);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for (i = 0; stats_yearly != NULL && stats_yearly[i].period; ++i) {
 | 
				
			||||||
 | 
							process_interval_stats(stats_yearly[i], NULL);
 | 
				
			||||||
 | 
							parent_iter = yearly_iter;
 | 
				
			||||||
 | 
							combined_months = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							for (j = 0; combined_months < stats_yearly[i].selection_size; ++j) {
 | 
				
			||||||
 | 
								combined_months += stats_monthly[month_iter].selection_size;
 | 
				
			||||||
 | 
								process_interval_stats(stats_monthly[month_iter++], &parent_iter);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void show_yearly_stats()
 | 
					void show_yearly_stats()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int i, j, combined_months, month_iter = 0;
 | 
					 | 
				
			||||||
	GtkWidget *window;
 | 
						GtkWidget *window;
 | 
				
			||||||
	GtkWidget *tree, *sw;
 | 
						GtkWidget *sw;
 | 
				
			||||||
	GtkTreeIter parent_iter;
 | 
					
 | 
				
			||||||
 | 
						if (yearly_tree)
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
 | 
						window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
 | 
				
			||||||
	sw = gtk_scrolled_window_new (NULL, NULL);
 | 
						sw = gtk_scrolled_window_new (NULL, NULL);
 | 
				
			||||||
	tree = gtk_tree_view_new ();
 | 
						yearly_tree = gtk_tree_view_new ();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
 | 
						gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
 | 
				
			||||||
	gtk_window_set_default_size(GTK_WINDOW(window), 640, 480);
 | 
						gtk_window_set_default_size(GTK_WINDOW(window), 640, 480);
 | 
				
			||||||
| 
						 | 
					@ -306,24 +346,16 @@ void show_yearly_stats()
 | 
				
			||||||
	gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
 | 
						gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
 | 
				
			||||||
	gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), GTK_SHADOW_ETCHED_IN);
 | 
						gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), GTK_SHADOW_ETCHED_IN);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	gtk_container_add (GTK_CONTAINER (sw), tree);
 | 
						gtk_container_add (GTK_CONTAINER (sw), yearly_tree);
 | 
				
			||||||
	gtk_container_add (GTK_CONTAINER (window), sw);
 | 
						gtk_container_add (GTK_CONTAINER (window), sw);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Display the yearly statistics on top level
 | 
						/* Display the yearly statistics on top level
 | 
				
			||||||
	 * Monthly statistics are available by expanding a year */
 | 
						 * Monthly statistics are available by expanding a year */
 | 
				
			||||||
	init_tree(tree);
 | 
						init_tree();
 | 
				
			||||||
	for (i = 0; stats_yearly != NULL && stats_yearly[i].period; ++i) {
 | 
						update_yearly_stats();
 | 
				
			||||||
		process_interval_stats(tree, stats_yearly[i], NULL);
 | 
					 | 
				
			||||||
		parent_iter = yearly_iter;
 | 
					 | 
				
			||||||
		combined_months = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		for (j = 0; combined_months < stats_yearly[i].selection_size; ++j) {
 | 
					 | 
				
			||||||
			combined_months += stats_monthly[month_iter].selection_size;
 | 
					 | 
				
			||||||
			process_interval_stats(tree, stats_monthly[month_iter++], &parent_iter);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	g_signal_connect (G_OBJECT (window), "key_press_event", G_CALLBACK (key_press_event), NULL);
 | 
						g_signal_connect (G_OBJECT (window), "key_press_event", G_CALLBACK (key_press_event), NULL);
 | 
				
			||||||
 | 
						g_signal_connect (G_OBJECT (window), "delete-event", G_CALLBACK (on_delete), NULL);
 | 
				
			||||||
	gtk_widget_show_all(window);
 | 
						gtk_widget_show_all(window);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -404,6 +436,8 @@ static void process_all_dives(struct dive *dive, struct dive **prev_dive)
 | 
				
			||||||
		prev_month = current_month;
 | 
							prev_month = current_month;
 | 
				
			||||||
		prev_year = current_year;
 | 
							prev_year = current_year;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						if (yearly_tree)
 | 
				
			||||||
 | 
							update_yearly_stats();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* make sure we skip the selected summary entries */
 | 
					/* make sure we skip the selected summary entries */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue