/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* * Pix * * Copyright (C) 2010 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include "gth-slideshow-preferences.h" #include "gth-transition.h" enum { TRANSITION_COLUMN_ID, TRANSITION_COLUMN_DISPLAY_NAME }; enum { FILE_COLUMN_ICON, FILE_COLUMN_NAME, FILE_COLUMN_URI }; struct _GthSlideshowPreferencesPrivate { GtkBuilder *builder; GtkWidget *transition_combobox; }; G_DEFINE_TYPE_WITH_CODE (GthSlideshowPreferences, gth_slideshow_preferences, GTK_TYPE_BOX, G_ADD_PRIVATE (GthSlideshowPreferences)) static void gth_slideshow_preferences_finalize (GObject *object) { GthSlideshowPreferences *self = GTH_SLIDESHOW_PREFERENCES (object); g_object_unref (self->priv->builder); G_OBJECT_CLASS (gth_slideshow_preferences_parent_class)->finalize (object); } static void gth_slideshow_preferences_class_init (GthSlideshowPreferencesClass *klass) { GObjectClass *object_class; object_class = G_OBJECT_CLASS (klass); object_class->finalize = gth_slideshow_preferences_finalize; } static void gth_slideshow_preferences_init (GthSlideshowPreferences *self) { self->priv = gth_slideshow_preferences_get_instance_private (self); self->priv->builder = NULL; gtk_orientable_set_orientation (GTK_ORIENTABLE (self), GTK_ORIENTATION_VERTICAL); } static void personalize_checkbutton_toggled_cb (GtkToggleButton *button, gpointer user_data) { GthSlideshowPreferences *self = user_data; gtk_widget_set_sensitive (_gtk_builder_get_widget (self->priv->builder, "personalize_box"), gtk_toggle_button_get_active (button)); } static void automatic_checkbutton_toggled_cb (GtkToggleButton *button, gpointer user_data) { GthSlideshowPreferences *self = user_data; gtk_widget_set_sensitive (_gtk_builder_get_widget (self->priv->builder, "delay_options_box"), gtk_toggle_button_get_active (button)); } static void remove_file_button_clicked_cb (GtkButton *button, gpointer user_data) { GthSlideshowPreferences *self = user_data; GtkTreeModel *model; GtkTreeIter iter; if (! gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW (_gtk_builder_get_widget (self->priv->builder, "files_treeview"))), &model, &iter)) return; gtk_list_store_remove (GTK_LIST_STORE (model), &iter); } static void file_chooser_dialog_response_cb (GtkDialog *dialog, int response, gpointer user_data) { GthSlideshowPreferences *self = user_data; switch (response) { case GTK_RESPONSE_DELETE_EVENT: case GTK_RESPONSE_CANCEL: gtk_widget_destroy (GTK_WIDGET (dialog)); break; case GTK_RESPONSE_OK: { GSList *files; GthIconCache *icon_cache; GtkListStore *list_store; GSList *scan; files = gtk_file_chooser_get_files (GTK_FILE_CHOOSER (dialog)); icon_cache = gth_icon_cache_new_for_widget(GTK_WIDGET (self), GTK_ICON_SIZE_MENU); list_store = (GtkListStore *) gtk_builder_get_object (self->priv->builder, "files_liststore"); for (scan = files; scan; scan = scan->next) { GFile *file = scan->data; GIcon *icon; GdkPixbuf *pixbuf; char *uri; char *name; GtkTreeIter iter; icon = g_content_type_get_icon ("audio"); pixbuf = gth_icon_cache_get_pixbuf (icon_cache, icon); uri = g_file_get_uri (file); name = _g_file_get_display_name (file); gtk_list_store_append (list_store, &iter); gtk_list_store_set (list_store, &iter, FILE_COLUMN_ICON, pixbuf, FILE_COLUMN_NAME, name, FILE_COLUMN_URI, uri, -1); g_free (name); g_free (uri); g_object_unref (pixbuf); } gth_icon_cache_free (icon_cache); g_slist_foreach (files, (GFunc) g_object_unref, NULL); g_slist_free (files); } gtk_widget_destroy (GTK_WIDGET (dialog)); break; } } static void add_file_button_clicked_cb (GtkButton *button, gpointer user_data) { GthSlideshowPreferences *self = user_data; GtkWidget *dialog; GtkFileFilter *filter; dialog = gtk_file_chooser_dialog_new (_("Choose the files to play"), _gtk_widget_get_toplevel_if_window (GTK_WIDGET (self)), GTK_FILE_CHOOSER_ACTION_OPEN, _GTK_LABEL_CANCEL, GTK_RESPONSE_CANCEL, _GTK_LABEL_OK, GTK_RESPONSE_OK, NULL); gtk_file_chooser_set_select_multiple (GTK_FILE_CHOOSER (dialog), TRUE); gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), g_get_user_special_dir (G_USER_DIRECTORY_MUSIC)); filter = gtk_file_filter_new (); gtk_file_filter_set_name (filter, _("Audio files")); gtk_file_filter_add_mime_type (filter, "audio/*"); gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter); g_signal_connect (dialog, "delete-event", G_CALLBACK (gtk_true), NULL); g_signal_connect (dialog, "response", G_CALLBACK (file_chooser_dialog_response_cb), self); gtk_window_set_modal (GTK_WINDOW (dialog), TRUE); gtk_widget_show (dialog); } static void gth_slideshow_preferences_construct (GthSlideshowPreferences *self, const char *current_transition, gboolean automatic, int delay, gboolean wrap_around, gboolean random_order) { GtkListStore *model; GtkCellRenderer *renderer; GList *transitions; int i, i_active; GList *scan; GtkTreeIter iter; self->priv->builder = _gtk_builder_new_from_file ("slideshow-preferences.ui", "slideshow"); gtk_container_add (GTK_CONTAINER (self), _gtk_builder_get_widget (self->priv->builder, "preferences_page")); model = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_STRING); self->priv->transition_combobox = gtk_combo_box_new_with_model (GTK_TREE_MODEL (model)); g_object_unref (model); renderer = gtk_cell_renderer_text_new (); gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (self->priv->transition_combobox), renderer, TRUE); gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (self->priv->transition_combobox), renderer, "text", TRANSITION_COLUMN_DISPLAY_NAME, NULL); transitions = gth_main_get_registered_objects (GTH_TYPE_TRANSITION); for (i = 0, i_active = 0, scan = transitions; scan; scan = scan->next, i++) { GthTransition *transition = scan->data; if (g_strcmp0 (gth_transition_get_id (transition), current_transition) == 0) i_active = i; gtk_list_store_append (model, &iter); gtk_list_store_set (model, &iter, TRANSITION_COLUMN_ID, gth_transition_get_id (transition), TRANSITION_COLUMN_DISPLAY_NAME, gth_transition_get_display_name (transition), -1); } if (g_strcmp0 ("random", current_transition) == 0) i_active = i; gtk_list_store_append (model, &iter); gtk_list_store_set (model, &iter, TRANSITION_COLUMN_ID, "random", TRANSITION_COLUMN_DISPLAY_NAME, _("Random"), -1); gtk_combo_box_set_active (GTK_COMBO_BOX (self->priv->transition_combobox), i_active); gtk_widget_show (self->priv->transition_combobox); gtk_box_pack_start (GTK_BOX (_gtk_builder_get_widget (self->priv->builder, "transition_box")), self->priv->transition_combobox, FALSE, FALSE, 0); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (_gtk_builder_get_widget (self->priv->builder, "automatic_checkbutton")), automatic); gtk_spin_button_set_value (GTK_SPIN_BUTTON (_gtk_builder_get_widget (self->priv->builder, "change_delay_spinbutton")), ((float) delay) / 1000.0); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (_gtk_builder_get_widget (self->priv->builder, "wrap_around_checkbutton")), wrap_around); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (_gtk_builder_get_widget (self->priv->builder, "random_order_checkbutton")), random_order); /* signals */ g_signal_connect (_gtk_builder_get_widget (self->priv->builder, "personalize_checkbutton"), "toggled", G_CALLBACK (personalize_checkbutton_toggled_cb), self); g_signal_connect (_gtk_builder_get_widget (self->priv->builder, "automatic_checkbutton"), "toggled", G_CALLBACK (automatic_checkbutton_toggled_cb), self); g_signal_connect (_gtk_builder_get_widget (self->priv->builder, "remove_file_button"), "clicked", G_CALLBACK (remove_file_button_clicked_cb), self); g_signal_connect (_gtk_builder_get_widget (self->priv->builder, "add_file_button"), "clicked", G_CALLBACK (add_file_button_clicked_cb), self); } GtkWidget * gth_slideshow_preferences_new (const char *transition, gboolean automatic, int delay, gboolean wrap_around, gboolean random_order) { GtkWidget *widget; widget = g_object_new (GTH_TYPE_SLIDESHOW_PREFERENCES, NULL); gth_slideshow_preferences_construct (GTH_SLIDESHOW_PREFERENCES (widget), transition, automatic, delay, wrap_around, random_order); return widget; } void gth_slideshow_preferences_set_audio (GthSlideshowPreferences *self, char **files) { GthIconCache *icon_cache; GtkListStore *list_store; int i; icon_cache = gth_icon_cache_new_for_widget(GTK_WIDGET (self), GTK_ICON_SIZE_MENU); list_store = (GtkListStore *) gtk_builder_get_object (self->priv->builder, "files_liststore"); gtk_list_store_clear (list_store); for (i = 0; files[i] != NULL; i++) { GIcon *icon; GdkPixbuf *pixbuf; GFile *file; char *name; GtkTreeIter iter; icon = g_content_type_get_icon ("audio"); pixbuf = gth_icon_cache_get_pixbuf (icon_cache, icon); file = g_file_new_for_uri (files[i]); name = _g_file_get_display_name (file); gtk_list_store_append (list_store, &iter); gtk_list_store_set (list_store, &iter, FILE_COLUMN_ICON, pixbuf, FILE_COLUMN_NAME, name, FILE_COLUMN_URI, files[i], -1); g_free (name); g_object_unref (file); g_object_unref (pixbuf); } gth_icon_cache_free (icon_cache); } GtkWidget * gth_slideshow_preferences_get_widget (GthSlideshowPreferences *self, const char *name) { if (strcmp (name, "transition_combobox") == 0) return self->priv->transition_combobox; else return _gtk_builder_get_widget (self->priv->builder, name); } gboolean gth_slideshow_preferences_get_personalize (GthSlideshowPreferences *self) { return gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (gtk_builder_get_object (self->priv->builder, "personalize_checkbutton"))); } char * gth_slideshow_preferences_get_transition_id (GthSlideshowPreferences *self) { GtkTreeIter iter; GtkTreeModel *tree_model; char *transition_id; if (! gtk_combo_box_get_active_iter (GTK_COMBO_BOX (self->priv->transition_combobox), &iter)) return NULL; tree_model = gtk_combo_box_get_model (GTK_COMBO_BOX (self->priv->transition_combobox)); gtk_tree_model_get (tree_model, &iter, TRANSITION_COLUMN_ID, &transition_id, -1); return transition_id; } gboolean gth_slideshow_preferences_get_automatic (GthSlideshowPreferences *self) { return gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (gtk_builder_get_object (self->priv->builder, "automatic_checkbutton"))); } int gth_slideshow_preferences_get_delay (GthSlideshowPreferences *self) { return (int) (1000.0 * gtk_spin_button_get_value (GTK_SPIN_BUTTON (gtk_builder_get_object (self->priv->builder, "change_delay_spinbutton")))); } gboolean gth_slideshow_preferences_get_wrap_around (GthSlideshowPreferences *self) { return gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (gtk_builder_get_object (self->priv->builder, "wrap_around_checkbutton"))); } gboolean gth_slideshow_preferences_get_random_order (GthSlideshowPreferences *self) { return gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (gtk_builder_get_object (self->priv->builder, "random_order_checkbutton"))); } char ** gth_slideshow_preferences_get_audio_files (GthSlideshowPreferences *self) { GtkTreeModel *tree_model; GtkTreeIter iter; char **files_v; GList *files = NULL; tree_model = (GtkTreeModel *) gtk_builder_get_object (self->priv->builder, "files_liststore"); if (gtk_tree_model_get_iter_first (tree_model, &iter)) { do { char *uri; gtk_tree_model_get (tree_model, &iter, FILE_COLUMN_URI, &uri, -1); files = g_list_prepend (files, uri); } while (gtk_tree_model_iter_next (tree_model, &iter)); } files = g_list_reverse (files); files_v = _g_string_list_to_strv (files); _g_string_list_free (files); return files_v; }