[gthumb] change_date: allow to set the date without touching the time
- From: Paolo Bacchilega <paobac src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gthumb] change_date: allow to set the date without touching the time
- Date: Sat, 14 Aug 2010 18:07:29 +0000 (UTC)
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]