ocarina: Refilter the playlist

I don't change what can play as a result, but at least I can find songs
again!

Signed-off-by: Bryan Schumaker <bjschuma@gmail.com>
This commit is contained in:
Bryan Schumaker 2012-04-06 07:57:02 -04:00
parent 235ac70033
commit 3caea974fe
5 changed files with 45 additions and 4 deletions

View File

@ -14,8 +14,10 @@ namespace ocarina
GtkWidget *name;
GtkWidget *number;
GtkWidget *box;
GtkWidget *entry;
GtkWidget *treeview;
GtkListStore *liststore;
GtkTreeModel *filter;
GtkTreeSelection *treesel;
void set_label_text();
@ -36,6 +38,7 @@ namespace ocarina
void set_playlist(libsaria::Playlist *);
void renumbered(int);
void refilter();
void prepare_for_removal();
void goto_index(unsigned int);

View File

@ -16,6 +16,7 @@ namespace ocarina
void Playlist::modify_prepare()
{
gtk_widget_freeze_child_notify(treeview);
gtk_tree_view_set_model(GTK_TREE_VIEW(treeview), NULL);
}
void Playlist::insert(libsaria::Track *track, unsigned int index)
@ -35,6 +36,7 @@ namespace ocarina
void Playlist::modify_done()
{
gtk_widget_thaw_child_notify(treeview);
gtk_tree_view_set_model(GTK_TREE_VIEW(treeview), filter);
set_label_text();
}

View File

@ -18,6 +18,13 @@ static void selected_foreach_list(GtkTreeModel *model, GtkTreePath *path,
tracks->push_back(track);
}
static void do_filter(GtkWidget *entry, gpointer d)
{
string text = gtk_entry_get_text(GTK_ENTRY(entry));
ocarina::Playlist *plist = (ocarina::Playlist *)d;
plist->get_playlist()->set_filter_text(text);
}
namespace ocarina
{
@ -131,6 +138,11 @@ namespace ocarina
gtk_label_set_justify(GTK_LABEL(name), GTK_JUSTIFY_RIGHT);
gtk_misc_set_alignment(GTK_MISC(name), 1.0, 0.0);
entry = gtk_entry_new();
g_signal_connect(entry, "changed", G_CALLBACK(do_filter), this);
//g_signal_connect(entry, "key-press-event", G_CALLBACK(entry_keypress), this);
gtk_box_pack_start(GTK_BOX(box), entry, FALSE, FALSE, 0);
setup_treeview();
gtk_box_pack_start(GTK_BOX(label_box), number, FALSE, FALSE, 0);

View File

@ -46,6 +46,15 @@ static void track_selected(GtkWidget *treeview, GtkTreePath *path,
track->play_now();
}
static gboolean do_filter(GtkTreeModel *model, GtkTreeIter *iter, gpointer data)
{
libsaria::Track *track;
ocarina::Playlist *plist = (ocarina::Playlist *)data;
gtk_tree_model_get(model, iter, 0, &track, -1);
return plist->get_playlist()->is_visible(track);
}
static GtkListStore *setup_liststore(GtkWidget *treeview)
{
GtkListStore *liststore;
@ -100,6 +109,10 @@ namespace ocarina
treeview = gtk_tree_view_new();
liststore = setup_liststore(treeview);
filter = gtk_tree_model_filter_new(GTK_TREE_MODEL(liststore), NULL);
gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(filter),
do_filter, this, NULL);
treesel = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview));
gtk_tree_selection_set_mode(treesel, GTK_SELECTION_MULTIPLE);
@ -110,7 +123,7 @@ namespace ocarina
g_signal_connect(treeview, "unmap", G_CALLBACK(unmapped), this);
gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(treeview), TRUE);
gtk_tree_view_set_model(GTK_TREE_VIEW(treeview), GTK_TREE_MODEL(liststore));
gtk_tree_view_set_model(GTK_TREE_VIEW(treeview), filter);
gtk_tree_view_set_tooltip_column(GTK_TREE_VIEW(treeview), 7);
gtk_tree_view_set_search_column(GTK_TREE_VIEW(treeview), -1);
@ -121,4 +134,11 @@ namespace ocarina
gtk_box_pack_start(GTK_BOX(box), scroll_win, TRUE, TRUE, 0);
}
void Playlist::refilter()
{
modify_prepare();
gtk_tree_model_filter_refilter(GTK_TREE_MODEL_FILTER(filter));
modify_done();
}
}; /* Namespace: ocarina */

View File

@ -73,7 +73,11 @@ static void window_state(GtkWidget *widget, GdkEvent *event, gpointer data)
static gboolean key_pressed(GtkWidget *widget, GdkEvent *event, gpointer data)
{
string key = gdk_keyval_name(event->key.keyval);
println("Window handling key press (1)");
GtkWidget *focus = gtk_window_get_focus(GTK_WINDOW(win));
if (!(focus == NULL || focus == win))
return FALSE;
println("Window handling key press (1): " + key);
if (key == "l" || key == "L")
ocarina::playlist::switch_to_library();
@ -93,7 +97,7 @@ static gboolean key_pressed(GtkWidget *widget, GdkEvent *event, gpointer data)
static gboolean key_pressed_after(GtkWidget *widget, GdkEvent *event, gpointer data)
{
string key = gdk_keyval_name(event->key.keyval);
println("Window handling key press (2)");
println("Window handling key press (2): " + key);
if (key >= "0" && key <= "9") {
unsigned int k;
@ -101,7 +105,7 @@ static gboolean key_pressed_after(GtkWidget *widget, GdkEvent *event, gpointer d
s >> k;
ocarina::playlist::switch_to_plist(k);
} else if (key == "Escape")
gtk_widget_grab_focus(win);
gtk_window_set_focus(GTK_WINDOW(win), NULL);
else {
println("Unhandled key: " + key);
return FALSE;