From 83a21863b99af07ab7da61165cc5ee93ac98e03a Mon Sep 17 00:00:00 2001 From: Anna Schumaker Date: Tue, 4 Apr 2017 11:24:56 -0400 Subject: [PATCH] gui/sidebar: Select the current playlist on startup Signed-off-by: Anna Schumaker --- gui/playlist.c | 18 +++++++++++------- gui/playlists/artist.c | 12 ++++++++++++ gui/playlists/library.c | 11 +++++++++++ gui/playlists/system.c | 19 +++++++++++++++++++ gui/playlists/user.c | 12 ++++++++++++ gui/sidebar.c | 12 ++++++++++++ include/gui/playlists/artist.h | 3 +++ include/gui/playlists/library.h | 3 +++ include/gui/playlists/system.h | 3 +++ include/gui/playlists/user.h | 3 +++ include/gui/sidebar.h | 3 +++ 11 files changed, 92 insertions(+), 7 deletions(-) diff --git a/gui/playlist.c b/gui/playlist.c index 13985094..bce54d61 100644 --- a/gui/playlist.c +++ b/gui/playlist.c @@ -15,6 +15,13 @@ static void (*update_size[PL_MAX_TYPE])(struct playlist *) = { [PL_USER] = gui_pl_user_update, }; +static void (*select_playlist[PL_MAX_TYPE])(struct playlist *) = { + [PL_SYSTEM] = gui_pl_system_select, + [PL_ARTIST] = gui_pl_artist_select, + [PL_LIBRARY] = gui_pl_library_select, + [PL_USER] = gui_pl_user_select, +}; + static inline void __gui_playlist_update_size(struct playlist *playlist) { update_size[playlist->pl_type](playlist); @@ -101,19 +108,16 @@ static bool __playlist_erase(struct queue *queue, struct track *track) bool __gui_playlist_init_idle() { - GtkTreeSelection *selection; - GtkTreeModel *filter; - GtkTreeIter iter; + struct playlist *playlist = playlist_cur(); + GtkTreeModel *filter = GTK_TREE_MODEL(gui_sidebar_filter()); + GtkTreeIter iter; - filter = GTK_TREE_MODEL(gui_sidebar_filter()); - selection = gtk_tree_view_get_selection(gui_sidebar_treeview()); gtk_tree_model_get_iter_first(filter, &iter); - gtk_tree_selection_select_iter(selection, &iter); - do { gui_sidebar_filter_set_expand(&iter); } while (gtk_tree_model_iter_next(filter, &iter)); + select_playlist[playlist->pl_type](playlist); return true; } diff --git a/gui/playlists/artist.c b/gui/playlists/artist.c index 38b1ba8e..3e0ec995 100644 --- a/gui/playlists/artist.c +++ b/gui/playlists/artist.c @@ -56,3 +56,15 @@ void gui_pl_artist_update(struct playlist *playlist) if (gui_sidebar_iter_find(&child, playlist->pl_name, playlist->pl_type)) gui_sidebar_iter_update(&child); } + +void gui_pl_artist_select(struct playlist *playlist) +{ + GtkTreeIter iter, child; + + if (!__gui_pl_artist_header(&iter)) + return; + if (!gui_sidebar_iter_down(&iter, &child)) + return; + if (gui_sidebar_iter_find(&child, playlist->pl_name, playlist->pl_type)) + gui_sidebar_iter_select(&child); +} diff --git a/gui/playlists/library.c b/gui/playlists/library.c index b656fc67..1e8bf5d5 100644 --- a/gui/playlists/library.c +++ b/gui/playlists/library.c @@ -104,3 +104,14 @@ void gui_pl_library_update(struct playlist *playlist) if (gui_sidebar_iter_find(&child, playlist->pl_name, playlist->pl_type)) gui_sidebar_iter_update(&child); } + +void gui_pl_library_select(struct playlist *playlist) +{ + GtkTreeIter iter, child; + if (!__gui_pl_library_header(&iter)) + return; + if (!gui_sidebar_iter_down(&iter, &child)) + return; + if (gui_sidebar_iter_find(&child, playlist->pl_name, playlist->pl_type)) + gui_sidebar_iter_select(&child); +} diff --git a/gui/playlists/system.c b/gui/playlists/system.c index 2078ac5d..f21448d0 100644 --- a/gui/playlists/system.c +++ b/gui/playlists/system.c @@ -106,6 +106,25 @@ void gui_pl_system_update(struct playlist *playlist) gui_sidebar_iter_update(&iter); } +void gui_pl_system_select(struct playlist *playlist) +{ + GtkTreeIter iter; + + if (__gui_pl_system_is_playlist(playlist)) { + if (!__gui_pl_system_find_descend_header(&iter, "Playlists")) + return; + } else if (__gui_pl_system_is_dynamic(playlist)) { + if (!__gui_pl_system_find_descend_header(&iter, "Dynamic")) + return; + } else { + if (!gui_sidebar_iter_first(&iter)) + return; + } + + if (gui_sidebar_iter_find(&iter, playlist->pl_name, playlist->pl_type)) + gui_sidebar_iter_select(&iter); +} + void gui_pl_system_track_loaded(struct track *track) { gtk_toggle_button_set_active(gui_favorite_button(), diff --git a/gui/playlists/user.c b/gui/playlists/user.c index 4c9e04bd..101b865d 100644 --- a/gui/playlists/user.c +++ b/gui/playlists/user.c @@ -96,6 +96,18 @@ void gui_pl_user_update(struct playlist *playlist) gui_sidebar_iter_update(&child); } +void gui_pl_user_select(struct playlist *playlist) +{ + GtkTreeIter iter, child; + + if (!__gui_pl_user_header(&iter)) + return; + if (!gui_sidebar_iter_down(&iter, &child)) + return; + if (gui_sidebar_iter_find(&child, playlist->pl_name, playlist->pl_type)) + gui_sidebar_iter_select(&child); +} + GList *gui_pl_user_list(void) { struct db_entry *user, *next; diff --git a/gui/sidebar.c b/gui/sidebar.c index 3dca1391..2b116380 100644 --- a/gui/sidebar.c +++ b/gui/sidebar.c @@ -305,6 +305,18 @@ void gui_sidebar_iter_update(GtkTreeIter *iter) g_free(text); } +void gui_sidebar_iter_select(GtkTreeIter *iter) +{ + GtkTreeSelection *selection; + GtkTreeIter filter; + + gtk_tree_model_filter_convert_child_iter_to_iter(gui_sidebar_filter(), + &filter, iter); + + selection = gtk_tree_view_get_selection(gui_sidebar_treeview()); + gtk_tree_selection_select_iter(selection, &filter); +} + void gui_sidebar_filter_path_select(GtkTreePath *path) { GtkTreeModel *model = GTK_TREE_MODEL(gui_sidebar_filter()); diff --git a/include/gui/playlists/artist.h b/include/gui/playlists/artist.h index 2c8872ec..16a4bada 100644 --- a/include/gui/playlists/artist.h +++ b/include/gui/playlists/artist.h @@ -13,4 +13,7 @@ bool gui_pl_artist_add(struct playlist *); /* Called to update an artist playlist. */ void gui_pl_artist_update(struct playlist *); +/* Called to select an artist playlist. */ +void gui_pl_artist_select(struct playlist *); + #endif /* OCARINA_GUI_PLAYLISTS_ARTIST_H */ diff --git a/include/gui/playlists/library.h b/include/gui/playlists/library.h index 3e9f9bd2..2185c57c 100644 --- a/include/gui/playlists/library.h +++ b/include/gui/playlists/library.h @@ -13,4 +13,7 @@ bool gui_pl_library_add(const gchar *); /* Called to update a library path. */ void gui_pl_library_update(struct playlist *); +/* Called to select a library playlist. */ +void gui_pl_library_select(struct playlist *); + #endif /* OCARINA_GUI_PLAYLISTS_LIBRARY_H */ diff --git a/include/gui/playlists/system.h b/include/gui/playlists/system.h index 86290f58..c511cf7a 100644 --- a/include/gui/playlists/system.h +++ b/include/gui/playlists/system.h @@ -11,6 +11,9 @@ void gui_pl_system_init(); /* Called to update a system playlist. */ void gui_pl_system_update(struct playlist *); +/* Called to select a system playlist. */ +void gui_pl_system_select(struct playlist *); + /* Called to set favorites and hidden button states. */ void gui_pl_system_track_loaded(struct track *); diff --git a/include/gui/playlists/user.h b/include/gui/playlists/user.h index 0d2b26d4..059e63fa 100644 --- a/include/gui/playlists/user.h +++ b/include/gui/playlists/user.h @@ -16,6 +16,9 @@ struct playlist *gui_pl_user_add_dialog(void); /* Called to update a user playlist. */ void gui_pl_user_update(struct playlist *); +/* Called to select a user playlist. */ +void gui_pl_user_select(struct playlist *); + /* * Called to get a (sorted) list of user playlists. * Note: The caller is responsible for freeing the list with g_list_free(). diff --git a/include/gui/sidebar.h b/include/gui/sidebar.h index e7339dae..c686da77 100644 --- a/include/gui/sidebar.h +++ b/include/gui/sidebar.h @@ -41,6 +41,9 @@ void gui_sidebar_iter_append_child(GtkTreeIter *, struct playlist *, /* Called to update the playlist at the current iterator. */ void gui_sidebar_iter_update(GtkTreeIter *); +/* Called to select the row at the current iterator. */ +void gui_sidebar_iter_select(GtkTreeIter *); + /* Called to set the playlist at the given iterator as the default. */ void gui_sidebar_filter_path_select(GtkTreePath *);