]> git.tdb.fi Git - ext/subsurface.git/commitdiff
Merge branch 'fixes' of git://git.hohndel.org/subsurface
authorLinus Torvalds <torvalds@linux-foundation.org>
Fri, 17 Aug 2012 23:14:20 +0000 (16:14 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 17 Aug 2012 23:14:20 +0000 (16:14 -0700)
Pull dive selection fixes from Dirk Hohndel.

This hopefully fixes the common cases.  Dirk is cursing gtk.  We may
need some gtk selection guru to explain things.

* 'fixes' of git://git.hohndel.org/subsurface:
  Another selection fix
  More fiddling with the selection

1  2 
divelist.c

diff --combined divelist.c
index 5d6915256c5f08a2dea140fdd3ed884d4ed416ac,0f5c90002a7cc165b216d698e84f7bce3d62a7cf..90b7684faf877d0bef9c0bd8083cbe96c2a97108
@@@ -152,6 -152,11 +152,11 @@@ void track_unselect(int idx
  #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) */
@@@ -169,7 -174,6 +174,6 @@@ static void first_leaf(GtkTreeModel *mo
                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_model_get(GTK_TREE_MODEL(model), iter, DIVE_INDEX, diveidx, -1);
-               track_select(*diveidx);
        }
  }
  
@@@ -179,31 -183,36 +183,36 @@@ static void select_children(GtkTreeMode
                        GtkTreeIter *iter, gboolean was_selected)
  {
        int i, nr_children;
-       gboolean unexpand = FALSE;
+       gboolean expanded = FALSE;
        GtkTreeIter parent;
        GtkTreePath *tpath;
  
        memcpy(&parent, iter, sizeof(parent));
  
        tpath = gtk_tree_model_get_path(model, &parent);
-       /* stupid gtk doesn't allow us to select rows that are invisible; so if the
-          user clicks on a row that isn't expanded, we briefly expand it, select the
-          children, and then unexpand it again */
-       if(!gtk_tree_view_row_expanded(GTK_TREE_VIEW(dive_list.tree_view), tpath)) {
-               unexpand = TRUE;
-               gtk_tree_view_expand_row(GTK_TREE_VIEW(dive_list.tree_view), tpath, FALSE);
-       }
+       expanded = gtk_tree_view_row_expanded(GTK_TREE_VIEW(dive_list.tree_view), tpath);
        nr_children = gtk_tree_model_iter_n_children(model, &parent);
        for (i = 0; i < nr_children; i++) {
                gtk_tree_model_iter_nth_child(model, iter, &parent, i);
-               if (was_selected)
-                       gtk_tree_selection_unselect_iter(selection, iter);
-               else
-                       gtk_tree_selection_select_iter(selection, iter);
+               /* if the parent is expanded, just (un)select the children and we'll
+                  track their selection status in the callback
+                  otherwise  just change the selection status directly without
+                  bothering gtk */
+               if (expanded) {
+                       if (was_selected)
+                               gtk_tree_selection_unselect_iter(selection, iter);
+                       else
+                               gtk_tree_selection_select_iter(selection, iter);
+               } else {
+                       int idx;
+                       gtk_tree_model_get(model, iter, DIVE_INDEX, &idx, -1);
+                       if (was_selected)
+                               track_unselect(idx);
+                       else
+                               track_select(idx);
+               }
        }
-       if (unexpand)
-               gtk_tree_view_collapse_row(GTK_TREE_VIEW(dive_list.tree_view), tpath);
  }
  
  /* make sure that if we expand a summary row that is selected, the children show
@@@ -225,14 -234,29 +234,29 @@@ gboolean modify_selection_cb(GtkTreeSel
        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 (was_selected)
-                       track_unselect(dive_idx);
-               else
-                       track_select(dive_idx);
-               if (dive_idx < 0) {
+ #if DEBUG_SELECTION_TRACKING
+               printf("modify_selection_cb with idx %d (according to gtk was %sselected)\n",
+                       dive_idx, was_selected ? "" : "un");
+ #endif
+               if (dive_idx >= 0) {
+                       if (was_selected)
+                               track_unselect(dive_idx);
+                       else
+                               track_select(dive_idx);
+               } else {
                        select_children(model, selection, &iter, was_selected);
                }
        }
@@@ -1047,13 -1071,11 +1071,13 @@@ void edit_dive_cb(GtkWidget *menuitem, 
  
  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) {