/* * Copyright 2015 (c) Anna Schumaker. */ #include #include #include #include #include #include #include #include #include #include enum collection_sidebar_columns { C_SB_IMAGE, C_SB_PATH, C_SB_LIBRARY, }; static GtkTreeModel *c_model; static void __collection_set_header(GtkTreeIter *iter, const gchar *image, const gchar *text) { gtk_tree_store_set(GTK_TREE_STORE(c_model), iter, C_SB_IMAGE, image, C_SB_PATH, text, -1); } static void __collection_set_library(GtkTreeIter *iter, struct library *library) { gtk_tree_store_set(GTK_TREE_STORE(c_model), iter, C_SB_IMAGE, "folder", C_SB_PATH, library->li_path, C_SB_LIBRARY, library, -1); } static struct library *__collection_get_library(GtkTreeIter *iter) { struct library *library; gtk_tree_model_get(c_model, iter, C_SB_LIBRARY, &library, -1); return library; } void __collection_activated(GtkTreeView *treeview, GtkTreePath *path, GtkTreeViewColumn *column, gpointer data) { struct library *library = NULL; GtkTreeIter iter; if (gtk_tree_model_get_iter(c_model, &iter, path)) library = __collection_get_library(&iter); if (!library) return; collection_update(library); gui_idle_enable(); } void __collection_toggled(GtkCheckMenuItem *check, gpointer data) { GtkTreeView *treeview = GTK_TREE_VIEW(gui_builder_widget("o_collection_view")); GtkTreeSelection *selection = gtk_tree_view_get_selection(treeview); struct library *library = NULL; GtkTreePath *path; GtkTreeIter iter; GList *rows; rows = gtk_tree_selection_get_selected_rows(selection, &c_model); if (!rows) return; path = rows->data; if (gtk_tree_model_get_iter(c_model, &iter, path)) library = __collection_get_library(&iter); if (!library) return; collection_set_enabled(library, gtk_check_menu_item_get_active(check)); __collection_set_library(&iter, library); } bool __collection_keypress(GtkTreeView *treeview, GdkEventKey *event, gpointer data) { GtkTreeSelection *selection = gtk_tree_view_get_selection(treeview); struct library *library = NULL; GtkTreePath *path; GtkTreeIter iter; GList *rows; if (event->keyval != GDK_KEY_Delete) return false; rows = gtk_tree_selection_get_selected_rows(selection, &c_model); path = rows->data; if (gtk_tree_model_get_iter(c_model, &iter, path)) library = __collection_get_library(&iter); if (!library) goto out; collection_remove(library); gtk_tree_store_remove(GTK_TREE_STORE(c_model), &iter); out: g_list_free_full(rows, (GDestroyNotify)gtk_tree_path_free); return true; } bool __collection_buttonpress(GtkWidget *widget, GdkEventButton *event, gpointer data) { GtkCheckMenuItem *check = GTK_CHECK_MENU_ITEM(gui_builder_widget("o_collection_enabled")); GtkTreeView *treeview = GTK_TREE_VIEW(gui_builder_widget("o_collection_view")); GtkTreeSelection *selection = gtk_tree_view_get_selection(treeview); GtkMenu *menu = GTK_MENU(gui_builder_widget("o_collection_rc")); struct library *library = NULL; GtkTreePath *path; GtkTreeIter iter; if (event->button != 3) return false; if (gtk_tree_view_get_path_at_pos(treeview, event->x, event->y, &path, NULL, NULL, NULL)) gtk_tree_selection_select_path(selection, path); if (gtk_tree_model_get_iter(c_model, &iter, path)) library = __collection_get_library(&iter); if (library) { gtk_check_menu_item_set_active(check, library->li_enabled); gtk_menu_popup(menu, NULL, NULL, NULL, NULL, event->button, event->time); } gtk_tree_path_free(path); return true; } void __collection_add(GtkButton *button, GtkFileChooser *chooser) { gchar *filename = gtk_file_chooser_get_filename(chooser); struct library *library; GtkTreeIter iter, last; gtk_tree_model_get_iter_first(c_model, &iter); gtk_tree_model_iter_nth_child(c_model, &last, &iter, 0); while (__collection_get_library(&last) != NULL) gtk_tree_model_iter_next(c_model, &last); library = collection_add(filename); gtk_tree_store_insert_before(GTK_TREE_STORE(c_model), &iter, NULL, &last); __collection_set_library(&iter, library); gui_playlist_add_library(library); gui_idle_enable(); g_free(filename); } void __collection_choose(GtkButton *button, gpointer data) { GtkFileFilter *filter; GtkWidget *dialog; gint res; filter = gtk_file_filter_new(); gtk_file_filter_add_mime_type(filter, "inode/directory"); dialog = gtk_file_chooser_dialog_new("Chooser a Path", GTK_WINDOW(gui_builder_widget("o_window")), GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, _("_Cancel"), GTK_RESPONSE_CANCEL, _("_Open"), GTK_RESPONSE_ACCEPT, NULL); gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(dialog), filter); res = gtk_dialog_run(GTK_DIALOG(dialog)); if (res == GTK_RESPONSE_ACCEPT) __collection_add(button, GTK_FILE_CHOOSER(dialog)); gtk_widget_destroy(dialog); g_object_unref(filter); } void __collection_selection_changed(GtkTreeSelection *selection, GtkFileChooser *chooser) { GtkStack *stack = GTK_STACK(gui_builder_widget("o_stack")); struct library *library; GtkTreeIter iter; if (gtk_tree_selection_get_selected(selection, &c_model, &iter)) { gtk_stack_set_visible_child_name(stack, "chooser"); library = __collection_get_library(&iter); gui_sidebar_selected(SB_COLLECTION, NULL); if (library) gtk_file_chooser_set_current_folder(chooser, library->li_path); } } bool __gui_collection_init_idle() { struct db_entry *library, *next; GtkTreeIter parent, iter, last; gtk_tree_model_get_iter_first(c_model, &parent); while (!gtk_tree_model_iter_has_child(c_model, &parent)) gtk_tree_model_iter_next(c_model, &parent); gtk_tree_model_iter_nth_child(c_model, &last, &parent, 0); /* Add library paths. */ db_for_each(library, next, library_db_get()) { gtk_tree_store_insert_before(GTK_TREE_STORE(c_model), &iter, &parent, &last); __collection_set_library(&iter, LIBRARY(library)); gui_playlist_add_library(LIBRARY(library)); } return true; } void gui_collection_init() { GtkTreeIter parent, iter; GtkTreeView *treeview; c_model = GTK_TREE_MODEL(gui_builder_object("o_collection_store")); /* Add "Collection" header. */ gtk_tree_store_insert(GTK_TREE_STORE(c_model), &parent, NULL, -1); __collection_set_header(&parent, "system-file-manager", "Collection"); /* Add "Add new Library" entry. */ gtk_tree_store_insert(GTK_TREE_STORE(c_model), &iter, &parent, -1); __collection_set_header(&iter, "folder-new", "<Add new path>"); treeview = GTK_TREE_VIEW(gui_builder_widget("o_collection_view")); gtk_tree_view_expand_all(treeview); gtk_tree_selection_set_select_function( gtk_tree_view_get_selection(treeview), gui_sidebar_on_select, NULL, NULL); idle_schedule(IDLE_SYNC, __gui_collection_init_idle, NULL); gui_idle_enable(); }