/* -*- 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
#include "dlg-convert-format.h"
#include "preferences.h"
#define GET_WIDGET(name) _gtk_builder_get_widget (data->builder, (name))
#define DEFAULT_MIME_TYPE "image/jpeg"
enum {
MIME_TYPE_COLUMN_ICON = 0,
MIME_TYPE_COLUMN_TYPE,
MIME_TYPE_COLUMN_DESCRIPTION
};
typedef struct {
GthBrowser *browser;
GSettings *settings;
GList *file_list;
GtkBuilder *builder;
GtkWidget *dialog;
gboolean use_destination;
} DialogData;
static void
dialog_destroy_cb (GtkWidget *widget,
DialogData *data)
{
gth_browser_set_dialog (data->browser, "convert_format", NULL);
g_object_unref (data->settings);
g_object_unref (data->builder);
_g_object_list_unref (data->file_list);
g_free (data);
}
static gpointer
exec_convert (GthAsyncTask *task,
gpointer user_data)
{
gth_image_task_copy_source_to_destination (GTH_IMAGE_TASK (task));
return NULL;
}
static void
ok_button_clicked_cb (GtkWidget *widget,
DialogData *data)
{
GtkTreeIter iter;
char *mime_type;
GthTask *convert_task;
GthTask *list_task;
gtk_combo_box_get_active_iter (GTK_COMBO_BOX (GET_WIDGET ("mime_type_combobox")), &iter);
gtk_tree_model_get (GTK_TREE_MODEL (GET_WIDGET ("mime_type_liststore")), &iter,
MIME_TYPE_COLUMN_TYPE, &mime_type,
-1);
g_settings_set_string (data->settings, PREF_CONVERT_FORMAT_MIME_TYPE, mime_type);
convert_task = gth_image_task_new (_("Converting images"),
NULL,
exec_convert,
NULL,
NULL,
NULL);
list_task = gth_image_list_task_new (data->browser,
data->file_list,
GTH_IMAGE_TASK (convert_task));
gth_image_list_task_set_overwrite_mode (GTH_IMAGE_LIST_TASK (list_task), GTH_OVERWRITE_ASK);
gth_image_list_task_set_output_mime_type (GTH_IMAGE_LIST_TASK (list_task), mime_type);
if (data->use_destination) {
GFile *destination;
destination = gtk_file_chooser_get_file (GTK_FILE_CHOOSER (GET_WIDGET ("destination_filechooserbutton")));
gth_image_list_task_set_destination (GTH_IMAGE_LIST_TASK (list_task), destination);
g_object_unref (destination);
}
gth_browser_exec_task (data->browser, list_task, GTH_TASK_FLAGS_DEFAULT);
g_object_unref (list_task);
g_object_unref (convert_task);
g_free (mime_type);
gtk_widget_destroy (data->dialog);
}
static void
use_destination_checkbutton_toggled_cb (GtkToggleButton *button,
gpointer user_data)
{
DialogData *data = user_data;
data->use_destination = ! gtk_toggle_button_get_active (button);
gtk_widget_set_sensitive (GET_WIDGET ("destination_filechooserbutton"), data->use_destination);
}
void
dlg_convert_format (GthBrowser *browser,
GList *file_list)
{
DialogData *data;
GArray *savers;
GthFileData *first_file_data;
if (gth_browser_get_dialog (browser, "convert_format") != NULL) {
gtk_window_present (GTK_WINDOW (gth_browser_get_dialog (browser, "convert_format")));
return;
}
data = g_new0 (DialogData, 1);
data->browser = browser;
data->builder = _gtk_builder_new_from_file ("convert-format.ui", "convert_format");
data->settings = g_settings_new (PIX_CONVERT_FORMAT_SCHEMA);
data->file_list = gth_file_data_list_dup (file_list);
data->use_destination = TRUE;
/* Get the widgets. */
data->dialog = g_object_new (GTK_TYPE_DIALOG,
"title", _("Convert Format"),
"transient-for", GTK_WINDOW (browser),
"modal", FALSE,
"destroy-with-parent", FALSE,
"use-header-bar", _gtk_settings_get_dialogs_use_header (),
NULL);
gtk_container_add (GTK_CONTAINER (gtk_dialog_get_content_area (GTK_DIALOG (data->dialog))),
_gtk_builder_get_widget (data->builder, "dialog_content"));
gtk_dialog_add_buttons (GTK_DIALOG (data->dialog),
_GTK_LABEL_CANCEL, GTK_RESPONSE_CANCEL,
_GTK_LABEL_EXECUTE, GTK_RESPONSE_OK,
NULL);
_gtk_dialog_add_class_to_response (GTK_DIALOG (data->dialog), GTK_RESPONSE_OK, GTK_STYLE_CLASS_SUGGESTED_ACTION);
gth_browser_set_dialog (browser, "convert_format", data->dialog);
g_object_set_data (G_OBJECT (data->dialog), "dialog_data", data);
/* Set widgets data. */
savers = gth_main_get_type_set ("image-saver");
if (savers != NULL) {
char *default_mime_type;
GthIconCache *icon_cache;
GtkListStore *list_store;
int i;
default_mime_type = g_settings_get_string (data->settings, PREF_CONVERT_FORMAT_MIME_TYPE);
icon_cache = gth_icon_cache_new_for_widget (data->dialog, GTK_ICON_SIZE_MENU);
list_store = (GtkListStore *) GET_WIDGET ("mime_type_liststore");
for (i = 0; i < savers->len; i++) {
GType saver_type;
GthImageSaver *saver;
const char *mime_type;
GdkPixbuf *pixbuf;
GtkTreeIter iter;
saver_type = g_array_index (savers, GType, i);
saver = g_object_new (saver_type, NULL);
mime_type = gth_image_saver_get_mime_type (saver);
pixbuf = gth_icon_cache_get_pixbuf (icon_cache, g_content_type_get_icon (mime_type));
gtk_list_store_append (list_store, &iter);
gtk_list_store_set (list_store, &iter,
MIME_TYPE_COLUMN_ICON, pixbuf,
MIME_TYPE_COLUMN_TYPE, mime_type,
MIME_TYPE_COLUMN_DESCRIPTION, g_content_type_get_description (mime_type),
-1);
if (strcmp (default_mime_type, mime_type) == 0)
gtk_combo_box_set_active_iter (GTK_COMBO_BOX (GET_WIDGET ("mime_type_combobox")), &iter);
g_object_unref (pixbuf);
g_object_unref (saver);
}
gth_icon_cache_free (icon_cache);
g_free (default_mime_type);
}
first_file_data = (GthFileData *) data->file_list->data;
_gtk_file_chooser_set_file_parent (GTK_FILE_CHOOSER (GET_WIDGET ("destination_filechooserbutton")),
first_file_data->file,
NULL);
/* Set the signals handlers. */
g_signal_connect (G_OBJECT (data->dialog),
"destroy",
G_CALLBACK (dialog_destroy_cb),
data);
g_signal_connect (gtk_dialog_get_widget_for_response (GTK_DIALOG (data->dialog), GTK_RESPONSE_OK),
"clicked",
G_CALLBACK (ok_button_clicked_cb),
data);
g_signal_connect_swapped (gtk_dialog_get_widget_for_response (GTK_DIALOG (data->dialog), GTK_RESPONSE_CANCEL),
"clicked",
G_CALLBACK (gtk_widget_destroy),
G_OBJECT (data->dialog));
g_signal_connect (GET_WIDGET ("use_destination_checkbutton"),
"toggled",
G_CALLBACK (use_destination_checkbutton_toggled_cb),
data);
/* Run dialog. */
if (GTH_IS_FILE_SOURCE_VFS (gth_browser_get_location_source (browser)))
gtk_widget_hide (GET_WIDGET ("use_destination_checkbutton"));
gtk_widget_show (data->dialog);
}