ocarina/gui/collection.c

192 lines
5.1 KiB
C

/*
* Copyright 2015 (c) Anna Schumaker.
*/
#include <core/collection.h>
#include <core/idle.h>
#include <core/tempq.h>
#include <gui/builder.h>
#include <gui/collection.h>
#include <gui/sidebar.h>
enum collection_sidebar_columns {
C_SB_IMAGE,
C_SB_IMAGE_SZ,
C_SB_ENABLED,
C_SB_SHOW_ENABLED,
C_SB_PATH,
C_SB_LIBRARY,
};
static GtkTreeModel *c_model;
static void __collection_set_header(GtkTreeIter *iter, const gchar *image,
GtkIconSize size, const gchar *text)
{
gtk_tree_store_set(GTK_TREE_STORE(c_model), iter, C_SB_IMAGE, image,
C_SB_IMAGE_SZ, size, 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_ENABLED, library->li_enabled,
C_SB_SHOW_ENABLED, true,
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_collection_idle_enable();
}
void __collection_toggled(GtkCellRendererToggle *toggle, gchar *path,
gpointer data)
{
struct library *library = NULL;
GtkTreeIter iter;
if (gtk_tree_model_get_iter_from_string(c_model, &iter, path))
library = __collection_get_library(&iter);
if (!library)
return;
collection_set_enabled(library, !library->li_enabled);
__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;
}
void __collection_add(GtkButton *button, GtkFileChooser *chooser)
{
gchar *filename = gtk_file_chooser_get_filename(chooser);
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);
gtk_tree_store_insert_before(GTK_TREE_STORE(c_model), &iter, NULL, &last);
__collection_set_library(&iter, collection_add(filename));
gui_collection_idle_enable();
g_free(filename);
}
void __collection_selection_changed(GtkTreeSelection *selection,
GtkFileChooser *chooser)
{
GtkNotebook *notebook = GTK_NOTEBOOK(gui_builder_widget("o_notebook"));
struct library *library;
GtkTreeIter iter;
if (gtk_tree_selection_get_selected(selection, &c_model, &iter)) {
gtk_notebook_set_current_page(notebook, tempq_count() + 3);
library = __collection_get_library(&iter);
gui_sidebar_selected(SB_COLLECTION);
if (library)
gtk_file_chooser_set_current_folder(chooser,
library->li_path);
}
}
static gboolean __collection_on_idle(gpointer data)
{
GtkProgressBar *progress = GTK_PROGRESS_BAR(data);
if (idle_run_task()) {
gtk_progress_bar_set_fraction(progress, idle_progress());
return gtk_widget_is_visible(gui_builder_widget("o_window"));
} else {
gtk_widget_hide(GTK_WIDGET(progress));
return G_SOURCE_REMOVE;
}
}
void gui_collection_init()
{
struct db_entry *library, *next;
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",
GTK_ICON_SIZE_LARGE_TOOLBAR,
"<span size='large'>Collection</span>");
/* Add library paths. */
db_for_each(library, next, library_db_get()) {
gtk_tree_store_insert(GTK_TREE_STORE(c_model), &iter, &parent, -1);
__collection_set_library(&iter, LIBRARY(library));
}
/* Add "Add new Library" entry. */
gtk_tree_store_insert(GTK_TREE_STORE(c_model), &iter, &parent, -1);
__collection_set_header(&iter, "folder-new", GTK_ICON_SIZE_MENU,
"<span style='italic'>&lt;Add new path&gt;</span>");
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);
gui_collection_idle_enable();
}
void gui_collection_idle_enable()
{
GtkWidget *progress = gui_builder_widget("o_idle_progress");
gtk_widget_show(progress);
g_idle_add(__collection_on_idle, progress);
}