diff options
-rw-r--r-- | panels/datetime/cc-datetime-panel.c | 242 | ||||
-rw-r--r-- | panels/datetime/datetime.ui | 56 |
2 files changed, 188 insertions, 110 deletions
diff --git a/panels/datetime/cc-datetime-panel.c b/panels/datetime/cc-datetime-panel.c index 9ff5af24f..6435405f9 100644 --- a/panels/datetime/cc-datetime-panel.c +++ b/panels/datetime/cc-datetime-panel.c @@ -51,17 +51,16 @@ struct _CcDateTimePanelPrivate TzLocation *current_location; - guint timeout; - GtkTreeModel *locations; GtkTreeModelFilter *city_filter; - guint hour; - guint minute; + GDateTime *date; GSettings *settings; + GDesktopClockFormat clock_format; }; +static void update_time (CcDateTimePanel *self); static void cc_date_time_panel_get_property (GObject *object, @@ -106,21 +105,13 @@ cc_date_time_panel_dispose (GObject *object) priv->settings = NULL; } - G_OBJECT_CLASS (cc_date_time_panel_parent_class)->dispose (object); -} - -static void -cc_date_time_panel_finalize (GObject *object) -{ - CcDateTimePanelPrivate *priv = CC_DATE_TIME_PANEL (object)->priv; - - if (priv->timeout) + if (priv->date) { - g_source_remove (priv->timeout); - priv->timeout = 0; + g_date_time_unref (priv->date); + priv->date = NULL; } - G_OBJECT_CLASS (cc_date_time_panel_parent_class)->finalize (object); + G_OBJECT_CLASS (cc_date_time_panel_parent_class)->dispose (object); } static void @@ -133,7 +124,6 @@ cc_date_time_panel_class_init (CcDateTimePanelClass *klass) object_class->get_property = cc_date_time_panel_get_property; object_class->set_property = cc_date_time_panel_set_property; object_class->dispose = cc_date_time_panel_dispose; - object_class->finalize = cc_date_time_panel_finalize; } static void @@ -151,14 +141,20 @@ change_clock_settings (GtkWidget *widget, CcDateTimePanel *panel) { CcDateTimePanelPrivate *priv = panel->priv; + GDesktopClockFormat value; g_signal_handlers_block_by_func (priv->settings, clock_settings_changed_cb, panel); if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (W ("12_radiobutton")))) - g_settings_set_enum (priv->settings, CLOCK_FORMAT_KEY, G_DESKTOP_CLOCK_FORMAT_12H); + value = G_DESKTOP_CLOCK_FORMAT_12H; else - g_settings_set_enum (priv->settings, CLOCK_FORMAT_KEY, G_DESKTOP_CLOCK_FORMAT_24H); + value = G_DESKTOP_CLOCK_FORMAT_24H; + + g_settings_set_enum (priv->settings, CLOCK_FORMAT_KEY, value); + priv->clock_format = value; + + update_time (panel); g_signal_handlers_unblock_by_func (priv->settings, clock_settings_changed_cb, panel); @@ -175,6 +171,7 @@ clock_settings_changed_cb (GSettings *settings, GDesktopClockFormat value; value = g_settings_get_enum (settings, CLOCK_FORMAT_KEY); + priv->clock_format = value; radio12 = W ("12_radiobutton"); radio24 = W ("24_radiobutton"); @@ -184,54 +181,51 @@ clock_settings_changed_cb (GSettings *settings, g_signal_handlers_block_by_func (radio12, change_clock_settings, panel); g_signal_handlers_block_by_func (radio24, change_clock_settings, panel); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (radio12), use_12_hour); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (radio24), !use_12_hour); + update_time (panel); + g_signal_handlers_unblock_by_func (radio12, change_clock_settings, panel); g_signal_handlers_unblock_by_func (radio24, change_clock_settings, panel); } -static gboolean +static void update_time (CcDateTimePanel *self) { CcDateTimePanelPrivate *priv = self->priv; - GTimeVal timeval; - GtkWidget *widget; - gchar label[32]; - time_t t; - struct tm time_info; - - g_get_current_time (&timeval); - - t = time (NULL); + char *label; + char *am_pm_widgets[] = {"ampm_up_button", "ampm_down_button", "ampm_label" }; + guint i; - localtime_r (&t, &time_info); - - priv->hour = time_info.tm_hour; - priv->minute = time_info.tm_min; + if (priv->clock_format == G_DESKTOP_CLOCK_FORMAT_24H) + { + /* Update the hours label */ + label = g_date_time_format (priv->date, "%H"); + gtk_label_set_text (GTK_LABEL (W("hours_label")), label); + g_free (label); + } + else + { + /* Update the hours label */ + label = g_date_time_format (priv->date, "%I"); + gtk_label_set_text (GTK_LABEL (W("hours_label")), label); + g_free (label); + + /* Set AM/PM */ + label = g_date_time_format (priv->date, "%p"); + gtk_label_set_text (GTK_LABEL (W("ampm_label")), label); + g_free (label); + } - /* Update the hours label */ - strftime (label, 32, "%H", &time_info); - widget = (GtkWidget*) gtk_builder_get_object (priv->builder, "hours_label"); - gtk_label_set_text (GTK_LABEL (widget), label); + for (i = 0; i < G_N_ELEMENTS (am_pm_widgets); i++) + gtk_widget_set_visible (W(am_pm_widgets[i]), + priv->clock_format == G_DESKTOP_CLOCK_FORMAT_12H); /* Update the minutes label */ - strftime (label, 32, "%M", &time_info); - widget = (GtkWidget*) gtk_builder_get_object (priv->builder, "minutes_label"); - gtk_label_set_text (GTK_LABEL (widget), label); - - priv->settings = g_settings_new (CLOCK_SCHEMA); - clock_settings_changed_cb (priv->settings, CLOCK_FORMAT_KEY, self); - g_signal_connect (priv->settings, "changed::" CLOCK_FORMAT_KEY, - G_CALLBACK (clock_settings_changed_cb), self); - - g_signal_connect (W ("12_radiobutton"), "toggled", - G_CALLBACK (change_clock_settings), self); - g_signal_connect (W ("24_radiobutton"), "toggled", - G_CALLBACK (change_clock_settings), self); - - return FALSE; + label = g_date_time_format (priv->date, "%M"); + gtk_label_set_text (GTK_LABEL (W("minutes_label")), label); + g_free (label); } static void @@ -262,27 +256,23 @@ apply_button_clicked_cb (GtkButton *button, { CcDateTimePanelPrivate *priv = self->priv; guint mon, y, d; - struct tm fulltime; time_t unixtime; gchar *filename; + GDateTime *old_date; - mon = 1 + gtk_combo_box_get_active (GTK_COMBO_BOX (W ("month-combobox"))); + old_date = priv->date; + mon = 1 + gtk_combo_box_get_active (GTK_COMBO_BOX (W ("month-combobox"))); y = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (W ("year-spinbutton"))); d = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (W ("day-spinbutton"))); + priv->date = g_date_time_new_local (y, mon, d, + g_date_time_get_hour (old_date), + g_date_time_get_minute (old_date), + g_date_time_get_second (old_date)); + g_date_time_unref (old_date); - - fulltime.tm_sec = 0; - fulltime.tm_min = priv->minute; - fulltime.tm_hour = priv->hour; - fulltime.tm_mday = d; - fulltime.tm_mon = mon; - fulltime.tm_year = y - 1900; - fulltime.tm_isdst = -1; - - - unixtime = mktime (&fulltime); + unixtime = g_date_time_to_unix (priv->date); set_system_time_async (unixtime, (GFunc) set_time_cb, self, NULL); @@ -510,46 +500,67 @@ city_changed_cb (GtkComboBox *box, } static void +month_year_changed (GtkWidget *widget, + CcDateTimePanel *panel) +{ + CcDateTimePanelPrivate *priv = panel->priv; + guint mon, y; + guint num_days; + GtkAdjustment *adj; + GtkSpinButton *day_spin; + + mon = 1 + gtk_combo_box_get_active (GTK_COMBO_BOX (W ("month-combobox"))); + y = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (W ("year-spinbutton"))); + + /* Check the number of days in that month */ + num_days = g_date_get_days_in_month (mon, y); + + day_spin = GTK_SPIN_BUTTON (W("day-spinbutton")); + adj = GTK_ADJUSTMENT (gtk_spin_button_get_adjustment (day_spin)); + gtk_adjustment_set_upper (adj, num_days + 1); + + if (gtk_spin_button_get_value_as_int (day_spin) > num_days) + gtk_spin_button_set_value (day_spin, num_days); +} + +static void change_time (GtkButton *button, CcDateTimePanel *panel) { CcDateTimePanelPrivate *priv = panel->priv; const gchar *widget_name; - gchar *new_str; - guint *value, max, min; - GtkWidget *label; + gint direction; + GDateTime *old_date; + + old_date = priv->date; widget_name = gtk_buildable_get_name (GTK_BUILDABLE (button)); - min = 0; + if (strstr (widget_name, "up")) + direction = 1; + else + direction = -1; + if (widget_name[0] == 'h') { - /* change hour */ - label = W ("hours_label"); - max = 23; - value = &priv->hour; + priv->date = g_date_time_add_hours (old_date, direction); } - else + else if (widget_name[0] == 'm') { - /* change minute */ - label = W ("minutes_label"); - max = 59; - value = &priv->minute; + priv->date = g_date_time_add_minutes (old_date, direction); } - - if (strstr (widget_name, "up")) - *value = *value + 1; else - *value = *value - 1; - - if (*value > max) - *value = min; - else if (*value < min) - *value = max; + { + int hour; + hour = g_date_time_get_hour (old_date); + if (hour >= 12) + priv->date = g_date_time_add_hours (old_date, -12); + else + priv->date = g_date_time_add_hours (old_date, 12); + } + g_date_time_unref (old_date); - new_str = g_strdup_printf ("%02d", *value); - gtk_label_set_text (GTK_LABEL (label), new_str); - g_free (new_str); + update_time (panel); } static void @@ -558,12 +569,14 @@ cc_date_time_panel_init (CcDateTimePanel *self) CcDateTimePanelPrivate *priv; gchar *objects[] = { "datetime-panel", "region-liststore", "city-liststore", "month-liststore", "city-modelfilter", "city-modelsort", NULL }; + char *buttons[] = { "hour_up_button", "hour_down_button", "min_up_button", + "min_down_button", "ampm_up_button", "ampm_down_button" }; GtkWidget *widget; GtkAdjustment *adjustment; GError *err = NULL; - GDate *date; GtkTreeModelFilter *city_modelfilter; GtkTreeModelSort *city_modelsort; + guint i, num_days; int ret; priv = self->priv = DATE_TIME_PANEL_PRIVATE (self); @@ -582,34 +595,34 @@ cc_date_time_panel_init (CcDateTimePanel *self) } /* set up time editing widgets */ - g_signal_connect (W("hour_up_button"), "clicked", G_CALLBACK (change_time), - self); - g_signal_connect (W("hour_down_button"), "clicked", G_CALLBACK (change_time), - self); - g_signal_connect (W("min_up_button"), "clicked", G_CALLBACK (change_time), - self); - g_signal_connect (W("min_down_button"), "clicked", G_CALLBACK (change_time), - self); + for (i = 0; i < G_N_ELEMENTS (buttons); i++) + { + g_signal_connect (W(buttons[i]), "clicked", G_CALLBACK (change_time), + self); + } /* set up date editing widgets */ - date = g_date_new (); - g_date_set_time_t (date, time (NULL)); + priv->date = g_date_time_new_now_local (); gtk_combo_box_set_active (GTK_COMBO_BOX (W ("month-combobox")), - g_date_get_month (date) - 1); - - adjustment = (GtkAdjustment*) gtk_adjustment_new (g_date_get_day (date), 0, - 31, 1, 10, 1); + g_date_time_get_month (priv->date) - 1); + g_signal_connect (G_OBJECT (W("month-combobox")), "changed", + G_CALLBACK (month_year_changed), self); + + num_days = g_date_get_days_in_month (g_date_time_get_month (priv->date), + g_date_time_get_year (priv->date)); + adjustment = (GtkAdjustment*) gtk_adjustment_new (g_date_time_get_day_of_month (priv->date), 1, + num_days + 1, 1, 10, 1); gtk_spin_button_set_adjustment (GTK_SPIN_BUTTON (W ("day-spinbutton")), adjustment); - adjustment = (GtkAdjustment*) gtk_adjustment_new (g_date_get_year (date), + adjustment = (GtkAdjustment*) gtk_adjustment_new (g_date_time_get_year (priv->date), G_MINDOUBLE, G_MAXDOUBLE, 1, 10, 1); gtk_spin_button_set_adjustment (GTK_SPIN_BUTTON (W ("year-spinbutton")), adjustment); - g_date_free (date); - date = NULL; + g_signal_connect (G_OBJECT (W("year-spinbutton")), "value-changed", + G_CALLBACK (month_year_changed), self); /* set up timezone map */ priv->map = widget = (GtkWidget *) cc_timezone_map_new (); @@ -626,6 +639,17 @@ cc_date_time_panel_init (CcDateTimePanel *self) "datetime-panel"))); + /* setup the time itself */ + priv->settings = g_settings_new (CLOCK_SCHEMA); + clock_settings_changed_cb (priv->settings, CLOCK_FORMAT_KEY, self); + g_signal_connect (priv->settings, "changed::" CLOCK_FORMAT_KEY, + G_CALLBACK (clock_settings_changed_cb), self); + + g_signal_connect (W ("12_radiobutton"), "toggled", + G_CALLBACK (change_clock_settings), self); + g_signal_connect (W ("24_radiobutton"), "toggled", + G_CALLBACK (change_clock_settings), self); + update_time (self); g_signal_connect ((GtkWidget*) gtk_builder_get_object (priv->builder, diff --git a/panels/datetime/datetime.ui b/panels/datetime/datetime.ui index 8c825ea9b..84c85226e 100644 --- a/panels/datetime/datetime.ui +++ b/panels/datetime/datetime.ui @@ -129,7 +129,7 @@ <object class="GtkTable" id="table2"> <property name="visible">True</property> <property name="n_rows">3</property> - <property name="n_columns">3</property> + <property name="n_columns">4</property> <property name="column_spacing">12</property> <property name="row_spacing">6</property> <child> @@ -254,6 +254,60 @@ <child> <placeholder/> </child> + <child> + <object class="GtkLabel" id="ampm_label"> + <property name="visible">False</property> + <property name="label" translatable="yes">AM</property> + <attributes> + <attribute name="weight" value="bold"/> + <attribute name="scale" value="2.500000"/> + </attributes> + </object> + <packing> + <property name="left_attach">3</property> + <property name="right_attach">4</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + </packing> + </child> + <child> + <object class="GtkButton" id="ampm_up_button"> + <property name="visible">False</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="relief">none</property> + <child> + <object class="GtkArrow" id="arrow5"> + <property name="visible">True</property> + <property name="arrow_type">up</property> + </object> + </child> + </object> + <packing> + <property name="left_attach">3</property> + <property name="right_attach">4</property> + </packing> + </child> + <child> + <object class="GtkButton" id="ampm_down_button"> + <property name="visible">False</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="relief">none</property> + <child> + <object class="GtkArrow" id="arrow6"> + <property name="visible">True</property> + <property name="arrow_type">down</property> + </object> + </child> + </object> + <packing> + <property name="left_attach">3</property> + <property name="right_attach">4</property> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> + </packing> + </child> </object> </child> </object> |