gui/playlist: Hide empty playlists
I need to disable filtering when adding artist playlists to avoid some weird memory corruption issues. Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
This commit is contained in:
parent
278a54f7ec
commit
84661c4797
|
@ -16,6 +16,7 @@ enum playlist_sidebar_columns {
|
||||||
|
|
||||||
static GtkTreeStore *p_store;
|
static GtkTreeStore *p_store;
|
||||||
static gchar *p_name = NULL;
|
static gchar *p_name = NULL;
|
||||||
|
static bool p_filter_enable = true;
|
||||||
static bool p_init_done = false;
|
static bool p_init_done = false;
|
||||||
|
|
||||||
static void __playlist_update_sizes(struct queue *);
|
static void __playlist_update_sizes(struct queue *);
|
||||||
|
@ -182,6 +183,22 @@ void __playlist_row_activated(GtkTreeView *treeview, GtkTreePath *path,
|
||||||
g_free(name);
|
g_free(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean __playlist_visible_func(GtkTreeModel *model, GtkTreeIter *iter,
|
||||||
|
gpointer data)
|
||||||
|
{
|
||||||
|
gchar *name;
|
||||||
|
bool show;
|
||||||
|
|
||||||
|
if (!p_filter_enable)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
name = __playlist_name(iter);
|
||||||
|
show = !playlist_get_queue(__playlist_type(iter), name) ||
|
||||||
|
(playlist_size(__playlist_type(iter), name) > 0);
|
||||||
|
g_free(name);
|
||||||
|
return show;
|
||||||
|
}
|
||||||
|
|
||||||
static bool __playlist_queue_set_size(struct queue *queue, GtkTreeIter *iter)
|
static bool __playlist_queue_set_size(struct queue *queue, GtkTreeIter *iter)
|
||||||
{
|
{
|
||||||
struct gui_queue *gq = gui_queue(queue);
|
struct gui_queue *gq = gui_queue(queue);
|
||||||
|
@ -200,6 +217,7 @@ static bool __playlist_queue_set_size(struct queue *queue, GtkTreeIter *iter)
|
||||||
static void __playlist_update_sizes(struct queue *queue)
|
static void __playlist_update_sizes(struct queue *queue)
|
||||||
{
|
{
|
||||||
GtkTreeModel *model = GTK_TREE_MODEL(p_store);
|
GtkTreeModel *model = GTK_TREE_MODEL(p_store);
|
||||||
|
GtkTreeModelFilter *filter;
|
||||||
GtkTreeIter parent, iter;
|
GtkTreeIter parent, iter;
|
||||||
|
|
||||||
if (!gtk_tree_model_get_iter_first(model, &parent))
|
if (!gtk_tree_model_get_iter_first(model, &parent))
|
||||||
|
@ -207,14 +225,18 @@ static void __playlist_update_sizes(struct queue *queue)
|
||||||
|
|
||||||
do {
|
do {
|
||||||
if (__playlist_queue_set_size(queue, &parent))
|
if (__playlist_queue_set_size(queue, &parent))
|
||||||
return;
|
goto out;
|
||||||
if (gtk_tree_model_iter_children(model, &iter, &parent)) {
|
if (gtk_tree_model_iter_children(model, &iter, &parent)) {
|
||||||
do {
|
do {
|
||||||
if (__playlist_queue_set_size(queue, &iter))
|
if (__playlist_queue_set_size(queue, &iter))
|
||||||
return;
|
goto out;
|
||||||
} while (gtk_tree_model_iter_next(model, &iter));
|
} while (gtk_tree_model_iter_next(model, &iter));
|
||||||
}
|
}
|
||||||
} while (gtk_tree_model_iter_next(model, &parent));
|
} while (gtk_tree_model_iter_next(model, &parent));
|
||||||
|
|
||||||
|
out:
|
||||||
|
filter = GTK_TREE_MODEL_FILTER(gui_builder_object("o_playlist_filter"));
|
||||||
|
gtk_tree_model_filter_refilter(filter);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void *__playlist_init(struct queue *queue, void *data)
|
static void *__playlist_init(struct queue *queue, void *data)
|
||||||
|
@ -226,8 +248,11 @@ static void *__playlist_init(struct queue *queue, void *data)
|
||||||
flags = GQ_CAN_RANDOM;
|
flags = GQ_CAN_RANDOM;
|
||||||
if (string_match(playlist->pl_name, "Queued Tracks"))
|
if (string_match(playlist->pl_name, "Queued Tracks"))
|
||||||
flags = GQ_CAN_REPEAT;
|
flags = GQ_CAN_REPEAT;
|
||||||
if (p_init_done && playlist->pl_type == PL_ARTIST)
|
if (p_init_done && playlist->pl_type == PL_ARTIST) {
|
||||||
|
p_filter_enable = false;
|
||||||
gui_playlist_add_artist(artist_find(playlist->pl_name));
|
gui_playlist_add_artist(artist_find(playlist->pl_name));
|
||||||
|
p_filter_enable = true;
|
||||||
|
}
|
||||||
return gui_queue_alloc(playlist, queue, playlist->pl_name, flags);
|
return gui_queue_alloc(playlist, queue, playlist->pl_name, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -263,9 +288,20 @@ static bool __playlist_erase(struct queue *queue, struct track *track)
|
||||||
bool __gui_playlist_init_idle()
|
bool __gui_playlist_init_idle()
|
||||||
{
|
{
|
||||||
struct db_entry *artist, *next;
|
struct db_entry *artist, *next;
|
||||||
|
GtkTreeSelection *selection;
|
||||||
|
GtkTreeModel *filter;
|
||||||
|
GtkTreeIter iter;
|
||||||
|
|
||||||
|
filter = GTK_TREE_MODEL(gui_builder_object("o_playlist_filter"));
|
||||||
|
selection = gtk_tree_view_get_selection(
|
||||||
|
GTK_TREE_VIEW(gui_builder_widget("o_playlist_view")));
|
||||||
|
gtk_tree_model_get_iter_first(filter, &iter);
|
||||||
|
gtk_tree_selection_select_iter(selection, &iter);
|
||||||
|
|
||||||
|
p_filter_enable = false;
|
||||||
db_for_each(artist, next, artist_db_get())
|
db_for_each(artist, next, artist_db_get())
|
||||||
gui_playlist_add_artist(ARTIST(artist));
|
gui_playlist_add_artist(ARTIST(artist));
|
||||||
|
p_filter_enable = true;
|
||||||
|
|
||||||
p_init_done = true;
|
p_init_done = true;
|
||||||
gui_queue_show(gui_queue(playlist_get_queue(PL_SYSTEM, "Collection")));
|
gui_queue_show(gui_queue(playlist_get_queue(PL_SYSTEM, "Collection")));
|
||||||
|
@ -274,14 +310,16 @@ bool __gui_playlist_init_idle()
|
||||||
|
|
||||||
void gui_playlist_init()
|
void gui_playlist_init()
|
||||||
{
|
{
|
||||||
GtkTreeSelection *selection;
|
GtkTreeModelFilter *filter;
|
||||||
GtkTreeView *treeview;
|
GtkTreeView *treeview;
|
||||||
GtkTreeIter parent;
|
GtkTreeIter parent;
|
||||||
GtkTreePath *path;
|
|
||||||
|
|
||||||
|
filter = GTK_TREE_MODEL_FILTER(gui_builder_object("o_playlist_filter"));
|
||||||
p_store = GTK_TREE_STORE(gui_builder_object("o_playlist_store"));
|
p_store = GTK_TREE_STORE(gui_builder_object("o_playlist_store"));
|
||||||
treeview = GTK_TREE_VIEW(gui_builder_widget("o_playlist_view"));
|
treeview = GTK_TREE_VIEW(gui_builder_widget("o_playlist_view"));
|
||||||
selection = gtk_tree_view_get_selection(treeview);
|
|
||||||
|
gtk_tree_model_filter_set_visible_func(filter, __playlist_visible_func,
|
||||||
|
NULL, NULL);
|
||||||
|
|
||||||
gtk_tree_store_insert(p_store, &parent, NULL, -1);
|
gtk_tree_store_insert(p_store, &parent, NULL, -1);
|
||||||
__playlist_set(&parent, "Queued Tracks", "audio-x-generic", PL_SYSTEM);
|
__playlist_set(&parent, "Queued Tracks", "audio-x-generic", PL_SYSTEM);
|
||||||
|
@ -291,10 +329,6 @@ void gui_playlist_init()
|
||||||
__playlist_set(&parent, "Collection", "media-optical", PL_SYSTEM);
|
__playlist_set(&parent, "Collection", "media-optical", PL_SYSTEM);
|
||||||
__playlist_set_size(&parent, "Collection");
|
__playlist_set_size(&parent, "Collection");
|
||||||
|
|
||||||
path = gtk_tree_model_get_path(GTK_TREE_MODEL(p_store), &parent);
|
|
||||||
gtk_tree_selection_select_path(selection, path);
|
|
||||||
gtk_tree_path_free(path);
|
|
||||||
|
|
||||||
gtk_tree_store_insert(p_store, &parent, NULL, -1);
|
gtk_tree_store_insert(p_store, &parent, NULL, -1);
|
||||||
__playlist_set(&parent, "History", "document-open-recent", PL_SYSTEM);
|
__playlist_set(&parent, "History", "document-open-recent", PL_SYSTEM);
|
||||||
__playlist_set_size(&parent, "History");
|
__playlist_set_size(&parent, "History");
|
||||||
|
|
|
@ -14,6 +14,7 @@ struct core_init_data init_data;
|
||||||
static void test_playlist_sidebar()
|
static void test_playlist_sidebar()
|
||||||
{
|
{
|
||||||
GtkTreeSelection *selection;
|
GtkTreeSelection *selection;
|
||||||
|
GtkTreeModelFilter *filter;
|
||||||
GtkTreeView *treeview;
|
GtkTreeView *treeview;
|
||||||
GtkTreeModel *model;
|
GtkTreeModel *model;
|
||||||
GtkTreePath *path;
|
GtkTreePath *path;
|
||||||
|
@ -23,8 +24,16 @@ static void test_playlist_sidebar()
|
||||||
|
|
||||||
treeview = GTK_TREE_VIEW(gui_builder_widget("o_playlist_view"));
|
treeview = GTK_TREE_VIEW(gui_builder_widget("o_playlist_view"));
|
||||||
selection = gtk_tree_view_get_selection(treeview);
|
selection = gtk_tree_view_get_selection(treeview);
|
||||||
|
filter = GTK_TREE_MODEL_FILTER(gui_builder_object("o_playlist_filter"));
|
||||||
model = GTK_TREE_MODEL(gui_builder_object("o_playlist_store"));
|
model = GTK_TREE_MODEL(gui_builder_object("o_playlist_store"));
|
||||||
|
|
||||||
|
playlist_add(PL_SYSTEM, "Queued Tracks", track_get(0));
|
||||||
|
playlist_add(PL_SYSTEM, "History", track_get(0));
|
||||||
|
playlist_add(PL_SYSTEM, "Favorites", track_get(0));
|
||||||
|
playlist_add(PL_SYSTEM, "Hidden", track_get(1));
|
||||||
|
gtk_tree_model_filter_refilter(filter);
|
||||||
|
gtk_tree_view_expand_all(treeview);
|
||||||
|
|
||||||
g_assert_true(gtk_tree_model_get_iter_first(model, &iter));
|
g_assert_true(gtk_tree_model_get_iter_first(model, &iter));
|
||||||
path = gtk_tree_model_get_path(model, &iter);
|
path = gtk_tree_model_get_path(model, &iter);
|
||||||
gtk_tree_selection_select_path(selection, path);
|
gtk_tree_selection_select_path(selection, path);
|
||||||
|
@ -34,16 +43,15 @@ static void test_playlist_sidebar()
|
||||||
gtk_tree_path_next(path);
|
gtk_tree_path_next(path);
|
||||||
gtk_tree_selection_select_path(selection, path);
|
gtk_tree_selection_select_path(selection, path);
|
||||||
g_assert_cmpuint(gtk_tree_selection_count_selected_rows(selection), ==, 1);
|
g_assert_cmpuint(gtk_tree_selection_count_selected_rows(selection), ==, 1);
|
||||||
gtk_tree_selection_unselect_all(selection);
|
|
||||||
g_assert_cmpstr(gui_playlist_cur(), ==, "Collection");
|
g_assert_cmpstr(gui_playlist_cur(), ==, "Collection");
|
||||||
|
|
||||||
gtk_tree_path_next(path);
|
gtk_tree_path_next(path);
|
||||||
gtk_tree_selection_select_path(selection, path);
|
gtk_tree_selection_select_path(selection, path);
|
||||||
g_assert_cmpuint(gtk_tree_selection_count_selected_rows(selection), ==, 1);
|
g_assert_cmpuint(gtk_tree_selection_count_selected_rows(selection), ==, 1);
|
||||||
gtk_tree_selection_unselect_all(selection);
|
|
||||||
g_assert_cmpstr(gui_playlist_cur(), ==, "History");
|
g_assert_cmpstr(gui_playlist_cur(), ==, "History");
|
||||||
|
|
||||||
gtk_tree_path_next(path);
|
gtk_tree_path_next(path);
|
||||||
|
gtk_tree_selection_unselect_all(selection);
|
||||||
gtk_tree_selection_select_path(selection, path);
|
gtk_tree_selection_select_path(selection, path);
|
||||||
g_assert_cmpuint(gtk_tree_selection_count_selected_rows(selection), ==, 0);
|
g_assert_cmpuint(gtk_tree_selection_count_selected_rows(selection), ==, 0);
|
||||||
|
|
||||||
|
@ -61,16 +69,7 @@ static void test_playlist_sidebar()
|
||||||
g_assert_cmpuint(gtk_tree_selection_count_selected_rows(selection), ==, 1);
|
g_assert_cmpuint(gtk_tree_selection_count_selected_rows(selection), ==, 1);
|
||||||
g_assert_cmpstr(gui_playlist_cur(), ==, "Hidden");
|
g_assert_cmpstr(gui_playlist_cur(), ==, "Hidden");
|
||||||
|
|
||||||
gtk_tree_path_next(path);
|
/* Most played and least played are both filtered out */
|
||||||
gtk_tree_selection_select_path(selection, path);
|
|
||||||
g_assert_cmpuint(gtk_tree_selection_count_selected_rows(selection), ==, 1);
|
|
||||||
g_assert_cmpstr(gui_playlist_cur(), ==, "Most Played");
|
|
||||||
|
|
||||||
gtk_tree_path_next(path);
|
|
||||||
gtk_tree_selection_select_path(selection, path);
|
|
||||||
g_assert_cmpuint(gtk_tree_selection_count_selected_rows(selection), ==, 1);
|
|
||||||
g_assert_cmpstr(gui_playlist_cur(), ==, "Least Played");
|
|
||||||
|
|
||||||
gtk_tree_path_next(path);
|
gtk_tree_path_next(path);
|
||||||
gtk_tree_selection_select_path(selection, path);
|
gtk_tree_selection_select_path(selection, path);
|
||||||
g_assert_cmpuint(gtk_tree_selection_count_selected_rows(selection), ==, 1);
|
g_assert_cmpuint(gtk_tree_selection_count_selected_rows(selection), ==, 1);
|
||||||
|
@ -89,6 +88,7 @@ int main(int argc, char **argv)
|
||||||
gui_view_init();
|
gui_view_init();
|
||||||
core_init(&argc, NULL, &init_data);
|
core_init(&argc, NULL, &init_data);
|
||||||
gui_playlist_init();
|
gui_playlist_init();
|
||||||
|
playlist_new(PL_LIBRARY, "tests/Music/Hyrule Symphony");
|
||||||
while (idle_run_task()) {}
|
while (idle_run_task()) {}
|
||||||
|
|
||||||
g_test_init(&argc, &argv, NULL);
|
g_test_init(&argc, &argv, NULL);
|
||||||
|
|
Loading…
Reference in New Issue