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:
parent
fa498f379c
commit
5512d46e4e
|
@ -8,6 +8,7 @@ namespace ocarina
|
|||
|
||||
void init();
|
||||
void refresh();
|
||||
void refilter();
|
||||
|
||||
}
|
||||
};
|
||||
|
|
|
@ -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);
|
||||
};
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -23,6 +23,11 @@ static void test()
|
|||
namespace ocarina
|
||||
{
|
||||
|
||||
void library::refilter()
|
||||
{
|
||||
library_list.refilter();
|
||||
}
|
||||
|
||||
void library::refresh()
|
||||
{
|
||||
library_list.clear();
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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();
|
||||
}
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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 */
|
||||
|
|
Loading…
Reference in New Issue