diff --git a/gui/playlist.c b/gui/playlist.c
index 7f93a88a..525f769c 100644
--- a/gui/playlist.c
+++ b/gui/playlist.c
@@ -20,6 +20,12 @@ static bool p_init_done = false;
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)
{
enum playlist_type_t type;
@@ -85,15 +91,16 @@ static gchar *__playlist_name(GtkTreeIter *iter)
void __playlist_selection_changed(GtkTreeSelection *selection, gpointer data)
{
GtkTreeModel *model = GTK_TREE_MODEL(p_store);
+ GtkTreeIter iter, child;
struct queue *queue;
- GtkTreeIter iter;
if (gtk_tree_selection_get_selected(selection, &model, &iter)) {
+ __playlist_filter_get_iter(&iter, &child);
if (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));
}
}
@@ -102,13 +109,14 @@ gboolean __playlist_on_select(GtkTreeSelection *selection, GtkTreeModel *model,
GtkTreePath *path, gboolean selected, gpointer data)
{
struct queue *queue = NULL;
- GtkTreeIter iter;
+ GtkTreeIter iter, child;
gchar *name;
gtk_tree_model_get_iter(model, &iter, path);
+ __playlist_filter_get_iter(&iter, &child);
- name = __playlist_name(&iter);
- queue = playlist_get_queue(__playlist_type(&iter), name);
+ name = __playlist_name(&child);
+ queue = playlist_get_queue(__playlist_type(&child), name);
g_free(name);
return queue != NULL;
@@ -119,9 +127,9 @@ bool __playlist_keypress(GtkTreeView *treeview, GdkEventKey *event,
{
GtkTreeSelection *selection = gtk_tree_view_get_selection(treeview);
GtkTreeModel *model = GTK_TREE_MODEL(p_store);
+ GtkTreeIter iter, child;
gchar *name = NULL;
GtkTreePath *path;
- GtkTreeIter iter;
GList *rows;
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);
path = rows->data;
- if (gtk_tree_model_get_iter(model, &iter, path))
- name = __playlist_name(&iter);
+ if (!gtk_tree_model_get_iter(model, &iter, path))
+ return false;
+
+ __playlist_filter_get_iter(&iter, &child);
+ name = __playlist_name(&child);
if (!name)
goto out;
- if (playlist_delete(__playlist_type(&iter), name))
- gtk_tree_store_remove(GTK_TREE_STORE(model), &iter);
+ if (playlist_delete(__playlist_type(&child), name))
+ gtk_tree_store_remove(GTK_TREE_STORE(model), &child);
g_free(name);
out:
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)
{
enum playlist_type_t type;
+ GtkTreeIter iter, child;
+ GtkTreeModel *model;
struct queue *queue;
- GtkTreeIter iter;
unsigned int id;
gchar *name;
type = settings_get("core.playlist.cur.type");
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);
- playlist_select(__playlist_type(&iter), name);
- __playlist_set_size(&iter, name);
+ name = __playlist_name(&child);
+ playlist_select(__playlist_type(&child), name);
+ __playlist_set_size(&child, name);
g_free(name);
name = playlist_get_name(type, id);
diff --git a/share/ocarina/ocarina6.glade b/share/ocarina/ocarina6.glade
index 021e0eb5..03f43427 100644
--- a/share/ocarina/ocarina6.glade
+++ b/share/ocarina/ocarina6.glade
@@ -93,6 +93,9 @@
+