diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-12-28 22:04:43 -0800 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2012-12-28 22:35:55 -0800 |
commit | e862f7c3439f521f20b709936d5672b9b63895b4 (patch) | |
tree | ea3a43d9d2022eee84d3e475ce3ef62add8953b1 /divelist.c | |
parent | 2287dc87cfc64ecd58c6c6f82bd59203ace085d2 (diff) | |
download | subsurface-e862f7c3439f521f20b709936d5672b9b63895b4.tar.gz |
Allow sorting dives by date - without the dive trips in the dive list
We used to enable dive trips whenever we sorted by date, which can be
a bit annoying. Sometimes you really just want to sort all your dives
by date, without necessarily seeing the trip data.
So this changes the default sort to be the "dive number" table, and
then does *not* actually sort by the dive number, but instead enables
the trips, and then sorts the result by date. So the "dive number"
column - which used to be non-sortable - becomes semantically
equivalent to the old date column sorting.
And now sorting by date makes it act like sorting by depth or any
other attribute - we hide the dive trip tree, and just show the plain
list of dives (sorted by date, obviously).
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
Diffstat (limited to 'divelist.c')
-rw-r--r-- | divelist.c | 53 |
1 files changed, 48 insertions, 5 deletions
diff --git a/divelist.c b/divelist.c index bb940330c..2e2599abc 100644 --- a/divelist.c +++ b/divelist.c @@ -1286,6 +1286,49 @@ void dive_list_update_dives(void) repaint_dive(); } +static gint dive_nr_sort(GtkTreeModel *model, + GtkTreeIter *iter_a, + GtkTreeIter *iter_b, + gpointer user_data) +{ + int idx_a, idx_b; + timestamp_t when_a, when_b; + struct dive *a, *b; + dive_trip_t *tripa,*tripb; + + gtk_tree_model_get(model, iter_a, DIVE_INDEX, &idx_a, DIVE_DATE, &when_a, -1); + gtk_tree_model_get(model, iter_b, DIVE_INDEX, &idx_b, DIVE_DATE, &when_b, -1); + + if (idx_a < 0) { + a = NULL; + tripa = find_trip_by_time(when_a); + } else { + a = get_dive(idx_a); + if (a) + tripa = a->divetrip; + } + + if (idx_b < 0) { + b = NULL; + tripb = find_trip_by_time(when_b); + } else { + b = get_dive(idx_b); + if (b) + tripb = b->divetrip; + } + + if (!tripa || !tripb) + return 0; + if (tripa->when < tripb->when) + return -1; + if (tripa->when > tripb->when) + return 1; + if (a && b) + return a->when - b->when; + return 0; +} + + static struct divelist_column { const char *header; data_func_t data; @@ -1293,7 +1336,7 @@ static struct divelist_column { unsigned int flags; int *visible; } dl_column[] = { - [DIVE_NR] = { "#", nr_data_func, NULL, ALIGN_RIGHT | UNSORTABLE }, + [DIVE_NR] = { "#", nr_data_func, dive_nr_sort, ALIGN_RIGHT }, [DIVE_DATE] = { N_("Date"), date_data_func, NULL, ALIGN_LEFT }, [DIVE_RATING] = { UTF8_BLACKSTAR, star_data_func, NULL, ALIGN_LEFT }, [DIVE_DEPTH] = { N_("ft"), depth_data_func, NULL, ALIGN_RIGHT }, @@ -1328,7 +1371,7 @@ static GtkTreeViewColumn *divelist_column(struct DiveList *dl, struct divelist_c ret = tree_view_column(tree_view, index, title, data_func, flags); if (sort_func) { /* the sort functions are needed in the corresponding models */ - if (index == DIVE_DATE) + if (index == DIVE_NR) gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(treemodel), index, sort_func, NULL, NULL); else gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(listmodel), index, sort_func, NULL, NULL); @@ -2342,7 +2385,7 @@ static gboolean button_press_cb(GtkWidget *treeview, GdkEventButton *event, gpoi switching models. */ static gboolean second_call = FALSE; static GtkSortType sortorder[] = { [0 ... DIVELIST_COLUMNS - 1] = GTK_SORT_DESCENDING, }; -static int lastcol = DIVE_DATE; +static int lastcol = DIVE_NR; /* Check if this dive was selected previously and select it again in the new model; * This is used after we switch models to maintain consistent selections. @@ -2386,7 +2429,7 @@ static void update_column_and_order(int colid) second_call = FALSE; } -/* If the sort column is date (default), show the tree model. +/* If the sort column is nr (default), show the tree model. For every other sort column only show the list model. If the model changed, inform the new model of the chosen sort column and make sure the same dives are still selected. @@ -2413,7 +2456,7 @@ static void sort_column_change_cb(GtkTreeSortable *treeview, gpointer data) } else { lastcol = colid; } - if(colid == DIVE_DATE) + if(colid == DIVE_NR) dive_list.model = dive_list.treemodel; else dive_list.model = dive_list.listmodel; |