248 lines
6.8 KiB
C
248 lines
6.8 KiB
C
/*
|
|
* Copyright 2015 (c) Anna Schumaker.
|
|
*/
|
|
#include <core/collection.h>
|
|
#include <core/idle.h>
|
|
#include <core/playlist.h>
|
|
#include <core/tempq.h>
|
|
#include <gui/builder.h>
|
|
#include <gui/collection.h>
|
|
#include <gui/idle.h>
|
|
#include <gui/playlist.h>
|
|
#include <gui/sidebar.h>
|
|
#include <glib/gi18n.h>
|
|
|
|
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", "<big>Collection</big>");
|
|
|
|
/* Add "Add new Library" entry. */
|
|
gtk_tree_store_insert(GTK_TREE_STORE(c_model), &iter, &parent, -1);
|
|
__collection_set_header(&iter, "folder-new",
|
|
"<span style='italic'><Add new path></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);
|
|
|
|
idle_schedule(IDLE_SYNC, __gui_collection_init_idle, NULL);
|
|
gui_idle_enable();
|
|
}
|