/* * Copyright 2014 (c) Anna Schumaker. */ #include #include #include #include #include static void on_library_add(unsigned int id, Library *library); static class CollectionColumns : public Gtk::TreeModelColumnRecord { public: CollectionColumns() { add(c_col_id); add(c_col_enabled); add(c_col_size); add(c_col_path); } Gtk::TreeModelColumn c_col_id; Gtk::TreeModelColumn c_col_enabled; Gtk::TreeModelColumn c_col_size; Gtk::TreeModelColumn c_col_path; } collection_cols; static Glib::RefPtr get_collection_list() { return get_object("o_collection_dirs"); } static void on_collection_ok() { std::string path; Gtk::FileChooserWidget *chooser; chooser = get_widget("o_collection_chooser"); path = chooser->get_filename(); Library *library = library::add(path); enable_idle(); on_library_add(library->id, library); } static void on_collection_update() { library :: update_all(); enable_idle(); } static void on_collection_row_activated(const Gtk::TreePath &path, Gtk::TreeViewColumn *col) { Gtk::FileChooser *chooser = get_widget("o_collection_chooser"); Glib::RefPtr list = get_collection_list(); Gtk::TreeModel::Row row = *(list->get_iter(path)); Glib::ustring dir = row[collection_cols.c_col_path]; chooser->set_current_folder(dir); } #ifndef CONFIG_TEST static #endif /* CONFIG_TEST */ void do_collection_delete() { Gtk::TreePath path; Gtk::TreeViewColumn *col; Gtk::TreeView *treeview = get_widget("o_collection_treeview"); treeview->get_cursor(path, col); if (path) { Glib::RefPtr list = get_collection_list(); Gtk::TreeModel::Row row = *(list->get_iter(path)); library :: remove(tagdb :: lookup_library(row[collection_cols.c_col_id])); list->erase(row); } } static bool on_collection_key_pressed(GdkEventKey *event) { std::string key = gdk_keyval_name(event->keyval); if (key == "Delete") { do_collection_delete(); return true; } return false; } static void on_enabled_remove_banned() { std::set::iterator it; IndexEntry *ent = playlist :: get_tracks("Banned"); if (!ent) return; for (it = ent->values.begin(); it != ent->values.end(); it++) library :: get_queue()->del(tagdb :: lookup(*it)); } #ifndef CONFIG_TEST static #endif /* CONFIG_TEST */ void on_collection_toggled(const Glib::ustring &path) { Glib::RefPtr list = get_collection_list(); Gtk::TreeModel::Row row = *(list->get_iter(path)); row[collection_cols.c_col_enabled] = !row[collection_cols.c_col_enabled]; library :: set_enabled(tagdb :: lookup_library(row[collection_cols.c_col_id]), row[collection_cols.c_col_enabled]); if (row[collection_cols.c_col_enabled] == true) on_enabled_remove_banned(); } static void on_library_add(unsigned int id, Library *library) { Gtk::TreeModel::Row row; Glib::RefPtr list = get_collection_list(); row = *(list->append()); row[collection_cols.c_col_id] = id; row[collection_cols.c_col_enabled] = library->enabled; row[collection_cols.c_col_size] = library->count; row[collection_cols.c_col_path] = library->root_path; } static void on_library_update(unsigned int id, Library *library) { Gtk::TreeModel::Row row; Glib::RefPtr list = get_collection_list(); Gtk::TreeModel::Children children = list->children(); for (Gtk::TreeModel::Children::iterator it = children.begin(); it != children.end(); it++) { row = *it; if (row[collection_cols.c_col_id] == id) row[collection_cols.c_col_size] = library->count; } } void collection_mgr_init() { Gtk::TreeView *treeview = get_widget("o_collection_treeview"); Glib::RefPtr list = get_collection_list(); Glib::RefPtr toggle; toggle = get_object("o_collection_toggle"); connect_button("o_collection_ok", on_collection_ok); connect_button("o_collection_update", on_collection_update); list->set_sort_column(collection_cols.c_col_path, Gtk::SORT_ASCENDING); treeview->signal_row_activated().connect(sigc::ptr_fun(on_collection_row_activated)); treeview->signal_key_press_event().connect(sigc::ptr_fun(on_collection_key_pressed)); toggle->signal_toggled().connect(sigc::ptr_fun(on_collection_toggled)); } void collection_mgr_init2() { Database *db; Database::iterator it; db = &tagdb :: get_library_db(); for (it = db->begin(); it != db->end(); it = db->next(it)) on_library_add((*it)->id, *it); } void collection_mgr_update() { Database *db; Database::iterator it; db = &tagdb :: get_library_db(); for (it = db->begin(); it != db->end(); it = db->next(it)) on_library_update((*it)->id, *it); }