diff options
-rw-r--r-- | data/datetime-dialog.ui | 14 | ||||
-rw-r--r-- | src/datetime-prefs.c | 57 |
2 files changed, 52 insertions, 19 deletions
diff --git a/data/datetime-dialog.ui b/data/datetime-dialog.ui index 35cb172..4277d72 100644 --- a/data/datetime-dialog.ui +++ b/data/datetime-dialog.ui @@ -2,6 +2,11 @@ <interface> <requires lib="gtk+" version="2.24"/> <!-- interface-naming-policy project-wide --> + <object class="GtkAdjustment" id="dateAdjustment"> + <property name="upper">1.8446744073709552e+19</property> + <property name="step_increment">86400</property> + <property name="page_increment">864000</property> + </object> <object class="GtkWindow" id="locationsDialog"> <property name="can_focus">False</property> <property name="title" translatable="yes">Locations</property> @@ -102,6 +107,11 @@ <column type="gchararray"/> </columns> </object> + <object class="GtkAdjustment" id="timeAdjustment"> + <property name="upper">1.8446744073709552e+19</property> + <property name="step_increment">60</property> + <property name="page_increment">3600</property> + </object> <object class="GtkDialog" id="timeDateDialog"> <property name="can_focus">False</property> <property name="border_width">5</property> @@ -286,6 +296,8 @@ <property name="width_chars">11</property> <property name="xalign">1</property> <property name="invisible_char_set">True</property> + <property name="adjustment">timeAdjustment</property> + <property name="wrap">True</property> </object> <packing> <property name="expand">False</property> @@ -328,6 +340,8 @@ <property name="width_chars">11</property> <property name="xalign">1</property> <property name="invisible_char_set">True</property> + <property name="adjustment">dateAdjustment</property> + <property name="wrap">True</property> </object> <packing> <property name="expand">False</property> diff --git a/src/datetime-prefs.c b/src/datetime-prefs.c index c71217a..b6fd1c9 100644 --- a/src/datetime-prefs.c +++ b/src/datetime-prefs.c @@ -48,9 +48,9 @@ GtkWidget * tz_entry = NULL; CcTimezoneMap * tzmap = NULL; GtkWidget * time_spin = NULL; GtkWidget * date_spin = NULL; -GDateTime * manual_time = NULL; guint save_time_id = 0; gboolean user_edited_time = FALSE; +gboolean changing_time = FALSE; /* Turns the boolean property into a string gsettings */ static GVariant * @@ -255,7 +255,8 @@ static gboolean save_time (gpointer user_data) { if (user_edited_time) { - g_dbus_proxy_call (proxy, "SetTime", g_variant_new ("(x)", g_date_time_to_unix (manual_time)), + gdouble current_value = gtk_spin_button_get_value (GTK_SPIN_BUTTON (date_spin)); + g_dbus_proxy_call (proxy, "SetTime", g_variant_new ("(x)", (guint64)current_value), G_DBUS_CALL_FLAGS_NONE, -1, NULL, dbus_set_answered, "time"); } user_edited_time = FALSE; @@ -287,12 +288,15 @@ spin_focus_out (void) } static int -input_time_text (GtkWidget * spinner, gdouble *value, gpointer user_data) +input_time_text (GtkWidget * spinner, gdouble * value, gpointer user_data) { gboolean is_time = (gboolean)GPOINTER_TO_INT (g_object_get_data (G_OBJECT (spinner), "is-time")); const gchar * text = gtk_entry_get_text (GTK_ENTRY (spinner)); - GDateTime * now = manual_time; + gdouble current_value = gtk_spin_button_get_value (GTK_SPIN_BUTTON (spinner)); + *value = current_value; + + GDateTime * now = g_date_time_new_from_unix_utc (current_value); gint year, month, day, hour, minute, second; year = g_date_time_get_year (now); month = g_date_time_get_month (now); @@ -362,9 +366,13 @@ input_time_text (GtkWidget * spinner, gdouble *value, gpointer user_data) return TRUE; } - g_date_time_unref (manual_time); - manual_time = g_date_time_new_local (year, month, day, hour, minute, second); + gboolean prev_changing = changing_time; + changing_time = TRUE; + GDateTime * new_time = g_date_time_new_local (year, month, day, hour, minute, second); + *value = g_date_time_to_unix (new_time); user_edited_time = TRUE; + g_date_time_unref (new_time); + changing_time = prev_changing; return TRUE; } @@ -386,12 +394,25 @@ format_time_text (GtkWidget * spinner, gpointer user_data) format = "%Y-%m-%d"; } - gchar * formatted = g_date_time_format (manual_time, format); + GDateTime * datetime = g_date_time_new_from_unix_utc (gtk_spin_button_get_value (GTK_SPIN_BUTTON (spinner))); + gchar * formatted = g_date_time_format (datetime, format); gtk_entry_set_text (GTK_ENTRY (spinner), formatted); + g_date_time_unref (datetime); return TRUE; } +static void +spin_copy_value (GtkSpinButton * spinner, GtkSpinButton * other) +{ + if (gtk_spin_button_get_value (spinner) != gtk_spin_button_get_value (other)) { + gtk_spin_button_set_value (other, gtk_spin_button_get_value (spinner)); + } + if (!changing_time) { /* Means user pressed spin buttons */ + user_edited_time = TRUE; + } +} + static gboolean update_spinners (void) { @@ -399,12 +420,13 @@ update_spinners (void) then using the value of the spinner itself. And don't update while user is editing. */ if (!are_spinners_focused ()) { - if (manual_time != NULL) { - g_date_time_unref (manual_time); - } - manual_time = g_date_time_new_now_local (); - format_time_text (time_spin, NULL); - format_time_text (date_spin, NULL); + gboolean prev_changing = changing_time; + changing_time = TRUE; + GDateTime * now = g_date_time_new_now_local (); + gtk_spin_button_set_value (GTK_SPIN_BUTTON (time_spin), (gdouble)g_date_time_to_unix (now)); + /* will be copied to other spin button */ + g_date_time_unref (now); + changing_time = prev_changing; } return TRUE; } @@ -412,12 +434,6 @@ update_spinners (void) static void setup_time_spinners (GtkWidget * time, GtkWidget * date) { - gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (time), FALSE); - gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (date), FALSE); - - gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (time), TRUE); - gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (date), TRUE); - g_signal_connect (time, "input", G_CALLBACK (input_time_text), date); g_signal_connect (date, "input", G_CALLBACK (input_time_text), time); @@ -430,6 +446,9 @@ setup_time_spinners (GtkWidget * time, GtkWidget * date) g_signal_connect (time, "focus-out-event", G_CALLBACK (spin_focus_out), date); g_signal_connect (date, "focus-out-event", G_CALLBACK (spin_focus_out), time); + g_signal_connect (time, "value-changed", G_CALLBACK (spin_copy_value), date); + g_signal_connect (date, "value-changed", G_CALLBACK (spin_copy_value), time); + g_object_set_data (G_OBJECT (time), "is-time", GINT_TO_POINTER (TRUE)); g_object_set_data (G_OBJECT (date), "is-time", GINT_TO_POINTER (FALSE)); |