[gthumb] change_date: allow to set the date without touching the time



commit 2d2f5ee4d41c837ec637eadedb3cbcae97125730
Author: Paolo Bacchilega <paobac src gnome org>
Date:   Sat Aug 14 20:01:46 2010 +0200

    change_date: allow to set the date without touching the time
    
    [bug #622245]

 extensions/catalogs/dlg-catalog-properties.c  |    2 +-
 extensions/change_date/dlg-change-date.c      |    1 +
 extensions/change_date/gth-change-date-task.c |   88 +++++++++++++++++-------
 gthumb/gth-test-simple.c                      |    2 +-
 gthumb/gth-time-selector.c                    |   52 +++++++++++++-
 gthumb/gth-time-selector.h                    |    3 +-
 gthumb/gth-time.c                             |    7 ++-
 7 files changed, 120 insertions(+), 35 deletions(-)
---
diff --git a/extensions/catalogs/dlg-catalog-properties.c b/extensions/catalogs/dlg-catalog-properties.c
index 32969c3..26f822a 100644
--- a/extensions/catalogs/dlg-catalog-properties.c
+++ b/extensions/catalogs/dlg-catalog-properties.c
@@ -214,7 +214,7 @@ dlg_catalog_properties (GthBrowser  *browser,
 	/* Set widgets data. */
 
 	data->time_selector = gth_time_selector_new ();
-	gth_time_selector_show_time (GTH_TIME_SELECTOR (data->time_selector), FALSE);
+	gth_time_selector_show_time (GTH_TIME_SELECTOR (data->time_selector), FALSE, FALSE);
 	gtk_widget_show (data->time_selector);
 	gtk_box_pack_start (GTK_BOX (GET_WIDGET ("date_container_box")), data->time_selector, TRUE, TRUE, 0);
 
diff --git a/extensions/change_date/dlg-change-date.c b/extensions/change_date/dlg-change-date.c
index 9312a6d..f638454 100644
--- a/extensions/change_date/dlg-change-date.c
+++ b/extensions/change_date/dlg-change-date.c
@@ -153,6 +153,7 @@ dlg_change_date (GthBrowser *browser,
 
 	data->dialog = GET_WIDGET ("change_date_dialog");
 	data->date_selector = gth_time_selector_new ();
+	gth_time_selector_show_time (GTH_TIME_SELECTOR (data->date_selector), TRUE, TRUE);
 
 	datetime = gth_datetime_new ();
 	g_get_current_time (&timeval);
diff --git a/extensions/change_date/gth-change-date-task.c b/extensions/change_date/gth-change-date-task.c
index ad23adb..57125e6 100644
--- a/extensions/change_date/gth-change-date-task.c
+++ b/extensions/change_date/gth-change-date-task.c
@@ -105,6 +105,22 @@ update_modification_time (GthChangeDateTask *self)
 				set_date_time_from_change_type (self, date_time, GTH_CHANGE_TO_FILE_MODIFIED_DATE, file_data);
 			else
 				set_date_time_from_change_type (self, date_time, self->priv->change_type, file_data);
+
+			/* Read the time from the attribute if it's not valid in
+			 * date_time. */
+
+			if (! gth_time_valid (date_time->time)) {
+				GTimeVal    *original_modification_time;
+				GthDateTime *original_date_time;
+
+				original_modification_time = gth_file_data_get_modification_time (file_data);
+				original_date_time = gth_datetime_new ();
+				gth_datetime_from_timeval (original_date_time, original_modification_time);
+				*date_time->time = *original_date_time->time;
+
+				gth_datetime_free (original_date_time);
+			}
+
 			if (! gth_datetime_valid (date_time))
 				continue;
 
@@ -160,39 +176,59 @@ set_date_metadata (GthFileData *file_data,
 		   GthDateTime *date_time,
 		   int          timezone_offset)
 {
-	char    *raw;
-	char    *formatted;
-	GObject *metadata;
+	GthDateTime *new_date_time;
+
+	new_date_time = gth_datetime_new ();
+	gth_datetime_copy (date_time, new_date_time);
 
 	if (timezone_offset != 0) {
-		GTimeVal     timeval;
-		GthDateTime *adjusted_date;
+		GTimeVal timeval;
 
-		gth_datetime_to_timeval (date_time, &timeval);
+		gth_datetime_to_timeval (new_date_time, &timeval);
 		timeval.tv_sec += HOURS_TO_SECONDS (timezone_offset);
-		adjusted_date = gth_datetime_new ();
-		gth_datetime_from_timeval (adjusted_date, &timeval);
-		raw = gth_datetime_to_exif_date (adjusted_date);
-		formatted = gth_datetime_strftime (adjusted_date, "%x");
-
-		gth_datetime_free (adjusted_date);
+		gth_datetime_from_timeval (new_date_time, &timeval);
 	}
 	else {
-		raw = gth_datetime_to_exif_date (date_time);
-		formatted = gth_datetime_strftime (date_time, "%x");
+		/* Read the time from the attribute if it's not valid in
+		 * date_time. */
+
+		if (! gth_time_valid (new_date_time->time)) {
+			GthMetadata *original_date;
+
+			original_date = (GthMetadata *) g_file_info_get_attribute_object (file_data->info, attribute);
+			if (original_date != NULL) {
+				GthDateTime *original_date_time;
+
+				original_date_time = gth_datetime_new ();
+				gth_datetime_from_exif_date (original_date_time, gth_metadata_get_raw (original_date));
+				*new_date_time->time = *original_date_time->time;
+
+				gth_datetime_free (original_date_time);
+			}
+		}
+	}
+
+	if (gth_datetime_valid (new_date_time)) {
+		char    *raw;
+		char    *formatted;
+		GObject *metadata;
+
+		raw = gth_datetime_to_exif_date (new_date_time);
+		formatted = gth_datetime_strftime (new_date_time, "%x");
+		metadata = (GObject *) gth_metadata_new ();
+		g_object_set (metadata,
+			      "id", attribute,
+			      "raw", raw,
+			      "formatted", formatted,
+			      NULL);
+		g_file_info_set_attribute_object (file_data->info, attribute, metadata);
+
+		g_object_unref (metadata);
+		g_free (formatted);
+		g_free (raw);
 	}
 
-	metadata = (GObject *) gth_metadata_new ();
-	g_object_set (metadata,
-		      "id", attribute,
-		      "raw", raw,
-		      "formatted", formatted,
-		      NULL);
-	g_file_info_set_attribute_object (file_data->info, attribute, metadata);
-
-	g_object_unref (metadata);
-	g_free (formatted);
-	g_free (raw);
+	gth_datetime_free (new_date_time);
 }
 
 
@@ -266,7 +302,7 @@ info_ready_cb (GList    *files,
 		else {
 			gth_datetime_clear (date_time);
 			set_date_time_from_change_type (self, date_time, self->priv->change_type, file_data);
-			if (gth_datetime_valid (date_time)) {
+			if (g_date_valid (date_time->date)) {
 				if (self->priv->fields & GTH_CHANGE_COMMENT_DATE) {
 					set_date_metadata (file_data, "general::datetime", date_time, 0);
 				}
diff --git a/gthumb/gth-test-simple.c b/gthumb/gth-test-simple.c
index d88aa37..f4407e5 100644
--- a/gthumb/gth-test-simple.c
+++ b/gthumb/gth-test-simple.c
@@ -418,7 +418,7 @@ create_control_for_date (GthTestSimple *test)
 	/* date selector */
 
 	test->priv->time_selector = gth_time_selector_new ();
-	gth_time_selector_show_time (GTH_TIME_SELECTOR (test->priv->time_selector), FALSE);
+	gth_time_selector_show_time (GTH_TIME_SELECTOR (test->priv->time_selector), FALSE, FALSE);
 	gtk_widget_show (test->priv->time_selector);
 
 	if (test->priv->data.date != NULL) {
diff --git a/gthumb/gth-time-selector.c b/gthumb/gth-time-selector.c
index 79a280e..b42d8a9 100644
--- a/gthumb/gth-time-selector.c
+++ b/gthumb/gth-time-selector.c
@@ -42,10 +42,12 @@ struct _GthTimeSelectorPrivate
 	GtkWidget   *calendar_button;
 	GtkWidget   *calendar;
 	GtkWidget   *calendar_popup;
+	GtkWidget   *use_time_checkbutton;
 	GtkWidget   *time_combo_box;
 	GtkWidget   *popup_box;
 	GtkWidget   *now_button;
 	gboolean     use_time;
+	gboolean     optional_time;
 	gulong       day_selected_event;
 };
 
@@ -247,6 +249,17 @@ gth_time_selector_changed (GthTimeSelector *self)
 
 
 static void
+use_time_checkbutton_toggled_cb (GtkToggleButton *button,
+				 gpointer         user_data)
+{
+	GthTimeSelector *self = user_data;
+
+	self->priv->use_time = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->priv->use_time_checkbutton));
+	gtk_widget_set_sensitive (self->priv->time_combo_box, self->priv->use_time);
+}
+
+
+static void
 today_button_clicked_cb (GtkButton *button,
 			 gpointer   user_data)
 {
@@ -392,6 +405,7 @@ gth_time_selector_construct (GthTimeSelector *self)
 	GtkWidget   *frame;
 	GtkWidget   *box;
 	GtkWidget   *button_box;
+	GtkWidget   *time_box;
 	GtkWidget   *button;
 	GthDateTime *dt;
 	guint8       h;
@@ -470,10 +484,18 @@ gth_time_selector_construct (GthTimeSelector *self)
 			  G_CALLBACK (now_button_clicked_cb),
 			  self);
 
+	time_box = gtk_hbox_new (FALSE, 0);
+	gtk_widget_show (time_box);
+	gtk_box_pack_start (GTK_BOX (self), time_box, FALSE, FALSE, 0);
+
+	self->priv->use_time_checkbutton = gtk_check_button_new ();
+	gtk_widget_show (self->priv->use_time_checkbutton);
+	gtk_box_pack_start (GTK_BOX (time_box), self->priv->use_time_checkbutton, FALSE, FALSE, 0);
+
 	self->priv->time_combo_box = gtk_combo_box_entry_new_text ();
 	gtk_entry_set_width_chars (GTK_ENTRY (gtk_bin_get_child (GTK_BIN (self->priv->time_combo_box))), 10);
 	gtk_widget_show (self->priv->time_combo_box);
-	gtk_box_pack_start (GTK_BOX (self), self->priv->time_combo_box, FALSE, FALSE, 0);
+	gtk_box_pack_start (GTK_BOX (time_box), self->priv->time_combo_box, FALSE, FALSE, 0);
 
 	dt = gth_datetime_new ();
 	g_date_set_dmy (dt->date, 1, 1, 2000);
@@ -491,6 +513,8 @@ gth_time_selector_construct (GthTimeSelector *self)
 		g_free (text);
 	}
 
+	gth_time_selector_show_time (self, TRUE, FALSE);
+
 	g_signal_connect (self->priv->date_entry,
 			  "activate",
 			  G_CALLBACK (date_entry_activate_cb),
@@ -499,6 +523,10 @@ gth_time_selector_construct (GthTimeSelector *self)
 				  "changed",
 				  G_CALLBACK (gth_time_selector_changed),
 				  self);
+	g_signal_connect (self->priv->use_time_checkbutton,
+			  "toggled",
+			  G_CALLBACK (use_time_checkbutton_toggled_cb),
+			  self);
 
 	gth_datetime_free (dt);
 }
@@ -546,10 +574,13 @@ gth_time_selector_new (void)
 
 void
 gth_time_selector_show_time (GthTimeSelector *self,
-			     gboolean         show)
+			     gboolean         show,
+			     gboolean         optional)
 {
 	self->priv->use_time = show;
-	if (show) {
+	self->priv->optional_time = optional;
+
+	if (show || optional) {
 		gtk_widget_show (self->priv->time_combo_box);
 		gtk_widget_show (self->priv->now_button);
 	}
@@ -558,6 +589,14 @@ gth_time_selector_show_time (GthTimeSelector *self,
 		gtk_widget_hide (self->priv->time_combo_box);
 		gtk_widget_hide (self->priv->now_button);
 	}
+
+	if (self->priv->optional_time)
+		gtk_widget_show (self->priv->use_time_checkbutton);
+	else
+		gtk_widget_hide (self->priv->use_time_checkbutton);
+
+	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (self->priv->use_time_checkbutton), self->priv->use_time);
+	gtk_widget_set_sensitive (self->priv->time_combo_box, self->priv->use_time);
 }
 
 
@@ -568,6 +607,8 @@ gth_time_selector_set_value (GthTimeSelector *self,
 	*self->priv->date_time->date = *date_time->date;
 	if (self->priv->use_time)
 		*self->priv->date_time->time = *date_time->time;
+	else
+		gth_time_clear (self->priv->date_time->time);
 	update_view_from_data (self);
 }
 
@@ -595,5 +636,8 @@ gth_time_selector_get_value (GthTimeSelector *self,
 
 	update_date_from_view (self);
 	*date_time->date = *self->priv->date_time->date;
-	*date_time->time = *self->priv->date_time->time;
+	if (self->priv->use_time)
+		*date_time->time = *self->priv->date_time->time;
+	else
+		gth_time_clear (date_time->time);
 }
diff --git a/gthumb/gth-time-selector.h b/gthumb/gth-time-selector.h
index 826f771..d715645 100644
--- a/gthumb/gth-time-selector.h
+++ b/gthumb/gth-time-selector.h
@@ -56,7 +56,8 @@ struct _GthTimeSelectorClass
 GType         gth_time_selector_get_type       (void) G_GNUC_CONST;
 GtkWidget *   gth_time_selector_new            (void);
 void          gth_time_selector_show_time      (GthTimeSelector *self,
-						gboolean         show);
+						gboolean         show,
+						gboolean         optional);
 void          gth_time_selector_set_value      (GthTimeSelector *self,
 					        GthDateTime     *date_time);
 void          gth_time_selector_set_exif_date  (GthTimeSelector *self,
diff --git a/gthumb/gth-time.c b/gthumb/gth-time.c
index 4576f20..cbc6d25 100644
--- a/gthumb/gth-time.c
+++ b/gthumb/gth-time.c
@@ -109,9 +109,12 @@ void
 gth_datetime_copy (GthDateTime *src,
 		   GthDateTime *dest)
 {
-	if (gth_datetime_valid (src)) {
+	if (g_date_valid (src->date)) {
 		*dest->date = *src->date;
-		*dest->time = *src->time;
+		if (gth_time_valid (src->time))
+			*dest->time = *src->time;
+		else
+			gth_time_clear (dest->time);
 	}
 	else
 		gth_datetime_clear (dest);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]