#endif
}
+void clear_tracker(void)
+{
+ amount_selected = 0;
+}
+
/* when subsurface starts we want to have the last dive selected. So we simply
walk to the first leaf (and skip the summary entries - which have negative
DIVE_INDEX) */
GtkTreeIter iter;
int dive_idx;
+ /* if gtk thinks nothing is selected we should clear out our
+ tracker as well - otherwise hidden selected rows can stay
+ "stuck". The down side is that we now have a different bug:
+ If you select a dive, collapse the dive trip and ctrl-click
+ another dive trip, the initial dive is no longer selected.
+ Just don't do that, ok? */
+ if (gtk_tree_selection_count_selected_rows(selection) == 0)
+ clear_tracker();
+
if (gtk_tree_model_get_iter(model, &iter, path)) {
gtk_tree_model_get(model, &iter, DIVE_INDEX, &dive_idx, -1);
/* turns out we need to move the selectiontracker here */
#if DEBUG_SELECTION_TRACKING
- printf("modify_selection_cb with idx %d (according to gtk was %sselected) - ",
+ printf("modify_selection_cb with idx %d (according to gtk was %sselected)\n",
dive_idx, was_selected ? "" : "un");
#endif
if (dive_idx >= 0) {
GtkTreeIter *iter,
gpointer data)
{
- int val, idx;
+ int val, idx, nr;
struct tm *tm;
time_t when;
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 */
when = val;
switch(idx) {
case -NEW_TRIP:
snprintf(buffer, sizeof(buffer),
- "Trip %s, %s %d, %d",
+ "Trip %s, %s %d, %d (%d dive%s)",
weekday(tm->tm_wday),
monthname(tm->tm_mon),
- tm->tm_mday, tm->tm_year + 1900);
+ tm->tm_mday, tm->tm_year + 1900,
+ nr, nr > 1 ? "s" : "");
break;
default:
snprintf(buffer, sizeof(buffer),
static void fill_dive_list(void)
{
- int i;
+ int i, group_size;
GtkTreeIter iter, parent_iter;
GtkTreeStore *liststore, *treestore;
struct dive *last_dive = NULL;
- struct dive *first_trip_dive = NULL;
struct dive *last_trip_dive = NULL;
+ const char *last_location = NULL;
time_t dive_date;
treestore = GTK_TREE_STORE(dive_list.treemodel);
if (new_group(dive, &last_dive, &dive_date))
{
/* 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,
- DIVE_DATE, last_trip_dive->when,
- DIVE_LOCATION, last_trip_dive->location,
- -1);
- first_trip_dive = dive;
+ DIVE_NR, group_size,
+ DIVE_DATE, last_trip_dive->when,
+ DIVE_LOCATION, last_location,
+ -1);
gtk_tree_store_append(treestore, &parent_iter, NULL);
gtk_tree_store_set(treestore, &parent_iter,
DIVE_INDEX, -NEW_TRIP,
- DIVE_NR, -NEW_TRIP,
- DIVE_DATE, dive_date,
- DIVE_LOCATION, dive->location,
+ DIVE_NR, 1,
DIVE_TEMPERATURE, 0,
DIVE_SAC, 0,
-1);
+
+ group_size = 0;
+ /* This might be NULL */
+ last_location = dive->location;
}
+ group_size++;
last_trip_dive = dive;
+ if (dive->location)
+ last_location = dive->location;
update_cylinder_related_info(dive);
gtk_tree_store_append(treestore, &iter, &parent_iter);
gtk_tree_store_set(treestore, &iter,
-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();
if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(dive_list.model), &iter)) {
GtkTreeSelection *selection;
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,
GtkTreePath *path,
GtkTreeViewColumn *column,
if (!gtk_tree_model_get_iter(GTK_TREE_MODEL(dive_list.model), &iter, path))
return;
+
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 */
- if (index >= 0)
- edit_dive_info(get_dive(index));
+ if (index < 0) {
+ collapse_expand(tree_view, path);
+ return;
+ }
+ edit_dive_info(get_dive(index));
}
void add_dive_cb(GtkWidget *menuitem, gpointer data)
static void popup_divelist_menu(GtkTreeView *tree_view, GtkTreeModel *model, int button)
{
- GtkWidget *menu, *menuitem;
+ GtkWidget *menu, *menuitem, *image;
char editlabel[] = "Edit dives";
menu = gtk_menu_new();
- menuitem = gtk_menu_item_new_with_label("Add dive");
+ menuitem = gtk_image_menu_item_new_with_label("Add dive");
+ image = gtk_image_new_from_stock(GTK_STOCK_ADD, GTK_ICON_SIZE_MENU);
+ gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menuitem), image);
g_signal_connect(menuitem, "activate", G_CALLBACK(add_dive_cb), NULL);
gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
if (amount_selected) {