/* * Copyright 2016 (c) Anna Schumaker. */ #include #include #include #include #include #include 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); __gui_playlist_update_size(playlist_cur()); } void __playlist_row_collapsed(GtkTreeView *treeview, GtkTreeIter *iter, GtkTreePath *path, gpointer data) { gui_sidebar_filter_row_expanded(iter, false); } void __playlist_row_expanded(GtkTreeView *treeview, GtkTreeIter *iter, GtkTreePath *path, gpointer data) { gui_sidebar_filter_row_expanded(iter, true); } static void *__playlist_init(struct queue *queue, void *data) { struct playlist *playlist = (struct playlist *)data; if (playlist->pl_type == PL_ARTIST) gui_pl_artist_add(playlist); return playlist; } static void __playlist_deinit(struct queue *queue) { gui_filter_clear_search(queue->q_private); } static void __playlist_added(struct queue *queue, unsigned int row) { gui_model_add(queue->q_private, row); __gui_playlist_update_size(queue->q_private); } static void __playlist_removed(struct queue *queue, unsigned int row) { gui_model_remove(queue->q_private, row); __gui_playlist_update_size(queue->q_private); } static void __playlist_cleared(struct queue *queue, unsigned int n) { gui_model_clear(queue->q_private, n); __gui_playlist_update_size(queue->q_private); } static void __playlist_updated(struct queue *queue, unsigned int n) { gui_model_update(queue->q_private, n); } static bool __playlist_erase(struct queue *queue, struct track *track) { struct playlist *playlist = queue->q_private; enum playlist_type_t type = playlist->pl_type; const gchar *name = playlist->pl_name; switch (type) { case PL_SYSTEM: if (string_match(name, "Collection")) name = "Hidden"; else if (!string_match(name, "Favorites") && !string_match(name, "Hidden") && !string_match(name, "Queued Tracks")) break; case PL_USER: playlist_remove(type, name, track); default: break; }; return false; } bool __gui_playlist_init_idle() { GtkTreeSelection *selection; GtkTreeModel *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); return true; } void gui_playlist_init() { gui_pl_system_init(); gui_pl_artist_init(); gui_pl_user_init(); gui_pl_library_init(); idle_schedule(IDLE_SYNC, __gui_playlist_init_idle, NULL); } const gchar *gui_playlist_cur() { if (gui_model_get_playlist()) return gui_model_get_playlist()->pl_name; return NULL; } struct queue_ops playlist_ops = { .qop_init = __playlist_init, .qop_deinit = __playlist_deinit, .qop_added = __playlist_added, .qop_erase = __playlist_erase, .qop_removed = __playlist_removed, .qop_cleared = __playlist_cleared, .qop_updated = __playlist_updated, };