From e8341288b3bac1e9dbbc39fcf48f03dd43026ee4 Mon Sep 17 00:00:00 2001 From: Bryan Schumaker Date: Wed, 19 Oct 2011 10:00:01 -0400 Subject: [PATCH] ocarina: Songlist improvements - Function pointers for specific tasks - Change label text - Use libsaria namespaces --- ocarina/library.cpp | 23 +++++++------ ocarina/settings/library.cpp | 3 +- ocarina/songlist/songlist.cpp | 62 ++++++++++++++++++++++------------- ocarina/songlist/songlist.h | 18 ++++++++-- 4 files changed, 71 insertions(+), 35 deletions(-) diff --git a/ocarina/library.cpp b/ocarina/library.cpp index 7b45f2e7..06662df1 100644 --- a/ocarina/library.cpp +++ b/ocarina/library.cpp @@ -12,26 +12,29 @@ using namespace std; static SongList library_list; -static void fill_library(); +void ocarina_library_refresh(); +static void library_insert(Track &); + +struct SongListFuncs library_funcs; void library_init() { - library_list.init("Library"); + library_funcs.for_each = libsaria::library::for_each; + library_funcs.insert_track = library_insert; + library_funcs.size = libsaria::library::size; + + library_list.init("Library", &library_funcs); add_page(library_list.get_label(), library_list.get_window(), true); - fill_library(); + ocarina_library_refresh(); } -static void fill_library() +static void library_insert(Track &track) { - list track_list; - libsaria::library_list(track_list); - print("track list size: "); - println(track_list.size()); - library_list.insert(track_list); + library_list.insert(track); } void ocarina_library_refresh() { library_list.clear(); - fill_library(); + library_list.fill(); } diff --git a/ocarina/settings/library.cpp b/ocarina/settings/library.cpp index eff897a9..7409fd3a 100644 --- a/ocarina/settings/library.cpp +++ b/ocarina/settings/library.cpp @@ -15,7 +15,7 @@ static void on_click_add(GtkWidget *b, GdkEvent *e, gpointer d) string dir = ocarina_choose_dir(); if (dir != "" ) { println("Scanning dir: " + dir); - libsaria::add_library(dir); + libsaria::library::add_path(dir); } } @@ -38,4 +38,5 @@ void library_settings_init() gtk_widget_show(library_settings); gtk_widget_show(add_button); add_settings_page("Library", library_settings); + println(libsaria::library::size()); } diff --git a/ocarina/songlist/songlist.cpp b/ocarina/songlist/songlist.cpp index 6d19b024..cb31ff3a 100644 --- a/ocarina/songlist/songlist.cpp +++ b/ocarina/songlist/songlist.cpp @@ -1,4 +1,7 @@ +#include +using namespace std; + #include #include #include @@ -26,7 +29,7 @@ static void songlist_row_activated(GtkTreeView *treeview, GtkTreePath *path, gtk_tree_model_get(model, &iter, 0, &inode, -1); print("Double click! "); println(inode); - libsaria::play_id(inode); + libsaria::library::play_id(inode); } void SongList::add_column(unsigned int index) @@ -46,8 +49,11 @@ void SongList::add_column(unsigned int index) * I need an init() function to set up the scrolled window AFTER * the gtk_init() function has been called. */ -void SongList::init(string text) +void SongList::init(string text, SongListFuncs *funcs) { + list_funcs = funcs; + name = text; + window = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(window), GTK_POLICY_AUTOMATIC, @@ -85,6 +91,18 @@ GtkWidget *SongList::get_label() return label; } +void SongList::set_label_text() +{ + string res; + stringstream stream; + + stream << name << " ("; + stream << list_funcs->size() << ")"; + res = stream.str(); + + gtk_label_set_text(GTK_LABEL(label), res.c_str()); +} + void SongList::freeze() { gtk_widget_freeze_child_notify(treeview); @@ -104,25 +122,25 @@ void SongList::clear() thaw(); } -void SongList::insert(list &track_list) +void SongList::insert(Track &track) { - int ins_next = 0; - Track *track; - list::iterator it; - - freeze(); - for (it = track_list.begin(); it != track_list.end(); it++) { - track = &(*it); - gtk_list_store_insert_with_values(liststore, NULL, ins_next, - 0, track->get_inode(), - 1, track->get_track(), - 2, track->get_title().c_str(), - 3, track->get_lenstr().c_str(), - 4, track->get_artist().c_str(), - 5, track->get_album().c_str(), - 6, track->get_year(), - -1); - ins_next++; - } - thaw(); + gtk_list_store_insert_with_values(liststore, NULL, ins_next, + 0, track.get_inode(), + 1, track.get_track(), + 2, track.get_title().c_str(), + 3, track.get_lenstr().c_str(), + 4, track.get_artist().c_str(), + 5, track.get_album().c_str(), + 6, track.get_year(), + -1); + ins_next++; +} + +void SongList::fill() +{ + freeze(); + ins_next = 0; + list_funcs->for_each(list_funcs->insert_track); + thaw(); + set_label_text(); } diff --git a/ocarina/songlist/songlist.h b/ocarina/songlist/songlist.h index 276bf586..9ffb28bf 100644 --- a/ocarina/songlist/songlist.h +++ b/ocarina/songlist/songlist.h @@ -8,9 +8,21 @@ #include using namespace std; +/* Make this a class to inherit from? */ +struct SongListFuncs +{ + void (*for_each)(void (*)(Track &)); + void (*insert_track)(Track &); + unsigned int (*size)(); +}; + class SongList { private: + int ins_next; + SongListFuncs *list_funcs; + string name; + GtkWidget *window; GtkWidget *label; @@ -18,6 +30,7 @@ class SongList GtkListStore *liststore; GtkCellRenderer *text_cell; + void set_label_text(); void add_column(unsigned int); void freeze(); void thaw(); @@ -26,11 +39,12 @@ class SongList SongList(); ~SongList(); - void init(string); + void init(string, SongListFuncs *); GtkWidget *get_window(); GtkWidget *get_label(); - void insert(list &track_list); + void insert(Track &); + void fill(); void clear(); };