From f550d45811def97c77a9e64471484abd1cd42b9f Mon Sep 17 00:00:00 2001 From: Anna Schumaker Date: Sun, 21 Aug 2016 12:49:07 -0400 Subject: [PATCH] gui/filter: Add a function for converting GtkTreePaths into tracks Signed-off-by: Anna Schumaker --- gui/filter.c | 14 ++++++++++++++ gui/view.c | 15 +++------------ include/gui/filter.h | 3 +++ tests/gui/filter.c | 15 ++++++++++++++- 4 files changed, 34 insertions(+), 13 deletions(-) diff --git a/gui/filter.c b/gui/filter.c index 2b3ef199..fdd801da 100644 --- a/gui/filter.c +++ b/gui/filter.c @@ -7,6 +7,12 @@ static GtkTreeModelFilter *filter_model = NULL; +static inline GtkTreePath *__gui_filter_convert_path(GtkTreePath *path) +{ + return gtk_tree_model_filter_convert_path_to_child_path(filter_model, + path); +} + void gui_filter_init() { GtkTreeModel *model = GTK_TREE_MODEL(gui_model_get()); @@ -23,3 +29,11 @@ GtkTreeModelFilter *gui_filter_get() { return filter_model; } + +struct track *gui_filter_path_get_track(GtkTreePath *path) +{ + GtkTreePath *real = __gui_filter_convert_path(path); + struct track *track = real ? gui_model_path_get_track(real) : NULL; + gtk_tree_path_free(real); + return track; +} diff --git a/gui/view.c b/gui/view.c index 8b13afdd..e4dc01cc 100644 --- a/gui/view.c +++ b/gui/view.c @@ -46,15 +46,6 @@ static inline GtkTreePath *__view_filter_convert_path(GtkTreePath *orig) gui_filter_get(), orig); } -static struct track *__view_filter_get_track(GtkTreePath *orig) -{ - GtkTreePath *real = __view_filter_convert_path(orig); - struct track *track = gui_model_path_get_track(real); - - gtk_tree_path_free(real); - return track; -} - static unsigned int __view_filter_get_index(GtkTreePath *orig) { GtkTreePath *real = __view_filter_convert_path(orig); @@ -135,7 +126,7 @@ void __view_row_activated(GtkTreeView *treeview, GtkTreePath *path, GtkTreeViewColumn *col, gpointer data) { view_no_scroll = true; - audio_load(__view_filter_get_track(path)); + audio_load(gui_filter_path_get_track(path)); queue_selected(&gui_model_get_playlist()->pl_queue, gtk_tree_path_get_indices(path)[0]); view_no_scroll = false; @@ -187,7 +178,7 @@ static void __view_add_to_playlist(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data) { struct view_add_data *vad = (struct view_add_data *)data; - playlist_add(vad->vad_type, vad->vad_name, __view_filter_get_track(path)); + playlist_add(vad->vad_type, vad->vad_name, gui_filter_path_get_track(path)); } static void __view_delete_selection(GtkTreeSelection *selection) @@ -303,7 +294,7 @@ void __view_rc_add_hidden(GtkMenuItem *item, gpointer data) GList *cur = g_list_reverse(rows); while (cur) { - playlist_add(PL_SYSTEM, "Hidden", __view_filter_get_track(cur->data)); + playlist_add(PL_SYSTEM, "Hidden", gui_filter_path_get_track(cur->data)); cur = g_list_next(cur); } diff --git a/include/gui/filter.h b/include/gui/filter.h index 7aec6e0b..40919194 100644 --- a/include/gui/filter.h +++ b/include/gui/filter.h @@ -14,4 +14,7 @@ void gui_filter_deinit(); /* Called to get the filter model. */ GtkTreeModelFilter *gui_filter_get(); +/* Called to convert a filter model path into a track. */ +struct track *gui_filter_path_get_track(GtkTreePath *); + #endif /* OCARINA_GUI_FILTER_H */ diff --git a/tests/gui/filter.c b/tests/gui/filter.c index 043f16c3..dc453982 100644 --- a/tests/gui/filter.c +++ b/tests/gui/filter.c @@ -37,8 +37,11 @@ struct core_init_data init_data = { void test_filter() { + struct track *track; GtkTreeModel *model; + GtkTreePath *path; GtkTreeIter iter; + unsigned int i; g_assert_nonnull(gui_filter_get()); g_assert_true(GTK_IS_TREE_MODEL_FILTER(gui_filter_get())); @@ -55,8 +58,18 @@ void test_filter() playlist_new(PL_LIBRARY, "tests/Music/Hyrule Symphony"); while (idle_run_task()) {}; - g_assert_true(gtk_tree_model_get_iter_first(model, &iter)); g_assert_cmpuint(gtk_tree_model_iter_n_children(model, NULL), ==, 13); + + g_assert_true(gtk_tree_model_get_iter_first(model, &iter)); + path = gtk_tree_model_get_path(model, &iter); + for (i = 1; i <= 13; i++) { + track = gui_filter_path_get_track(path); + g_assert_nonnull(track); + g_assert_cmpuint(track->tr_track, ==, i); + gtk_tree_path_next(path); + } + g_assert_null(gui_filter_path_get_track(path)); + gtk_tree_path_free(path); } int main(int argc, char **argv)