diff --git a/gui/playlist.c b/gui/playlist.c index e718e8d4..69fb5ee0 100644 --- a/gui/playlist.c +++ b/gui/playlist.c @@ -2,75 +2,29 @@ * Copyright 2016 (c) Anna Schumaker. */ #include -#include #include -#include #include #include #include #include -static void __playlist_update_sizes(struct queue *); +static void (*update_size[PL_MAX_TYPE])(struct playlist *) = { + [PL_SYSTEM] = gui_pl_system_update, + [PL_ARTIST] = gui_pl_artist_update, + [PL_LIBRARY] = gui_pl_library_update, + [PL_USER] = gui_pl_user_update, +}; + +static inline void __gui_playlist_update_size(struct playlist *playlist) +{ + update_size[playlist->pl_type](playlist); +} void __playlist_row_activated(GtkTreeView *treeview, GtkTreePath *path, GtkTreeViewColumn *col, gpointer data) { gui_sidebar_filter_path_select(path); - __playlist_update_sizes(&playlist_cur()->pl_queue); -} - -static bool __playlist_queue_set_size(struct queue *queue, GtkTreeIter *iter) -{ - struct playlist *playlist = queue->q_private; - bool match = (gui_sidebar_iter_type(iter) == playlist->pl_type); - gchar *name = gui_sidebar_iter_name(iter); - - if (match) - match = string_match(name, playlist->pl_name); - if (match) - gui_sidebar_iter_update(iter); - g_free(name); - - return match; -} - -static void __playlist_update_sizes(struct queue *queue) -{ - struct playlist *playlist = queue->q_private; - GtkTreeModelFilter *filter; - GtkTreeIter parent, iter; - - if (playlist->pl_type == PL_LIBRARY) { - gui_pl_library_update(playlist); - return; - } else if (playlist->pl_type == PL_ARTIST) { - gui_pl_artist_update(playlist); - return; - } else if (playlist->pl_type == PL_USER) { - gui_pl_user_update(playlist); - return; - } else if (playlist->pl_type == PL_SYSTEM) { - gui_pl_system_update(playlist); - return; - } - - if (!gui_sidebar_iter_first(&parent)) - return; - - do { - if (__playlist_queue_set_size(queue, &parent)) - goto out; - if (gtk_tree_model_iter_children(gui_sidebar_model(), &iter, &parent)) { - do { - if (__playlist_queue_set_size(queue, &iter)) - goto out; - } while (gui_sidebar_iter_next(&iter)); - } - } while (gui_sidebar_iter_next(&parent)); - -out: - filter = gui_sidebar_filter(); - gtk_tree_model_filter_refilter(filter); + __gui_playlist_update_size(playlist_cur()); } static void *__playlist_init(struct queue *queue, void *data) @@ -90,19 +44,19 @@ static void __playlist_deinit(struct queue *queue) static void __playlist_added(struct queue *queue, unsigned int row) { gui_model_add(queue->q_private, row); - __playlist_update_sizes(queue); + __gui_playlist_update_size(queue->q_private); } static void __playlist_removed(struct queue *queue, unsigned int row) { gui_model_remove(queue->q_private, row); - __playlist_update_sizes(queue); + __gui_playlist_update_size(queue->q_private); } static void __playlist_cleared(struct queue *queue, unsigned int n) { gui_model_clear(queue->q_private, n); - __playlist_update_sizes(queue); + __gui_playlist_update_size(queue->q_private); } static void __playlist_updated(struct queue *queue, unsigned int n)