From e7d2fa5c4d56c8e8798eab21fb6934691db4196c Mon Sep 17 00:00:00 2001 From: Anna Schumaker Date: Sat, 3 Sep 2016 10:39:26 -0400 Subject: [PATCH] gui/treeview: Add a function for listing selected tracks This will be used by higher layers to add tracks to playlists. Signed-off-by: Anna Schumaker --- gui/treeview.c | 19 +++++++++++++++++++ include/gui/treeview.h | 6 ++++++ tests/gui/treeview.c | 20 ++++++++++++++++++++ 3 files changed, 45 insertions(+) diff --git a/gui/treeview.c b/gui/treeview.c index 36fd4d5a..795783f2 100644 --- a/gui/treeview.c +++ b/gui/treeview.c @@ -217,3 +217,22 @@ void gui_treeview_scroll() gtk_tree_view_scroll_to_cell(gui_treeview(), path, NULL, true, 0.5, 0.5); gtk_tree_path_free(path); } + +GList *gui_treeview_list_selected_tracks(void) +{ + GList *rows, *cur, *list = NULL; + GtkTreeSelection *selection; + + selection = gtk_tree_view_get_selection(gui_treeview()); + rows = gtk_tree_selection_get_selected_rows(selection, NULL); + cur = g_list_first(rows); + + while (cur) { + list = g_list_append(list, gui_filter_path_get_track(cur->data)); + cur = g_list_next(cur); + } + + g_list_free_full(rows, (GDestroyNotify) gtk_tree_path_free); + gtk_tree_selection_unselect_all(selection); + return list; +} diff --git a/include/gui/treeview.h b/include/gui/treeview.h index c4996c3c..e8b5d54c 100644 --- a/include/gui/treeview.h +++ b/include/gui/treeview.h @@ -17,6 +17,12 @@ void gui_treeview_set_playlist(struct playlist *); /* Called to scroll the treeview to the current track. */ void gui_treeview_scroll(); +/* + * Called to get a list of selected tracks. + * NOTE: The caller is responsible for freeing the list with g_list_free(). + */ +GList *gui_treeview_list_selected_tracks(void); + /* Called to access the treeview widget. */ static inline GtkTreeView *gui_treeview() { diff --git a/tests/gui/treeview.c b/tests/gui/treeview.c index 7bf8846f..24ccbbff 100644 --- a/tests/gui/treeview.c +++ b/tests/gui/treeview.c @@ -76,7 +76,13 @@ void test_treeview_init() void test_treeview_select() { + GtkTreeSelection *selection; + struct track *track; GtkTreePath *path; + GList *list; + unsigned int i; + + selection = gtk_tree_view_get_selection(gui_treeview()); gui_treeview_set_playlist(playlist_get(PL_SYSTEM, "Collection")); g_assert(gui_model_get_playlist() == @@ -88,6 +94,20 @@ void test_treeview_select() gtk_tree_view_row_activated(gui_treeview(), path, NULL); g_assert_cmpuint(audio_cur_track()->tr_track, ==, 2); gtk_tree_path_free(path); + + gtk_tree_selection_unselect_all(selection); + g_assert_null(gui_treeview_list_selected_tracks()); + + gtk_tree_selection_select_all(selection); + list = gui_treeview_list_selected_tracks(); + g_assert_cmpuint(g_list_length(list), ==, 13); + for (i = 0; i < 13; i++) { + track = (struct track *)g_list_nth_data(list, i); + g_assert_nonnull(track); + g_assert_cmpuint(track->tr_track, ==, i + 1); + } + g_list_free(list); + g_assert_cmpuint(gtk_tree_selection_count_selected_rows(selection), ==, 0); } void test_treeview_sort()