/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
/*
* Pix
*
* Copyright (C) 2009-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
#include
#include "actions.h"
#include "callbacks.h"
#include "gth-slideshow-preferences.h"
#include "preferences.h"
#include "shortcuts.h"
static const GActionEntry actions[] = {
{ "slideshow", gth_browser_activate_slideshow }
};
static const GthShortcut shortcuts[] = {
{ "slideshow", N_("Start presentation"), GTH_SHORTCUT_CONTEXT_BROWSER_VIEWER, GTH_SHORTCUT_CATEGORY_VIEWER, "F5" },
{ "slideshow-close", N_("Terminate presentation"), GTH_SHORTCUT_CONTEXT_SLIDESHOW, GTH_SHORTCUT_CATEGORY_SLIDESHOW, "Escape" },
{ "slideshow-toggle-pause", N_("Pause/Resume presentation"), GTH_SHORTCUT_CONTEXT_SLIDESHOW, GTH_SHORTCUT_CATEGORY_SLIDESHOW, "p" },
{ "slideshow-next-image", N_("Show next file"), GTH_SHORTCUT_CONTEXT_SLIDESHOW, GTH_SHORTCUT_CATEGORY_SLIDESHOW, "space" },
{ "slideshow-previous-image", N_("Show previous file"), GTH_SHORTCUT_CONTEXT_SLIDESHOW, GTH_SHORTCUT_CATEGORY_SLIDESHOW, "b" },
};
void
ss__gth_browser_construct_cb (GthBrowser *browser)
{
g_return_if_fail (GTH_IS_BROWSER (browser));
g_action_map_add_action_entries (G_ACTION_MAP (browser),
actions,
G_N_ELEMENTS (actions),
browser);
gth_window_add_shortcuts (GTH_WINDOW (browser),
shortcuts,
G_N_ELEMENTS (shortcuts));
gth_browser_add_header_bar_button (browser,
GTH_BROWSER_HEADER_SECTION_BROWSER_VIEW,
"view-presentation-symbolic",
_("Presentation"),
"win.slideshow",
NULL);
}
void
ss__gth_browser_update_sensitivity_cb (GthBrowser *browser)
{
GtkTreeModel *file_store;
gboolean sensitive;
file_store = gth_file_view_get_model (GTH_FILE_VIEW (gth_browser_get_file_list_view (browser)));
sensitive = (gth_file_store_n_visibles (GTH_FILE_STORE (file_store)) > 0);
g_object_set (g_action_map_lookup_action (G_ACTION_MAP (browser), "slideshow"), "enabled", sensitive, NULL);
}
void
ss__slideshow_cb (GthBrowser *browser)
{
gth_browser_activate_slideshow (NULL, NULL, browser);
}
void
ss__gth_catalog_read_metadata (GthCatalog *catalog,
GthFileData *file_data)
{
if (g_file_info_get_attribute_status (file_data->info, "slideshow::personalize") == G_FILE_ATTRIBUTE_STATUS_SET)
g_value_hash_set_boolean (catalog->attributes,
"slideshow::personalize",
g_file_info_get_attribute_boolean (file_data->info, "slideshow::personalize"));
if (g_file_info_get_attribute_status (file_data->info, "slideshow::automatic") == G_FILE_ATTRIBUTE_STATUS_SET)
g_value_hash_set_boolean (catalog->attributes,
"slideshow::automatic",
g_file_info_get_attribute_boolean (file_data->info, "slideshow::automatic"));
if (g_file_info_get_attribute_status (file_data->info, "slideshow::wrap-around") == G_FILE_ATTRIBUTE_STATUS_SET)
g_value_hash_set_boolean (catalog->attributes,
"slideshow::wrap-around",
g_file_info_get_attribute_boolean (file_data->info, "slideshow::wrap-around"));
if (g_file_info_get_attribute_status (file_data->info, "slideshow::random-order") == G_FILE_ATTRIBUTE_STATUS_SET)
g_value_hash_set_boolean (catalog->attributes,
"slideshow::random-order",
g_file_info_get_attribute_boolean (file_data->info, "slideshow::random-order"));
if (g_file_info_get_attribute_status (file_data->info, "slideshow::delay") == G_FILE_ATTRIBUTE_STATUS_SET)
g_value_hash_set_int (catalog->attributes,
"slideshow::delay",
g_file_info_get_attribute_int32 (file_data->info, "slideshow::delay"));
if (g_file_info_get_attribute_status (file_data->info, "slideshow::transition") == G_FILE_ATTRIBUTE_STATUS_SET)
g_value_hash_set_string (catalog->attributes,
"slideshow::transition",
g_file_info_get_attribute_string (file_data->info, "slideshow::transition"));
if (g_file_info_get_attribute_status (file_data->info, "slideshow::playlist") == G_FILE_ATTRIBUTE_STATUS_SET)
g_value_hash_set_stringv (catalog->attributes,
"slideshow::playlist",
g_file_info_get_attribute_stringv (file_data->info, "slideshow::playlist"));
}
void
ss__gth_catalog_write_metadata (GthCatalog *catalog,
GthFileData *file_data)
{
if (g_value_hash_is_set (catalog->attributes, "slideshow::personalize")) {
g_file_info_set_attribute_boolean (file_data->info,
"slideshow::personalize",
g_value_hash_get_boolean (catalog->attributes, "slideshow::personalize"));
g_file_info_set_attribute_status (file_data->info,
"slideshow::personalize",
G_FILE_ATTRIBUTE_STATUS_SET);
}
if (g_value_hash_is_set (catalog->attributes, "slideshow::automatic")) {
g_file_info_set_attribute_boolean (file_data->info,
"slideshow::automatic",
g_value_hash_get_boolean (catalog->attributes, "slideshow::automatic"));
g_file_info_set_attribute_status (file_data->info,
"slideshow::automatic",
G_FILE_ATTRIBUTE_STATUS_SET);
}
if (g_value_hash_is_set (catalog->attributes, "slideshow::wrap-around")) {
g_file_info_set_attribute_boolean (file_data->info,
"slideshow::wrap-around",
g_value_hash_get_boolean (catalog->attributes, "slideshow::wrap-around"));
g_file_info_set_attribute_status (file_data->info,
"slideshow::wrap-around",
G_FILE_ATTRIBUTE_STATUS_SET);
}
if (g_value_hash_is_set (catalog->attributes, "slideshow::random-order")) {
g_file_info_set_attribute_boolean (file_data->info,
"slideshow::random-order",
g_value_hash_get_boolean (catalog->attributes, "slideshow::random-order"));
g_file_info_set_attribute_status (file_data->info,
"slideshow::random-order",
G_FILE_ATTRIBUTE_STATUS_SET);
}
if (g_value_hash_is_set (catalog->attributes, "slideshow::delay")) {
g_file_info_set_attribute_int32 (file_data->info,
"slideshow::delay",
g_value_hash_get_int (catalog->attributes, "slideshow::delay"));
g_file_info_set_attribute_status (file_data->info,
"slideshow::delay",
G_FILE_ATTRIBUTE_STATUS_SET);
}
if (g_value_hash_is_set (catalog->attributes, "slideshow::transition")) {
g_file_info_set_attribute_string (file_data->info,
"slideshow::transition",
g_value_hash_get_string (catalog->attributes, "slideshow::transition"));
g_file_info_set_attribute_status (file_data->info,
"slideshow::transition",
G_FILE_ATTRIBUTE_STATUS_SET);
}
if (g_value_hash_is_set (catalog->attributes, "slideshow::playlist")) {
g_file_info_set_attribute_stringv (file_data->info,
"slideshow::playlist",
g_value_hash_get_stringv (catalog->attributes, "slideshow::playlist"));
g_file_info_set_attribute_status (file_data->info,
"slideshow::playlist",
G_FILE_ATTRIBUTE_STATUS_SET);
}
}
void
ss__gth_catalog_read_from_doc (GthCatalog *catalog,
DomElement *root)
{
DomElement *node;
for (node = root->first_child; node; node = node->next_sibling) {
DomElement *child;
if (g_strcmp0 (node->tag_name, "slideshow") != 0)
continue;
g_value_hash_set_boolean (catalog->attributes,
"slideshow::personalize",
g_strcmp0 (dom_element_get_attribute (node, "personalize"), "true") == 0);
g_value_hash_set_boolean (catalog->attributes,
"slideshow::automatic",
g_strcmp0 (dom_element_get_attribute (node, "automatic"), "true") == 0);
g_value_hash_set_boolean (catalog->attributes,
"slideshow::wrap-around",
g_strcmp0 (dom_element_get_attribute (node, "wrap-around"), "true") == 0);
g_value_hash_set_boolean (catalog->attributes,
"slideshow::random-order",
g_strcmp0 (dom_element_get_attribute (node, "random-order"), "true") == 0);
for (child = node->first_child; child; child = child->next_sibling) {
if (g_strcmp0 (child->tag_name, "delay") == 0) {
int delay;
sscanf (dom_element_get_inner_text (child), "%d", &delay);
g_value_hash_set_int (catalog->attributes,
"slideshow::delay",
delay);
}
else if (g_strcmp0 (child->tag_name, "transition") == 0) {
g_value_hash_set_string (catalog->attributes,
"slideshow::transition",
dom_element_get_inner_text (child));
}
else if (g_strcmp0 (child->tag_name, "playlist") == 0) {
DomElement *file;
GList *audio_files;
audio_files = NULL;
for (file = child->first_child; file; file = file->next_sibling) {
if (g_strcmp0 (file->tag_name, "file") == 0)
audio_files = g_list_prepend (audio_files, g_strdup (dom_element_get_attribute (file, "uri")));
}
audio_files = g_list_reverse (audio_files);
if (audio_files != NULL) {
char **audio_files_v;
audio_files_v = _g_string_list_to_strv (audio_files);
g_value_hash_set_stringv (catalog->attributes,
"slideshow::playlist",
audio_files_v);
g_strfreev (audio_files_v);
}
else
g_value_hash_unset (catalog->attributes, "slideshow::playlist");
_g_string_list_free (audio_files);
}
}
}
}
void
ss__gth_catalog_write_to_doc (GthCatalog *catalog,
DomDocument *doc,
DomElement *root)
{
DomElement *slideshow;
if (! g_value_hash_is_set (catalog->attributes, "slideshow::personalize"))
return;
slideshow = dom_document_create_element (doc,
"slideshow",
"personalize", (g_value_hash_get_boolean_or_default (catalog->attributes, "slideshow::personalize", FALSE) ? "true" : "false"),
"automatic", (g_value_hash_get_boolean_or_default (catalog->attributes, "slideshow::automatic", FALSE) ? "true" : "false"),
"wrap-around", (g_value_hash_get_boolean_or_default (catalog->attributes, "slideshow::wrap-around", FALSE) ? "true" : "false"),
"random-order", (g_value_hash_get_boolean_or_default (catalog->attributes, "slideshow::random-order", FALSE) ? "true" : "false"),
NULL);
dom_element_append_child (root, slideshow);
if (g_value_hash_is_set (catalog->attributes, "slideshow::delay")) {
char *delay;
delay = g_strdup_printf ("%d", g_value_hash_get_int (catalog->attributes, "slideshow::delay"));
dom_element_append_child (slideshow,
dom_document_create_element_with_text (doc, delay, "delay", NULL));
g_free (delay);
}
if (g_value_hash_is_set (catalog->attributes, "slideshow::transition"))
dom_element_append_child (slideshow,
dom_document_create_element_with_text (doc,
g_value_hash_get_string (catalog->attributes, "slideshow::transition"),
"transition",
NULL));
if (g_value_hash_is_set (catalog->attributes, "slideshow::playlist")) {
char **playlist_files;
playlist_files = g_value_hash_get_stringv (catalog->attributes, "slideshow::playlist");
if (playlist_files[0] != NULL) {
DomElement *playlist;
int i;
playlist = dom_document_create_element (doc, "playlist", NULL);
dom_element_append_child (slideshow, playlist);
for (i = 0; playlist_files[i] != NULL; i++)
dom_element_append_child (playlist, dom_document_create_element (doc, "file", "uri", playlist_files[i], NULL));
}
}
}
void
ss__dlg_catalog_properties (GtkBuilder *builder,
GthFileData *file_data,
GthCatalog *catalog)
{
GtkWidget *slideshow_preferences;
GtkWidget *label;
if (! g_value_hash_is_set (catalog->attributes, "slideshow::personalize")
|| ! g_value_hash_get_boolean (catalog->attributes, "slideshow::personalize"))
{
GSettings *settings;
char *current_transition;
settings = g_settings_new (PIX_SLIDESHOW_SCHEMA);
current_transition = g_settings_get_string (settings, PREF_SLIDESHOW_TRANSITION);
slideshow_preferences = gth_slideshow_preferences_new (current_transition,
g_settings_get_boolean (settings, PREF_SLIDESHOW_AUTOMATIC),
(int) (1000.0 * g_settings_get_double (settings, PREF_SLIDESHOW_CHANGE_DELAY)),
g_settings_get_boolean (settings, PREF_SLIDESHOW_WRAP_AROUND),
g_settings_get_boolean (settings, PREF_SLIDESHOW_RANDOM_ORDER));
gtk_widget_set_sensitive (gth_slideshow_preferences_get_widget (GTH_SLIDESHOW_PREFERENCES (slideshow_preferences), "personalize_box"), FALSE);
g_free (current_transition);
g_object_unref (settings);
}
else {
slideshow_preferences = gth_slideshow_preferences_new (g_value_hash_get_string (catalog->attributes, "slideshow::transition"),
g_value_hash_get_boolean (catalog->attributes, "slideshow::automatic"),
g_value_hash_get_int (catalog->attributes, "slideshow::delay"),
g_value_hash_get_boolean (catalog->attributes, "slideshow::wrap-around"),
g_value_hash_get_boolean (catalog->attributes, "slideshow::random-order"));
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gth_slideshow_preferences_get_widget (GTH_SLIDESHOW_PREFERENCES (slideshow_preferences), "personalize_checkbutton")), TRUE);
gtk_widget_set_sensitive (gth_slideshow_preferences_get_widget (GTH_SLIDESHOW_PREFERENCES (slideshow_preferences), "personalize_box"), TRUE);
}
if (g_value_hash_is_set (catalog->attributes, "slideshow::playlist"))
gth_slideshow_preferences_set_audio (GTH_SLIDESHOW_PREFERENCES (slideshow_preferences),
g_value_hash_get_stringv (catalog->attributes, "slideshow::playlist"));
gtk_container_set_border_width (GTK_CONTAINER (slideshow_preferences), 12);
gtk_widget_show (gth_slideshow_preferences_get_widget (GTH_SLIDESHOW_PREFERENCES (slideshow_preferences), "personalize_checkbutton"));
gtk_widget_hide (gth_slideshow_preferences_get_widget (GTH_SLIDESHOW_PREFERENCES (slideshow_preferences), "slideshow_label"));
gtk_widget_show (gth_slideshow_preferences_get_widget (GTH_SLIDESHOW_PREFERENCES (slideshow_preferences), "playlist_box"));
gtk_widget_show (slideshow_preferences);
#ifndef HAVE_CLUTTER
gtk_widget_hide (gth_slideshow_preferences_get_widget (GTH_SLIDESHOW_PREFERENCES (slideshow_preferences), "transition_box"));
#endif /* ! HAVE_CLUTTER */
label = gtk_label_new (_("Presentation"));
gtk_widget_show (label);
gtk_notebook_append_page (GTK_NOTEBOOK (_gtk_builder_get_widget (builder, "properties_notebook")), slideshow_preferences, label);
g_object_set_data (G_OBJECT (builder), "slideshow_preferences", slideshow_preferences);
}
void
ss__dlg_catalog_properties_save (GtkBuilder *builder,
GthFileData *file_data,
GthCatalog *catalog)
{
GtkWidget *slideshow_preferences;
char *transition_id;
char **files;
slideshow_preferences = g_object_get_data (G_OBJECT (builder), "slideshow_preferences");
g_value_hash_set_boolean (catalog->attributes,
"slideshow::personalize",
gth_slideshow_preferences_get_personalize (GTH_SLIDESHOW_PREFERENCES (slideshow_preferences)));
transition_id = gth_slideshow_preferences_get_transition_id (GTH_SLIDESHOW_PREFERENCES (slideshow_preferences));
g_value_hash_set_string (catalog->attributes,
"slideshow::transition",
transition_id);
g_free (transition_id);
g_value_hash_set_boolean (catalog->attributes,
"slideshow::automatic",
gth_slideshow_preferences_get_automatic (GTH_SLIDESHOW_PREFERENCES (slideshow_preferences)));
g_value_hash_set_int (catalog->attributes,
"slideshow::delay",
gth_slideshow_preferences_get_delay (GTH_SLIDESHOW_PREFERENCES (slideshow_preferences)));
g_value_hash_set_boolean (catalog->attributes,
"slideshow::wrap-around",
gth_slideshow_preferences_get_wrap_around (GTH_SLIDESHOW_PREFERENCES (slideshow_preferences)));
g_value_hash_set_boolean (catalog->attributes,
"slideshow::random-order",
gth_slideshow_preferences_get_random_order (GTH_SLIDESHOW_PREFERENCES (slideshow_preferences)));
files = gth_slideshow_preferences_get_audio_files (GTH_SLIDESHOW_PREFERENCES (slideshow_preferences));
g_value_hash_set_stringv (catalog->attributes,
"slideshow::playlist",
files);
g_strfreev (files);
}