/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
/*
* Pix
*
* Copyright (C) 2001-2010 The 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-change-date.h"
#include "gth-change-date-task.h"
#include "preferences.h"
#define GET_WIDGET(x) (_gtk_builder_get_widget (data->builder, (x)))
#define IS_ACTIVE(x) (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (x)))
#define HOURS_TO_SECONDS(h) ((h) * 3600)
#define MINS_TO_SECONDS(h) ((h) * 60)
typedef struct {
GthBrowser *browser;
GtkBuilder *builder;
GSettings *settings;
GtkWidget *dialog;
GtkWidget *date_selector;
GList *file_list;
} DialogData;
static void
dialog_destroy_cb (GtkWidget *widget,
DialogData *data)
{
_g_object_list_unref (data->file_list);
g_object_unref (data->settings);
g_object_unref (data->builder);
g_free (data);
}
static void
ok_button_clicked (GtkWidget *button,
DialogData *data)
{
GthChangeFields change_fields;
GthChangeType change_type;
GthDateTime *date_time;
int time_adjustment;
GthTask *task;
date_time = NULL;
change_fields = 0;
if (IS_ACTIVE (GET_WIDGET ("change_last_modified_checkbutton")))
change_fields |= GTH_CHANGE_LAST_MODIFIED_DATE;
if (IS_ACTIVE (GET_WIDGET ("change_comment_checkbutton")))
change_fields |= GTH_CHANGE_COMMENT_DATE;
change_type = 0;
time_adjustment = 0;
if (IS_ACTIVE (GET_WIDGET ("to_following_date_radiobutton"))) {
change_type = GTH_CHANGE_TO_FOLLOWING_DATE;
date_time = gth_datetime_new ();
gth_time_selector_get_value (GTH_TIME_SELECTOR (data->date_selector), date_time);
}
else if (IS_ACTIVE (GET_WIDGET ("to_last_modified_date_radiobutton")))
change_type = GTH_CHANGE_TO_FILE_MODIFIED_DATE;
else if (IS_ACTIVE (GET_WIDGET ("to_creation_date_radiobutton")))
change_type = GTH_CHANGE_TO_FILE_CREATION_DATE;
else if (IS_ACTIVE (GET_WIDGET ("to_photo_original_date_radiobutton")))
change_type = GTH_CHANGE_TO_PHOTO_ORIGINAL_DATE;
else if (IS_ACTIVE (GET_WIDGET ("adjust_time_radiobutton"))) {
change_type = GTH_CHANGE_ADJUST_TIME;
time_adjustment = (HOURS_TO_SECONDS (gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (GET_WIDGET ("adjust_time_h_spinbutton"))))
+ MINS_TO_SECONDS (gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (GET_WIDGET ("adjust_time_m_spinbutton"))))
+ gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (GET_WIDGET ("adjust_time_s_spinbutton"))));
if (gtk_combo_box_get_active (GTK_COMBO_BOX (GET_WIDGET ("adjust_sign_combobox"))) == 1)
time_adjustment = -time_adjustment;
}
/* save the preferences */
g_settings_set_boolean (data->settings, PREF_CHANGE_DATE_SET_LAST_MODIFIED_DATE, (change_fields & GTH_CHANGE_LAST_MODIFIED_DATE) == GTH_CHANGE_LAST_MODIFIED_DATE);
g_settings_set_boolean (data->settings, PREF_CHANGE_DATE_SET_COMMENT_DATE, (change_fields & GTH_CHANGE_COMMENT_DATE) == GTH_CHANGE_COMMENT_DATE);
g_settings_set_boolean (data->settings, PREF_CHANGE_DATE_TO_FOLLOWING_DATE, change_type == GTH_CHANGE_TO_FOLLOWING_DATE);
if (change_type == GTH_CHANGE_TO_FOLLOWING_DATE) {
char *s;
s = gth_datetime_to_exif_date (date_time);
g_settings_set_string (data->settings, PREF_CHANGE_DATE_DATE, s);
g_free (s);
}
g_settings_set_boolean (data->settings, PREF_CHANGE_DATE_TO_FILE_MODIFIED_DATE, change_type == GTH_CHANGE_TO_FILE_MODIFIED_DATE);
g_settings_set_boolean (data->settings, PREF_CHANGE_DATE_TO_FILE_CREATION_DATE, change_type == GTH_CHANGE_TO_FILE_CREATION_DATE);
g_settings_set_boolean (data->settings, PREF_CHANGE_DATE_TO_PHOTO_ORIGINAL_DATE, change_type == GTH_CHANGE_TO_PHOTO_ORIGINAL_DATE);
g_settings_set_boolean (data->settings, PREF_CHANGE_DATE_ADJUST_TIME, change_type == GTH_CHANGE_ADJUST_TIME);
if (change_type == GTH_CHANGE_ADJUST_TIME)
g_settings_set_int (data->settings, PREF_CHANGE_DATE_TIME_ADJUSTMENT, time_adjustment);
/* exec the task */
task = gth_change_date_task_new (gth_browser_get_location (data->browser),
data->file_list,
change_fields,
change_type,
date_time,
time_adjustment);
gth_browser_exec_task (data->browser, task, GTH_TASK_FLAGS_DEFAULT);
gtk_widget_destroy (data->dialog);
g_object_unref (task);
gth_datetime_free (date_time);
}
static void
update_sensitivity (DialogData *data)
{
gtk_dialog_set_response_sensitive (GTK_DIALOG (data->dialog),
GTK_RESPONSE_OK,
(IS_ACTIVE (GET_WIDGET ("change_last_modified_checkbutton"))
|| IS_ACTIVE (GET_WIDGET ("change_comment_checkbutton"))));
gtk_widget_set_sensitive (data->date_selector, IS_ACTIVE (GET_WIDGET ("to_following_date_radiobutton")));
gtk_widget_set_sensitive (GET_WIDGET ("time_box"), IS_ACTIVE (GET_WIDGET ("adjust_time_radiobutton")));
if (IS_ACTIVE (GET_WIDGET ("change_last_modified_checkbutton"))) {
gtk_widget_set_sensitive (GET_WIDGET ("to_last_modified_date_radiobutton"), FALSE);
if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("to_last_modified_date_radiobutton"))))
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("to_following_date_radiobutton")), TRUE);
}
else
gtk_widget_set_sensitive (GET_WIDGET ("to_last_modified_date_radiobutton"), TRUE);
}
static void
radio_button_clicked (GtkWidget *button,
DialogData *data)
{
update_sensitivity (data);
}
void
dlg_change_date (GthBrowser *browser,
GList *file_list)
{
DialogData *data;
GTimeVal timeval;
GthDateTime *datetime;
data = g_new0 (DialogData, 1);
data->browser = browser;
data->file_list = _g_object_list_ref (file_list);
data->builder = _gtk_builder_new_from_file ("change-date.ui", "change_date");
data->settings = g_settings_new (PIX_CHANGE_DATE_SCHEMA);
/* Get the widgets. */
data->dialog = g_object_new (GTK_TYPE_DIALOG,
"title", _("Change Date"),
"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);
data->date_selector = gth_time_selector_new ();
gth_time_selector_show_time (GTH_TIME_SELECTOR (data->date_selector), TRUE, TRUE);
gtk_widget_show (data->date_selector);
gtk_box_pack_start (GTK_BOX (GET_WIDGET ("date_selector_box")), data->date_selector, TRUE, TRUE, 0);
/* Set widgets data. */
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("change_last_modified_checkbutton")),
g_settings_get_boolean (data->settings, PREF_CHANGE_DATE_SET_LAST_MODIFIED_DATE));
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("change_comment_checkbutton")),
g_settings_get_boolean (data->settings, PREF_CHANGE_DATE_SET_COMMENT_DATE));
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("to_following_date_radiobutton")),
g_settings_get_boolean (data->settings, PREF_CHANGE_DATE_TO_FOLLOWING_DATE));
datetime = gth_datetime_new ();
g_get_current_time (&timeval);
if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("to_following_date_radiobutton")))) {
char *s;
s = g_settings_get_string (data->settings, PREF_CHANGE_DATE_DATE);
if (strcmp (s, "") != 0)
gth_datetime_from_exif_date (datetime, s);
else
gth_datetime_from_timeval (datetime, &timeval);
g_free (s);
}
else
gth_datetime_from_timeval (datetime, &timeval);
gth_time_selector_set_value (GTH_TIME_SELECTOR (data->date_selector), datetime);
gth_datetime_free (datetime);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("to_last_modified_date_radiobutton")),
g_settings_get_boolean (data->settings, PREF_CHANGE_DATE_TO_FILE_MODIFIED_DATE));
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("to_creation_date_radiobutton")),
g_settings_get_boolean (data->settings, PREF_CHANGE_DATE_TO_FILE_CREATION_DATE));
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("to_photo_original_date_radiobutton")),
g_settings_get_boolean (data->settings, PREF_CHANGE_DATE_TO_PHOTO_ORIGINAL_DATE));
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("adjust_time_radiobutton")),
g_settings_get_boolean (data->settings, PREF_CHANGE_DATE_ADJUST_TIME));
if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("adjust_time_radiobutton")))) {
int adjustement;
int sign;
int hours;
int minutes;
int seconds;
adjustement = g_settings_get_int (data->settings, PREF_CHANGE_DATE_TIME_ADJUSTMENT);
if (adjustement < 0) {
sign = -1;
adjustement = - adjustement;
}
else
sign = 1;
hours = adjustement / 3600;
adjustement = adjustement % 3600;
minutes = adjustement / 60;
adjustement = adjustement % 60;
seconds = adjustement;
gtk_spin_button_set_value (GTK_SPIN_BUTTON (GET_WIDGET ("adjust_time_h_spinbutton")), hours);
gtk_spin_button_set_value (GTK_SPIN_BUTTON (GET_WIDGET ("adjust_time_m_spinbutton")), minutes);
gtk_spin_button_set_value (GTK_SPIN_BUTTON (GET_WIDGET ("adjust_time_s_spinbutton")), seconds);
gtk_combo_box_set_active (GTK_COMBO_BOX (GET_WIDGET ("adjust_sign_combobox")), (sign >= 0) ? 0 : 1);
}
update_sensitivity (data);
/* Set the signals handlers. */
g_signal_connect (G_OBJECT (data->dialog),
"destroy",
G_CALLBACK (dialog_destroy_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 (gtk_dialog_get_widget_for_response (GTK_DIALOG (data->dialog), GTK_RESPONSE_OK),
"clicked",
G_CALLBACK (ok_button_clicked),
data);
g_signal_connect (GET_WIDGET ("change_last_modified_checkbutton"),
"clicked",
G_CALLBACK (radio_button_clicked),
data);
g_signal_connect (GET_WIDGET ("change_comment_checkbutton"),
"clicked",
G_CALLBACK (radio_button_clicked),
data);
g_signal_connect (GET_WIDGET ("to_following_date_radiobutton"),
"clicked",
G_CALLBACK (radio_button_clicked),
data);
g_signal_connect (GET_WIDGET ("to_last_modified_date_radiobutton"),
"clicked",
G_CALLBACK (radio_button_clicked),
data);
g_signal_connect (GET_WIDGET ("to_creation_date_radiobutton"),
"clicked",
G_CALLBACK (radio_button_clicked),
data);
g_signal_connect (GET_WIDGET ("to_photo_original_date_radiobutton"),
"clicked",
G_CALLBACK (radio_button_clicked),
data);
g_signal_connect (GET_WIDGET ("adjust_time_radiobutton"),
"clicked",
G_CALLBACK (radio_button_clicked),
data);
/* run dialog. */
gtk_widget_show (data->dialog);
}