2008-09-15 Alberto Garcia <agarcia@igalia.com>
[hildon] / src / hildon-time-selector.c
index 3d60531..bc5a485 100644 (file)
@@ -27,9 +27,6 @@
  *
  */
 
-
-#include "hildon-time-selector.h"
-
 #define _GNU_SOURCE     /* needed for GNU nl_langinfo_l */
 #define __USE_GNU       /* needed for locale */
 
 #include <time.h>
 #include <langinfo.h>
 #include <locale.h>
-
 #include <gconf/gconf-client.h>
 
+#include "hildon-time-selector.h"
+
 #define HILDON_TIME_SELECTOR_GET_PRIVATE(obj)                           \
   (G_TYPE_INSTANCE_GET_PRIVATE ((obj), HILDON_TYPE_TIME_SELECTOR, HildonTimeSelectorPrivate))
 
@@ -55,8 +53,7 @@ G_DEFINE_TYPE (HildonTimeSelector, hildon_time_selector, HILDON_TYPE_TOUCH_SELEC
 #define LAST_YEAR 50    /* since current year */
 
 #define _(String)  dgettext("hildon-libs", String)
-
-/* #define _(String) "%I:%M %p" debug purposes */
+#define N_(String) String
 
 
 /* FIXME: we should get this two props from the clock ui headers */
@@ -151,16 +148,16 @@ hildon_time_selector_init (HildonTimeSelector * selector)
   selector->priv->minutes_model = _create_minutes_model (selector);
 
   hildon_touch_selector_append_text_column (HILDON_TOUCH_SELECTOR (selector),
-                                            selector->priv->hours_model);
+                                            selector->priv->hours_model, TRUE);
 
   hildon_touch_selector_append_text_column (HILDON_TOUCH_SELECTOR (selector),
-                                            selector->priv->minutes_model);
+                                            selector->priv->minutes_model, TRUE);
 
   if (selector->priv->ampm_format) {
     selector->priv->ampm_model = _create_ampm_model (selector);
 
     hildon_touch_selector_append_text_column (HILDON_TOUCH_SELECTOR (selector),
-                                              selector->priv->ampm_model);
+                                              selector->priv->ampm_model, TRUE);
 
     g_signal_connect (G_OBJECT (selector),
                       "changed", G_CALLBACK (_manage_ampm_selection_cb),
@@ -206,9 +203,9 @@ _custom_print_func (HildonTouchSelector * touch_selector)
   tm.tm_hour = hours;
 
   if (selector->priv->ampm_format) {
-    strftime (string, 255, _("wdgt_va_12h_hours"), &tm);
+    strftime (string, 255, _("wdgt_va_12h_time"), &tm);
   } else {
-    strftime (string, 255, _("wdgt_va_24h_hours"), &tm);
+    strftime (string, 255, _("wdgt_va_24h_time"), &tm);
   }
 
 
@@ -222,17 +219,18 @@ _create_minutes_model (HildonTimeSelector * selector)
 {
   GtkListStore *store_minutes = NULL;
   gint i = 0;
-  gchar *label = NULL;
+  static gchar label[255];
+  struct tm tm = { 0, 0, 0, 0, 0, 0, 0, 0, 0 };
   GtkTreeIter iter;
 
   store_minutes = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_INT);
   for (i = 0; i <= 59; i++) {
-    label = g_strdup_printf ("%02d", i);
+    tm.tm_min = i;
+    strftime (label, 255, _("wdgt_va_minutes"), &tm);
 
     gtk_list_store_append (store_minutes, &iter);
     gtk_list_store_set (store_minutes, &iter,
                         COLUMN_STRING, label, COLUMN_INT, i, -1);
-    g_free (label);
   }
 
   return GTK_TREE_MODEL (store_minutes);
@@ -243,27 +241,34 @@ _create_hours_model (HildonTimeSelector * selector)
 {
   GtkListStore *store_hours = NULL;
   gint i = 0;
-  gchar *label = NULL;
   GtkTreeIter iter;
-  gint last_hour = 12;
-  gint addition = 0;
+  struct tm tm = { 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+  static gchar label[255];
+  static gint range_12h[12] = {12, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11};
+  static gint range_24h[24] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,
+                               12,13,14,15,16,17,18,19,20,21,22,23};
+  gint *range = NULL;
+  gint num_elements = 0;
+  gchar *format_string = NULL;
 
   if (selector->priv->ampm_format) {
-    last_hour = 12;
-    addition = 1;
+    range = range_12h;
+    num_elements = 12;
+    format_string = N_("wdgt_va_12h_hours");
   } else {
-    last_hour = 24;
-    addition = 0;
+    range = range_24h;
+    num_elements = 24;
+    format_string = N_("wdgt_va_24h_hours");
   }
 
   store_hours = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_INT);
-  for (i = 0; i < last_hour; i++) {
-    label = g_strdup_printf ("%02d", i + addition);
+  for (i = 0; i < num_elements; i++) {
+    tm.tm_hour = range[i];
+    strftime (label, 255, _(format_string), &tm);
 
     gtk_list_store_append (store_hours, &iter);
     gtk_list_store_set (store_hours, &iter,
-                        COLUMN_STRING, label, COLUMN_INT, i, -1);
-    g_free (label);
+                        COLUMN_STRING, label, COLUMN_INT, range[i], -1);
   }
 
   return GTK_TREE_MODEL (store_hours);
@@ -274,16 +279,26 @@ _create_ampm_model (HildonTimeSelector * selector)
 {
   GtkListStore *store_ampm = NULL;
   GtkTreeIter iter;
+  static gchar label[255];
+  struct tm tm = { 0, 0, 0, 0, 0, 0, 0, 0, 0 };
 
   store_ampm = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_INT);
 
+  tm.tm_hour = 0;
+  strftime (label, 255, _("wdgt_va_am_pm"), &tm);
+
   gtk_list_store_append (store_ampm, &iter);
-  gtk_list_store_set (store_ampm, &iter, COLUMN_STRING, "am",   /* FIXME: use nl_langinfo am/pm strings */
+  gtk_list_store_set (store_ampm, &iter,
+                      COLUMN_STRING, label,
                       COLUMN_INT, 0, -1);
 
+  tm.tm_hour = 12;
+  strftime (label, 255, _("wdgt_va_am_pm"), &tm);
+
   gtk_list_store_append (store_ampm, &iter);
   gtk_list_store_set (store_ampm, &iter,
-                      COLUMN_STRING, "pm", COLUMN_INT, 1, -1);
+                      COLUMN_STRING, label,
+                      COLUMN_INT, 1, -1);
 
   return GTK_TREE_MODEL (store_ampm);
 }
@@ -318,8 +333,8 @@ _manage_ampm_selection_cb (HildonTouchSelector * touch_selector,
   selector = HILDON_TIME_SELECTOR (touch_selector);
 
   if (num_column == COLUMN_AMPM) {
-    hildon_touch_selector_get_active_iter (HILDON_TOUCH_SELECTOR (selector),
-                                           COLUMN_AMPM, &iter);
+    hildon_touch_selector_get_selected (HILDON_TOUCH_SELECTOR (selector),
+                                        COLUMN_AMPM, &iter);
     gtk_tree_model_get (selector->priv->ampm_model, &iter, COLUMN_INT, &pm, -1);
 
     selector->priv->pm = pm;
@@ -336,7 +351,7 @@ _check_ampm_format (HildonTimeSelector * selector)
   client = gconf_client_get_default ();
   value = gconf_client_get_bool (client, CLOCK_GCONF_IS_24H_FORMAT, &error);
   if (error != NULL) {
-    g_error
+    g_warning
       ("Error trying to get gconf variable %s, using 24h format by default",
        CLOCK_GCONF_IS_24H_FORMAT);
     g_error_free (error);
@@ -355,15 +370,14 @@ _set_pm (HildonTimeSelector * selector, gboolean pm)
 
   gtk_tree_model_iter_nth_child (selector->priv->ampm_model, &iter, NULL, pm);
 
-  hildon_touch_selector_set_active_iter (HILDON_TOUCH_SELECTOR (selector),
-                                         COLUMN_AMPM, &iter, FALSE);
+  hildon_touch_selector_select_iter (HILDON_TOUCH_SELECTOR (selector),
+                                     COLUMN_AMPM, &iter, FALSE);
 }
 
 /* ------------------------------ PUBLIC METHODS ---------------------------- */
 
 /**
  * hildon_time_selector_new:
- * @:
  *
  * Creates a new #HildonTimeSelector
  *
@@ -375,7 +389,7 @@ hildon_time_selector_new ()
   return g_object_new (HILDON_TYPE_TIME_SELECTOR, NULL);
 }
 
-/**
+/*
  * hours (0-23)
  * minutes (0-59)
  */
@@ -390,26 +404,22 @@ hildon_time_selector_set_time (HildonTimeSelector * selector,
   g_return_val_if_fail (minutes >= 0 && minutes <= 59, FALSE);
 
   if (selector->priv->ampm_format) {
-    if (hours > 12) {
-      hours_item = hours - 13;
-    } else {
-      hours_item = hours - 1;
-    }
-
     _set_pm (selector, hours >= 12);
+
+    hours_item = hours - selector->priv->pm * 12;
   } else {
     hours_item = hours;
   }
 
   gtk_tree_model_iter_nth_child (selector->priv->hours_model, &iter, NULL,
                                  hours_item);
-  hildon_touch_selector_set_active_iter (HILDON_TOUCH_SELECTOR (selector),
-                                         COLUMN_HOURS, &iter, FALSE);
+  hildon_touch_selector_select_iter (HILDON_TOUCH_SELECTOR (selector),
+                                     COLUMN_HOURS, &iter, FALSE);
 
   gtk_tree_model_iter_nth_child (selector->priv->minutes_model, &iter, NULL,
                                  minutes);
-  hildon_touch_selector_set_active_iter (HILDON_TOUCH_SELECTOR (selector),
-                                         COLUMN_MINUTES, &iter, FALSE);
+  hildon_touch_selector_select_iter (HILDON_TOUCH_SELECTOR (selector),
+                                     COLUMN_MINUTES, &iter, FALSE);
 
   return TRUE;
 }
@@ -421,18 +431,19 @@ hildon_time_selector_get_time (HildonTimeSelector * selector,
   GtkTreeIter iter;
 
   if (hours != NULL) {
-    hildon_touch_selector_get_active_iter (HILDON_TOUCH_SELECTOR (selector),
-                                           COLUMN_HOURS, &iter);
+    hildon_touch_selector_get_selected (HILDON_TOUCH_SELECTOR (selector),
+                                        COLUMN_HOURS, &iter);
     gtk_tree_model_get (selector->priv->hours_model,
                         &iter, COLUMN_INT, hours, -1);
     if (selector->priv->ampm_format) {
+      *hours %= 12;
       *hours += selector->priv->pm * 12;
     }
   }
 
   if (minutes != NULL) {
-    hildon_touch_selector_get_active_iter (HILDON_TOUCH_SELECTOR (selector),
-                                           COLUMN_MINUTES, &iter);
+    hildon_touch_selector_get_selected (HILDON_TOUCH_SELECTOR (selector),
+                                        COLUMN_MINUTES, &iter);
     gtk_tree_model_get (selector->priv->minutes_model,
                         &iter, COLUMN_INT, minutes, -1);
   }