summaryrefslogtreecommitdiffstats
path: root/divelist.c
diff options
context:
space:
mode:
authorGravatar Dirk Hohndel <dirk@hohndel.org>2012-08-17 15:03:57 -0700
committerGravatar Dirk Hohndel <dirk@hohndel.org>2012-08-17 15:08:50 -0700
commit9e9ba73b3d21c2184c16f3ba5cf3a71f7c662a55 (patch)
tree2096b0a2b805e27de66f6fb418b3e60f1b878ea7 /divelist.c
parentbc1ff9a1213e4c2a0c135974cbce03bc7614d7b5 (diff)
downloadsubsurface-9e9ba73b3d21c2184c16f3ba5cf3a71f7c662a55.tar.gz
Another selection fix
The corner cases are getting more and more artificial. Without this patch, the following can happen: Select one or more dives in an (expanded) dive trip. Now collapse that trip with the little triangle. Select a different trip. The previously selected dive(s) are still part of the selection (as you can see, for example, in the statistics tab). With this patch the scenario above works as intended (all the dives in the new trip are selected), but we have another corner case: Just as before, select one or more dives in an expanded dive trip. Collapse that trip and ctrl-click on another trip. Now you lose the originally selected dives. Frankly, if you ctrl-click to add more dives to your selection - just don't collapse the trips the dives are in? As this new corner case seems even more artificial than the previous one, I consider this patch an improvement. But fundamentally I am just battling all the ways in which gtk's selection handling is messed up. When I get the selection call back I cannot tell if this is a new selection or an incremental selection (i.e., a shift-click or ctrl-click). Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
Diffstat (limited to 'divelist.c')
-rw-r--r--divelist.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/divelist.c b/divelist.c
index b1b74d45a..0f5c90002 100644
--- a/divelist.c
+++ b/divelist.c
@@ -152,6 +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) */
@@ -229,12 +234,21 @@ gboolean modify_selection_cb(GtkTreeSelection *selection, GtkTreeModel *model,
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) {