#include #include using namespace std; #include #include #include #include #include #include struct PathInfo { GtkWidget *widget; GtkWidget *remove; GtkWidget *update; string path; }; /* This is a gtk vbox */ static GtkWidget *library_settings = NULL; static GtkWidget *path_panels = NULL; static list path_widgets; static void on_click_add(GtkWidget *b, GdkEvent *e, gpointer d) { string dir = ocarina_choose_dir(); if (dir != "" ) { println("Scanning dir: " + dir); libsaria::library::add_path(dir); } } static void on_click_update(GtkWidget *b, GdkEvent *e, gpointer d) { libsaria::library::update(); } static void on_click_update_path(GtkWidget *b, GdkEvent *e, gpointer d) { list::iterator it; for (it = path_widgets.begin(); it != path_widgets.end(); it++) { if ((*it).update == b) { libsaria::library::update_path((*it).path); break; } } } static void on_click_remove(GtkWidget *b, GdkEvent *e, gpointer d) { list::iterator it; for (it = path_widgets.begin(); it != path_widgets.end(); it++) { if ((*it).remove == b) { libsaria::library::remove_path((*it).path); break; } } } static GtkWidget *make_add_button() { return make_text_button(GTK_STOCK_ADD, "Add to Library", on_click_add, true); } static GtkWidget *make_update_button() { return make_text_button(GTK_STOCK_REFRESH, "Update Library", on_click_update, true); } static GtkWidget *make_update_path_button() { return make_text_button(GTK_STOCK_REFRESH, "Update Path", on_click_update_path, true); } static GtkWidget *make_remove_button() { return make_text_button(GTK_STOCK_REMOVE, "Remove Path", on_click_remove, true); } static GtkWidget *markup_label(string markup) { GtkWidget *label = gtk_label_new(""); gtk_label_set_markup(GTK_LABEL(label), markup.c_str()); return label; } static GtkWidget *make_path_info(string path, unsigned int size) { stringstream stream; GtkWidget *path_label, *size_label; GtkWidget *box = gtk_vbox_new(FALSE, 0); stream << "" << path << ""; path_label = markup_label(stream.str()); stream.str(""); stream << "" << size << " files"; size_label = markup_label(stream.str()); box_pack_start(box, path_label, TRUE, TRUE, 0); box_pack_start(box, size_label, TRUE, TRUE, 0); return box; } static GtkWidget *add_buttons(GtkWidget *info_box, struct PathInfo &path) { GtkWidget *button_box = gtk_hbox_new(FALSE, 0); path.remove = make_remove_button(); path.update = make_update_path_button(); box_pack_start(button_box, info_box, TRUE, TRUE, 0); box_pack_start(button_box, path.update, FALSE, FALSE, 0); box_pack_start(button_box, path.remove, FALSE, FALSE, 0); return button_box; } static void add_library_panel(GtkWidget *content, struct PathInfo &path) { GtkWidget *panel_box = gtk_vbox_new(FALSE, 0); GtkWidget *sep = gtk_hseparator_new(); box_pack_start(panel_box, content, TRUE, TRUE, 0); box_pack_start(panel_box, sep, TRUE, TRUE, 0); box_pack_start(path_panels, panel_box, FALSE, FALSE, 0); path.widget = panel_box; path_widgets.push_back(path); } static void add_library_path(struct libsaria::library::PathInfo &info) { struct PathInfo path; GtkWidget *main_box = gtk_hbox_new(FALSE, 0); GtkWidget *info_box = make_path_info(info.path, info.size); GtkWidget *buttons = add_buttons(info_box, path); path.path = info.path; box_pack_start(main_box, buttons, TRUE, TRUE, 0); add_library_panel(main_box, path); } void library_settings_refresh() { while (path_widgets.size() != 0) { gtk_widget_destroy(path_widgets.front().widget); path_widgets.pop_front(); } libsaria::library::for_each_path(add_library_path); gtk_widget_show_all(library_settings); } void library_settings_init() { GtkWidget *button_row = gtk_hbox_new(FALSE, 0); library_settings = gtk_vbox_new(FALSE, 0); path_panels = gtk_vbox_new(FALSE, 0); libsaria::library::for_each_path(add_library_path); box_pack_start(library_settings, path_panels, FALSE, FALSE, 0); box_pack_start(library_settings, button_row, FALSE, FALSE, 0); box_pack_end(button_row, make_add_button(), FALSE, FALSE, 0); box_pack_end(button_row, make_update_button(), FALSE, FALSE, 0); gtk_widget_show_all(library_settings); add_settings_page("Library", library_settings); }