ocarina: Filter the song list

Users enter text and non-matching songs are removed from the songlist
view (they do come back when the text is removed)
This commit is contained in:
Bryan Schumaker 2011-11-13 12:05:52 -05:00
parent fa498f379c
commit 5512d46e4e
9 changed files with 56 additions and 4 deletions

View File

@ -8,6 +8,7 @@ namespace ocarina
void init();
void refresh();
void refilter();
}
};

View File

@ -42,6 +42,7 @@ class SongList : public libsaria::SourceModel
GtkWidget *treeview;
GtkListStore *liststore;
GtkTreeModel *filter;
GtkCellRenderer *textcell;
void set_label_text();
@ -59,6 +60,7 @@ class SongList : public libsaria::SourceModel
void insert(Track &);
void fill();
void clear();
void refilter();
gint right_click(guint, guint64);
};

View File

@ -35,6 +35,12 @@ void cb_library_refresh()
library_settings_refresh();
}
void cb_refilter()
{
println("Ocarina REFILTER callback!");
ocarina::library::refilter();
}
void cb_track_loaded()
{
println("Ocarina TRACK_LOADED callback!");
@ -48,5 +54,6 @@ void setup_callbacks()
register_callback(PAUSE, cb_pause);
register_callback(IDLE_TASK_QUEUED, cb_idle_task_queued);
register_callback(LIBRARY_REFRESH, cb_library_refresh);
register_callback(REFILTER, cb_refilter);
register_callback(TRACK_LOADED, cb_track_loaded);
}

View File

@ -23,6 +23,11 @@ static void test()
namespace ocarina
{
void library::refilter()
{
library_list.refilter();
}
void library::refresh()
{
library_list.clear();

View File

@ -10,7 +10,7 @@ void SongList::freeze()
void SongList::thaw()
{
gtk_widget_thaw_child_notify(treeview);
gtk_tree_view_set_model(GTK_TREE_VIEW(treeview), GTK_TREE_MODEL(liststore));
gtk_tree_view_set_model(GTK_TREE_VIEW(treeview), filter);
}
void SongList::clear()

View File

@ -0,0 +1,17 @@
#include <libsaria/library.h>
#include <ocarina/songlist.h>
gboolean songlist_filter_func(GtkTreeModel *model, GtkTreeIter *iter, gpointer data)
{
ino_t inode;
gtk_tree_model_get(model, iter, 0, &inode, -1);
return libsaria::library::is_visible(inode);
}
void SongList::refilter()
{
freeze();
gtk_tree_model_filter_refilter(GTK_TREE_MODEL_FILTER(filter));
thaw();
}

View File

@ -31,14 +31,23 @@ static GtkListStore *setup_liststore()
return liststore;
}
static GtkWidget *setup_treeview(GtkListStore *liststore, SongList *list)
static GtkTreeModel *setup_filter(GtkListStore *liststore)
{
GtkTreeModel *filter;
filter = gtk_tree_model_filter_new(GTK_TREE_MODEL(liststore), NULL);
gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(filter),
songlist_filter_func, NULL, NULL);
return filter;
}
static GtkWidget *setup_treeview(GtkTreeModel *model, SongList *list)
{
GtkWidget *treeview = gtk_tree_view_new();
GTK_CONNECT(treeview, "row-activated", songlist_row_activated, NULL);
GTK_CONNECT(treeview, "button-release-event", songlist_button_click, list);
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), model);
return treeview;
}
@ -87,7 +96,8 @@ void SongList::init(string text, SongListFuncs *funcs, list <MenuItem> *menu)
label = setup_label(name);
textcell = setup_renderer();
liststore = setup_liststore();
treeview = setup_treeview(liststore, this);
filter = setup_filter(liststore);
treeview = setup_treeview(filter, this);
window = setup_window(treeview);
setup_columns(textcell, treeview);

View File

@ -8,6 +8,15 @@ using namespace std;
#include <libsaria/print.h>
#include "songlist.h"
void songlist_selected_inode(GtkTreeView *treeview, GtkTreePath *path, ino_t &inode)
{
GtkTreeIter iter;
GtkTreeModel *model = gtk_tree_view_get_model(treeview);
gtk_tree_model_get_iter(model, &iter, path);
gtk_tree_model_get(model, &iter, 0, &inode, -1);
}
void songlist_row_activated(GtkTreeView *treeview, GtkTreePath *path,
GtkTreeViewColumn *column, gpointer data)
{

View File

@ -5,5 +5,6 @@
void songlist_row_activated(GtkTreeView *, GtkTreePath *, GtkTreeViewColumn *, gpointer);
void songlist_button_click(GtkWidget *, GdkEvent *, gpointer);
gboolean songlist_filter_func(GtkTreeModel *, GtkTreeIter *, gpointer);
#endif /* OCARINA_SONGLIST_PRIVATE_H */