diff --git a/gui/treeview.c b/gui/treeview.c index f16dd5d6..dcabf222 100644 --- a/gui/treeview.c +++ b/gui/treeview.c @@ -167,4 +167,23 @@ void gui_treeview_set_playlist(struct playlist *playlist) __gui_treeview_clear_sorting(); __gui_treeview_set_sort_indicators(); + + gui_treeview_scroll(); +} + +void gui_treeview_scroll() +{ + struct playlist *playlist = gui_model_get_playlist(); + GtkTreePath *path; + + if (!playlist || (int)playlist->pl_queue.q_cur.it_pos < 0) + return; + + path = gui_filter_path_from_index(playlist->pl_queue.q_cur.it_pos); + if (!path) + return; + + gtk_tree_view_set_cursor(gui_treeview(), path, NULL, false); + gtk_tree_view_scroll_to_cell(gui_treeview(), path, NULL, true, 0.5, 0.5); + gtk_tree_path_free(path); } diff --git a/gui/view.c b/gui/view.c index b1e3b765..4f331791 100644 --- a/gui/view.c +++ b/gui/view.c @@ -300,24 +300,11 @@ void gui_view_init() void gui_view_set_playlist(struct playlist *playlist) { - gui_filter_set_playlist(playlist); - gui_view_scroll(); + gui_treeview_set_playlist(playlist); } void gui_view_scroll() { - struct playlist *playlist = gui_model_get_playlist(); - struct queue *queue = playlist ? &playlist->pl_queue : NULL; - GtkTreePath *path; - - if (!queue || (int)queue->q_cur.it_pos < 0 || view_no_scroll) - return; - - path = gui_filter_path_from_index(queue->q_cur.it_pos); - if (!path) - return; - - gtk_tree_view_set_cursor(view_treeview, path, NULL, false); - gtk_tree_view_scroll_to_cell(view_treeview, path, NULL, TRUE, 0.5, 0.5); - gtk_tree_path_free(path); + if (!view_no_scroll) + gui_treeview_scroll(); } diff --git a/include/gui/treeview.h b/include/gui/treeview.h index 55bc6a95..c4996c3c 100644 --- a/include/gui/treeview.h +++ b/include/gui/treeview.h @@ -14,6 +14,9 @@ void gui_treeview_deinit(); /* Called to set the current playlist. */ void gui_treeview_set_playlist(struct playlist *); +/* Called to scroll the treeview to the current track. */ +void gui_treeview_scroll(); + /* Called to access the treeview widget. */ static inline GtkTreeView *gui_treeview() { diff --git a/share/ocarina/ocarina.ui b/share/ocarina/ocarina.ui index 1d290fa7..06cbd28e 100644 --- a/share/ocarina/ocarina.ui +++ b/share/ocarina/ocarina.ui @@ -852,7 +852,7 @@ audio-volume-medium False Type here to filter - + diff --git a/tests/gui/treeview.c b/tests/gui/treeview.c index 3e5dc8f2..1f6b668f 100644 --- a/tests/gui/treeview.c +++ b/tests/gui/treeview.c @@ -12,10 +12,33 @@ struct core_init_data init_data = {}; void test_treeview_init() { + GtkTreePath *path; + g_assert_nonnull(gui_treeview()); g_assert_true(GTK_IS_TREE_VIEW(gui_treeview())); g_assert(gtk_tree_view_get_model(gui_treeview()) == GTK_TREE_MODEL(gui_filter_get())); + + /* No scrolling without a playlist. */ + gui_treeview_scroll(); + gtk_tree_view_get_cursor(gui_treeview(), &path, NULL); + g_assert_null(path); + + gui_treeview_set_playlist(playlist_get(PL_SYSTEM, "Collection")); + g_assert(gui_model_get_playlist() == + playlist_get(PL_SYSTEM, "Collection")); + + /* No scrolling when playlist index is -1. */ + gui_treeview_scroll(); + gtk_tree_view_get_cursor(gui_treeview(), &path, NULL); + g_assert_null(path); + + /* Okay, NOW we can scroll! */ + playlist_get(PL_SYSTEM, "Collection")->pl_queue.q_cur.it_pos = 4; + gui_treeview_scroll(); + gtk_tree_view_get_cursor(gui_treeview(), &path, NULL); + g_assert_nonnull(path); + g_assert_cmpuint(gui_filter_path_get_track(path)->tr_track, ==, 5); } void test_treeview_sort() @@ -119,6 +142,7 @@ int main(int argc, char **argv) gui_model_init(); gui_filter_init(); gui_treeview_init(); + playlist_new(PL_LIBRARY, "tests/Music/Hyrule Symphony"); while (idle_run_task()) {} g_test_init(&argc, &argv, NULL);