mirror of
https://github.com/subsurface/subsurface.git
synced 2025-01-20 06:45:27 +00:00
Improve divelist group header information
This shows the number of dives in the grup in the divelist header field, and also picks the location from the first dive that *had* a location, so that if any dive in the group has a valid location, the group will have a location. It also makes double-clicking a dive group expand/collapse that group. Requested-by: Miika Turkia <miika.turkia@gmail.com> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
413065dcdc
commit
c5be77093a
1 changed files with 48 additions and 16 deletions
58
divelist.c
58
divelist.c
|
@ -306,12 +306,12 @@ static void date_data_func(GtkTreeViewColumn *col,
|
||||||
GtkTreeIter *iter,
|
GtkTreeIter *iter,
|
||||||
gpointer data)
|
gpointer data)
|
||||||
{
|
{
|
||||||
int val, idx;
|
int val, idx, nr;
|
||||||
struct tm *tm;
|
struct tm *tm;
|
||||||
time_t when;
|
time_t when;
|
||||||
char buffer[40];
|
char buffer[40];
|
||||||
|
|
||||||
gtk_tree_model_get(model, iter, DIVE_INDEX, &idx, DIVE_DATE, &val, -1);
|
gtk_tree_model_get(model, iter, DIVE_INDEX, &idx, DIVE_DATE, &val, DIVE_NR, &nr, -1);
|
||||||
|
|
||||||
/* 2038 problem */
|
/* 2038 problem */
|
||||||
when = val;
|
when = val;
|
||||||
|
@ -320,10 +320,11 @@ static void date_data_func(GtkTreeViewColumn *col,
|
||||||
switch(idx) {
|
switch(idx) {
|
||||||
case -NEW_TRIP:
|
case -NEW_TRIP:
|
||||||
snprintf(buffer, sizeof(buffer),
|
snprintf(buffer, sizeof(buffer),
|
||||||
"Trip %s, %s %d, %d",
|
"Trip %s, %s %d, %d (%d dive%s)",
|
||||||
weekday(tm->tm_wday),
|
weekday(tm->tm_wday),
|
||||||
monthname(tm->tm_mon),
|
monthname(tm->tm_mon),
|
||||||
tm->tm_mday, tm->tm_year + 1900);
|
tm->tm_mday, tm->tm_year + 1900,
|
||||||
|
nr, nr > 1 ? "s" : "");
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
snprintf(buffer, sizeof(buffer),
|
snprintf(buffer, sizeof(buffer),
|
||||||
|
@ -892,12 +893,12 @@ static int new_group(struct dive *dive, struct dive **last_dive, time_t *tm_date
|
||||||
|
|
||||||
static void fill_dive_list(void)
|
static void fill_dive_list(void)
|
||||||
{
|
{
|
||||||
int i;
|
int i, group_size;
|
||||||
GtkTreeIter iter, parent_iter;
|
GtkTreeIter iter, parent_iter;
|
||||||
GtkTreeStore *liststore, *treestore;
|
GtkTreeStore *liststore, *treestore;
|
||||||
struct dive *last_dive = NULL;
|
struct dive *last_dive = NULL;
|
||||||
struct dive *first_trip_dive = NULL;
|
|
||||||
struct dive *last_trip_dive = NULL;
|
struct dive *last_trip_dive = NULL;
|
||||||
|
const char *last_location = NULL;
|
||||||
time_t dive_date;
|
time_t dive_date;
|
||||||
|
|
||||||
treestore = GTK_TREE_STORE(dive_list.treemodel);
|
treestore = GTK_TREE_STORE(dive_list.treemodel);
|
||||||
|
@ -910,24 +911,29 @@ static void fill_dive_list(void)
|
||||||
if (new_group(dive, &last_dive, &dive_date))
|
if (new_group(dive, &last_dive, &dive_date))
|
||||||
{
|
{
|
||||||
/* make sure we display the first date of the trip in previous summary */
|
/* make sure we display the first date of the trip in previous summary */
|
||||||
if (first_trip_dive && last_trip_dive && last_trip_dive->when < first_trip_dive->when)
|
if (last_trip_dive)
|
||||||
gtk_tree_store_set(treestore, &parent_iter,
|
gtk_tree_store_set(treestore, &parent_iter,
|
||||||
|
DIVE_NR, group_size,
|
||||||
DIVE_DATE, last_trip_dive->when,
|
DIVE_DATE, last_trip_dive->when,
|
||||||
DIVE_LOCATION, last_trip_dive->location,
|
DIVE_LOCATION, last_location,
|
||||||
-1);
|
-1);
|
||||||
first_trip_dive = dive;
|
|
||||||
|
|
||||||
gtk_tree_store_append(treestore, &parent_iter, NULL);
|
gtk_tree_store_append(treestore, &parent_iter, NULL);
|
||||||
gtk_tree_store_set(treestore, &parent_iter,
|
gtk_tree_store_set(treestore, &parent_iter,
|
||||||
DIVE_INDEX, -NEW_TRIP,
|
DIVE_INDEX, -NEW_TRIP,
|
||||||
DIVE_NR, -NEW_TRIP,
|
DIVE_NR, 1,
|
||||||
DIVE_DATE, dive_date,
|
|
||||||
DIVE_LOCATION, dive->location,
|
|
||||||
DIVE_TEMPERATURE, 0,
|
DIVE_TEMPERATURE, 0,
|
||||||
DIVE_SAC, 0,
|
DIVE_SAC, 0,
|
||||||
-1);
|
-1);
|
||||||
|
|
||||||
|
group_size = 0;
|
||||||
|
/* This might be NULL */
|
||||||
|
last_location = dive->location;
|
||||||
}
|
}
|
||||||
|
group_size++;
|
||||||
last_trip_dive = dive;
|
last_trip_dive = dive;
|
||||||
|
if (dive->location)
|
||||||
|
last_location = dive->location;
|
||||||
update_cylinder_related_info(dive);
|
update_cylinder_related_info(dive);
|
||||||
gtk_tree_store_append(treestore, &iter, &parent_iter);
|
gtk_tree_store_append(treestore, &iter, &parent_iter);
|
||||||
gtk_tree_store_set(treestore, &iter,
|
gtk_tree_store_set(treestore, &iter,
|
||||||
|
@ -957,6 +963,14 @@ static void fill_dive_list(void)
|
||||||
-1);
|
-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* make sure we display the first date of the trip in previous summary */
|
||||||
|
if (last_trip_dive)
|
||||||
|
gtk_tree_store_set(treestore, &parent_iter,
|
||||||
|
DIVE_NR, group_size,
|
||||||
|
DIVE_DATE, last_trip_dive->when,
|
||||||
|
DIVE_LOCATION, last_location,
|
||||||
|
-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(GTK_TREE_MODEL(dive_list.model), &iter)) {
|
||||||
GtkTreeSelection *selection;
|
GtkTreeSelection *selection;
|
||||||
|
@ -1035,6 +1049,20 @@ static void realize_cb(GtkWidget *tree_view, gpointer userdata)
|
||||||
gtk_widget_grab_focus(tree_view);
|
gtk_widget_grab_focus(tree_view);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Double-clicking on a group entry will expand a collapsed group
|
||||||
|
* and vice versa.
|
||||||
|
*/
|
||||||
|
static void collapse_expand(GtkTreeView *tree_view, GtkTreePath *path)
|
||||||
|
{
|
||||||
|
if (!gtk_tree_view_row_expanded(tree_view, path))
|
||||||
|
gtk_tree_view_expand_row(tree_view, path, FALSE);
|
||||||
|
else
|
||||||
|
gtk_tree_view_collapse_row(tree_view, path);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Double-click on a dive list */
|
||||||
static void row_activated_cb(GtkTreeView *tree_view,
|
static void row_activated_cb(GtkTreeView *tree_view,
|
||||||
GtkTreePath *path,
|
GtkTreePath *path,
|
||||||
GtkTreeViewColumn *column,
|
GtkTreeViewColumn *column,
|
||||||
|
@ -1045,9 +1073,13 @@ static void row_activated_cb(GtkTreeView *tree_view,
|
||||||
|
|
||||||
if (!gtk_tree_model_get_iter(GTK_TREE_MODEL(dive_list.model), &iter, path))
|
if (!gtk_tree_model_get_iter(GTK_TREE_MODEL(dive_list.model), &iter, path))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
gtk_tree_model_get(GTK_TREE_MODEL(dive_list.model), &iter, DIVE_INDEX, &index, -1);
|
gtk_tree_model_get(GTK_TREE_MODEL(dive_list.model), &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);
|
||||||
|
return;
|
||||||
|
}
|
||||||
edit_dive_info(get_dive(index));
|
edit_dive_info(get_dive(index));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue