gui/playlist: Add a GtkTreeFilter to the playlist treeview

I intend to use this to hide empty playlists, but it could potentially
also be used to search for a specific playlist.

Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
This commit is contained in:
Anna Schumaker 2016-07-29 07:59:23 -04:00
parent c6e9c176d8
commit 278a54f7ec
2 changed files with 34 additions and 17 deletions

View File

@ -20,6 +20,12 @@ static bool p_init_done = false;
static void __playlist_update_sizes(struct queue *); static void __playlist_update_sizes(struct queue *);
static inline void __playlist_filter_get_iter(GtkTreeIter *iter, GtkTreeIter *child)
{
gtk_tree_model_filter_convert_iter_to_child_iter(
GTK_TREE_MODEL_FILTER(gui_builder_object("o_playlist_filter")),
child, iter);
}
static inline enum playlist_type_t __playlist_type(GtkTreeIter *iter) static inline enum playlist_type_t __playlist_type(GtkTreeIter *iter)
{ {
enum playlist_type_t type; enum playlist_type_t type;
@ -85,15 +91,16 @@ static gchar *__playlist_name(GtkTreeIter *iter)
void __playlist_selection_changed(GtkTreeSelection *selection, gpointer data) void __playlist_selection_changed(GtkTreeSelection *selection, gpointer data)
{ {
GtkTreeModel *model = GTK_TREE_MODEL(p_store); GtkTreeModel *model = GTK_TREE_MODEL(p_store);
GtkTreeIter iter, child;
struct queue *queue; struct queue *queue;
GtkTreeIter iter;
if (gtk_tree_selection_get_selected(selection, &model, &iter)) { if (gtk_tree_selection_get_selected(selection, &model, &iter)) {
__playlist_filter_get_iter(&iter, &child);
if (p_name) if (p_name)
g_free(p_name); g_free(p_name);
p_name = __playlist_name(&iter);
queue = playlist_get_queue(__playlist_type(&iter), p_name); p_name = __playlist_name(&child);
queue = playlist_get_queue(__playlist_type(&child), p_name);
gui_queue_show(gui_queue(queue)); gui_queue_show(gui_queue(queue));
} }
} }
@ -102,13 +109,14 @@ gboolean __playlist_on_select(GtkTreeSelection *selection, GtkTreeModel *model,
GtkTreePath *path, gboolean selected, gpointer data) GtkTreePath *path, gboolean selected, gpointer data)
{ {
struct queue *queue = NULL; struct queue *queue = NULL;
GtkTreeIter iter; GtkTreeIter iter, child;
gchar *name; gchar *name;
gtk_tree_model_get_iter(model, &iter, path); gtk_tree_model_get_iter(model, &iter, path);
__playlist_filter_get_iter(&iter, &child);
name = __playlist_name(&iter); name = __playlist_name(&child);
queue = playlist_get_queue(__playlist_type(&iter), name); queue = playlist_get_queue(__playlist_type(&child), name);
g_free(name); g_free(name);
return queue != NULL; return queue != NULL;
@ -119,9 +127,9 @@ bool __playlist_keypress(GtkTreeView *treeview, GdkEventKey *event,
{ {
GtkTreeSelection *selection = gtk_tree_view_get_selection(treeview); GtkTreeSelection *selection = gtk_tree_view_get_selection(treeview);
GtkTreeModel *model = GTK_TREE_MODEL(p_store); GtkTreeModel *model = GTK_TREE_MODEL(p_store);
GtkTreeIter iter, child;
gchar *name = NULL; gchar *name = NULL;
GtkTreePath *path; GtkTreePath *path;
GtkTreeIter iter;
GList *rows; GList *rows;
if (event->keyval != GDK_KEY_Delete) if (event->keyval != GDK_KEY_Delete)
@ -130,13 +138,16 @@ bool __playlist_keypress(GtkTreeView *treeview, GdkEventKey *event,
rows = gtk_tree_selection_get_selected_rows(selection, &model); rows = gtk_tree_selection_get_selected_rows(selection, &model);
path = rows->data; path = rows->data;
if (gtk_tree_model_get_iter(model, &iter, path)) if (!gtk_tree_model_get_iter(model, &iter, path))
name = __playlist_name(&iter); return false;
__playlist_filter_get_iter(&iter, &child);
name = __playlist_name(&child);
if (!name) if (!name)
goto out; goto out;
if (playlist_delete(__playlist_type(&iter), name)) if (playlist_delete(__playlist_type(&child), name))
gtk_tree_store_remove(GTK_TREE_STORE(model), &iter); gtk_tree_store_remove(GTK_TREE_STORE(model), &child);
g_free(name); g_free(name);
out: out:
g_list_free_full(rows, (GDestroyNotify)gtk_tree_path_free); g_list_free_full(rows, (GDestroyNotify)gtk_tree_path_free);
@ -147,19 +158,22 @@ void __playlist_row_activated(GtkTreeView *treeview, GtkTreePath *path,
GtkTreeViewColumn *col, gpointer data) GtkTreeViewColumn *col, gpointer data)
{ {
enum playlist_type_t type; enum playlist_type_t type;
GtkTreeIter iter, child;
GtkTreeModel *model;
struct queue *queue; struct queue *queue;
GtkTreeIter iter;
unsigned int id; unsigned int id;
gchar *name; gchar *name;
type = settings_get("core.playlist.cur.type"); type = settings_get("core.playlist.cur.type");
id = settings_get("core.playlist.cur.id"); id = settings_get("core.playlist.cur.id");
gtk_tree_model_get_iter(GTK_TREE_MODEL(p_store), &iter, path); model = GTK_TREE_MODEL(gui_builder_object("o_playlist_filter"));
gtk_tree_model_get_iter(model, &iter, path);
__playlist_filter_get_iter(&iter, &child);
name = __playlist_name(&iter); name = __playlist_name(&child);
playlist_select(__playlist_type(&iter), name); playlist_select(__playlist_type(&child), name);
__playlist_set_size(&iter, name); __playlist_set_size(&child, name);
g_free(name); g_free(name);
name = playlist_get_name(type, id); name = playlist_get_name(type, id);

View File

@ -93,6 +93,9 @@
<column type="guint"/> <column type="guint"/>
</columns> </columns>
</object> </object>
<object class="GtkTreeModelFilter" id="o_playlist_filter">
<property name="child_model">o_playlist_store</property>
</object>
<object class="GtkAdjustment" id="o_progress"> <object class="GtkAdjustment" id="o_progress">
<property name="upper">100000000000</property> <property name="upper">100000000000</property>
<property name="step_increment">1000000000</property> <property name="step_increment">1000000000</property>
@ -717,7 +720,7 @@
<object class="GtkTreeView" id="o_playlist_view"> <object class="GtkTreeView" id="o_playlist_view">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="model">o_playlist_store</property> <property name="model">o_playlist_filter</property>
<property name="headers_visible">False</property> <property name="headers_visible">False</property>
<property name="search_column">1</property> <property name="search_column">1</property>
<property name="enable_tree_lines">True</property> <property name="enable_tree_lines">True</property>