ocarina: Songlist improvements

- Function pointers for specific tasks
- Change label text
- Use libsaria namespaces
This commit is contained in:
Bryan Schumaker 2011-10-19 10:00:01 -04:00
parent 8cf3caeb27
commit e8341288b3
4 changed files with 71 additions and 35 deletions

View File

@ -12,26 +12,29 @@
using namespace std; using namespace std;
static SongList library_list; static SongList library_list;
static void fill_library(); void ocarina_library_refresh();
static void library_insert(Track &);
struct SongListFuncs library_funcs;
void library_init() 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); 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> track_list; library_list.insert(track);
libsaria::library_list(track_list);
print("track list size: ");
println(track_list.size());
library_list.insert(track_list);
} }
void ocarina_library_refresh() void ocarina_library_refresh()
{ {
library_list.clear(); library_list.clear();
fill_library(); library_list.fill();
} }

View File

@ -15,7 +15,7 @@ static void on_click_add(GtkWidget *b, GdkEvent *e, gpointer d)
string dir = ocarina_choose_dir(); string dir = ocarina_choose_dir();
if (dir != "" ) { if (dir != "" ) {
println("Scanning dir: " + 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(library_settings);
gtk_widget_show(add_button); gtk_widget_show(add_button);
add_settings_page("Library", library_settings); add_settings_page("Library", library_settings);
println(libsaria::library::size());
} }

View File

@ -1,4 +1,7 @@
#include <sstream>
using namespace std;
#include <ocarina/gtk.h> #include <ocarina/gtk.h>
#include <libsaria/library.h> #include <libsaria/library.h>
#include <libsaria/print.h> #include <libsaria/print.h>
@ -26,7 +29,7 @@ static void songlist_row_activated(GtkTreeView *treeview, GtkTreePath *path,
gtk_tree_model_get(model, &iter, 0, &inode, -1); gtk_tree_model_get(model, &iter, 0, &inode, -1);
print("Double click! "); print("Double click! ");
println(inode); println(inode);
libsaria::play_id(inode); libsaria::library::play_id(inode);
} }
void SongList::add_column(unsigned int index) 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 * I need an init() function to set up the scrolled window AFTER
* the gtk_init() function has been called. * 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); window = gtk_scrolled_window_new(NULL, NULL);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(window), gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(window),
GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC,
@ -85,6 +91,18 @@ GtkWidget *SongList::get_label()
return 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() void SongList::freeze()
{ {
gtk_widget_freeze_child_notify(treeview); gtk_widget_freeze_child_notify(treeview);
@ -104,25 +122,25 @@ void SongList::clear()
thaw(); thaw();
} }
void SongList::insert(list<Track> &track_list) void SongList::insert(Track &track)
{ {
int ins_next = 0; gtk_list_store_insert_with_values(liststore, NULL, ins_next,
Track *track; 0, track.get_inode(),
list<Track>::iterator it; 1, track.get_track(),
2, track.get_title().c_str(),
freeze(); 3, track.get_lenstr().c_str(),
for (it = track_list.begin(); it != track_list.end(); it++) { 4, track.get_artist().c_str(),
track = &(*it); 5, track.get_album().c_str(),
gtk_list_store_insert_with_values(liststore, NULL, ins_next, 6, track.get_year(),
0, track->get_inode(), -1);
1, track->get_track(), ins_next++;
2, track->get_title().c_str(), }
3, track->get_lenstr().c_str(),
4, track->get_artist().c_str(), void SongList::fill()
5, track->get_album().c_str(), {
6, track->get_year(), freeze();
-1); ins_next = 0;
ins_next++; list_funcs->for_each(list_funcs->insert_track);
} thaw();
thaw(); set_label_text();
} }

View File

@ -8,9 +8,21 @@
#include <string> #include <string>
using namespace std; 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 class SongList
{ {
private: private:
int ins_next;
SongListFuncs *list_funcs;
string name;
GtkWidget *window; GtkWidget *window;
GtkWidget *label; GtkWidget *label;
@ -18,6 +30,7 @@ class SongList
GtkListStore *liststore; GtkListStore *liststore;
GtkCellRenderer *text_cell; GtkCellRenderer *text_cell;
void set_label_text();
void add_column(unsigned int); void add_column(unsigned int);
void freeze(); void freeze();
void thaw(); void thaw();
@ -26,11 +39,12 @@ class SongList
SongList(); SongList();
~SongList(); ~SongList();
void init(string); void init(string, SongListFuncs *);
GtkWidget *get_window(); GtkWidget *get_window();
GtkWidget *get_label(); GtkWidget *get_label();
void insert(list<Track> &track_list); void insert(Track &);
void fill();
void clear(); void clear();
}; };