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;
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> 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();
}

View File

@ -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());
}

View File

@ -1,4 +1,7 @@
#include <sstream>
using namespace std;
#include <ocarina/gtk.h>
#include <libsaria/library.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);
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> &track_list)
void SongList::insert(Track &track)
{
int ins_next = 0;
Track *track;
list<Track>::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();
}

View File

@ -8,9 +8,21 @@
#include <string>
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> &track_list);
void insert(Track &);
void fill();
void clear();
};