[datetime popup module] Dark theme UX v0.9 changes: Datetime picker popup title text...
authorsumanth <sumanth.m@samsung.com>
Thu, 1 Aug 2013 00:00:33 +0000 (05:30 +0530)
committerSungho Kwak <sungho1.kwak@samsung.com>
Tue, 6 Aug 2013 05:16:46 +0000 (14:16 +0900)
Change-Id: I74befd79ef638a10093c81a5680eeeb700be33e3

po/dt_fmt.po
src/lib/elm_datetime.c
src/modules/datetime_input_popup/datetime_input_popup.c

index 084a986..57a9847 100644 (file)
@@ -219,7 +219,7 @@ msgid "en_GB.UTF-8_DTFMT_12HR"
 msgstr "%d/%m/%Y%I:%M%p"
 
 msgid "en_US.UTF-8_DTFMT_12HR"
-msgstr "%d/%m/%Y%I:%M%p"
+msgstr "%m/%d/%Y%I:%M%p"
 
 msgid "en_ZW.UTF-8_DTFMT_12HR"
 msgstr "%d/%m/%Y%I:%M%p"
@@ -741,7 +741,7 @@ msgid "en_GB.UTF-8_DTFMT_24HR"
 msgstr "%d/%m/%Y%H:%M"
 
 msgid "en_US.UTF-8_DTFMT_24HR"
-msgstr "%d/%m/%Y%H:%M"
+msgstr "%m/%d/%Y%H:%M"
 
 msgid "en_ZW.UTF-8_DTFMT_24HR"
 msgstr "%d/%m/%Y%H:%M"
index 1135e20..3532936 100644 (file)
@@ -798,7 +798,7 @@ _fields_min_max_get(Evas_Object *obj, struct tm *set_value,
 
    ELM_DATETIME_DATA_GET(obj, sd);
 
-   if (!set_value || min_value || !max_value) return;
+   if (!set_value || !min_value || !max_value) return;
 
    DATETIME_TM_ARRAY(mod_set_timearr, set_value);
    DATETIME_TM_ARRAY(mod_min_timearr, min_value);
@@ -820,8 +820,7 @@ _fields_min_max_get(Evas_Object *obj, struct tm *set_value,
 
         if (idx == ELM_DATETIME_DATE)
           {
-             max_days = _max_days_get(mod_set_timearr[ELM_DATETIME_YEAR],
-                                      mod_set_timearr[ELM_DATETIME_MONTH]);
+             max_days = _max_days_get(set_value->tm_year, set_value->tm_mon);
              if (max > max_days) max = max_days;
           }
         for (i = 0; i < idx; i++)
index a9673de..1228330 100644 (file)
@@ -9,12 +9,21 @@
 #define STRUCT_TM_TIME_12HRS_MAX_VALUE  12
 #define STRUCT_TM_TIME_24HRS_MAX_VALUE  23
 
+/* struct tm does not define the fields in the order year, month,
+ * date, hour, minute. values are reassigned to an array for easy
+ * handling.
+ */
+#define DATETIME_MODULE_TM_ARRAY(intptr, tmptr) \
+  int *intptr[] = {                             \
+     &(tmptr)->tm_year,                         \
+     &(tmptr)->tm_mon,                          \
+     &(tmptr)->tm_mday,                         \
+     &(tmptr)->tm_hour,                         \
+     &(tmptr)->tm_min}
+
 static const char *field_styles[] = {
                          "year", "month", "date", "hour", "minute", "ampm" };
 
-static int days_in_month[TOTAL_NUMBER_OF_MONTHS] = {
-                         31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
-
 static char month_arr[TOTAL_NUMBER_OF_MONTHS][MONTH_STRING_MAX_SIZE];
 
 typedef struct _Popup_Module_Data Popup_Module_Data;
@@ -25,8 +34,7 @@ struct _Popup_Module_Data
    Evas_Object *popup;
    Evas_Object *datepicker_layout, *timepicker_layout;
    Evas_Object *popup_field[DATETIME_FIELD_COUNT];
-   double time_hours;
-   Eina_Bool hour_incr, hour_decr;
+   struct tm set_time;
    Eina_Bool time_24hr;
 };
 
@@ -182,58 +190,6 @@ _timepicker_hide_cb(void *data,
 }
 
 static void
-_hour_increment_start_cb(void *data,
-                   Evas_Object *obj __UNUSED__,
-                   const char *emission __UNUSED__,
-                   const char *source __UNUSED__)
-{
-   Popup_Module_Data *popup_mod;
-   popup_mod = (Popup_Module_Data *)data;
-   if (!popup_mod) return;
-
-   popup_mod->hour_incr = EINA_TRUE;
-}
-
-static void
-_hour_increment_stop_cb(void *data,
-                   Evas_Object *obj __UNUSED__,
-                   const char *emission __UNUSED__,
-                   const char *source __UNUSED__)
-{
-   Popup_Module_Data *popup_mod;
-   popup_mod = (Popup_Module_Data *)data;
-   if (!popup_mod) return;
-
-   popup_mod->hour_incr = EINA_FALSE;
-}
-
-static void
-_hour_decrement_start_cb(void *data,
-                   Evas_Object *obj __UNUSED__,
-                   const char *emission __UNUSED__,
-                   const char *source __UNUSED__)
-{
-   Popup_Module_Data *popup_mod;
-   popup_mod = (Popup_Module_Data *)data;
-   if (!popup_mod) return;
-
-   popup_mod->hour_decr = EINA_TRUE;
-}
-
-static void
-_hour_decrement_stop_cb(void *data,
-                   Evas_Object *obj __UNUSED__,
-                   const char *emission __UNUSED__,
-                   const char *source __UNUSED__)
-{
-   Popup_Module_Data *popup_mod;
-   popup_mod = (Popup_Module_Data *)data;
-   if (!popup_mod) return;
-
-   popup_mod->hour_decr = EINA_FALSE;
-}
-
-static void
 _entry_activated_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__)
 {
    Popup_Module_Data *popup_mod;
@@ -317,50 +273,163 @@ _entry_unfocused_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __
    // TODO: entry_unfocused code
 }
 
+void
+_set_datepicker_popup_title_text(Popup_Module_Data *popup_mod)
+{
+   struct tm set_time;
+   time_t t;
+   char title[BUFF_SIZE];
+   if (!popup_mod) return;
+
+   t = time(NULL);
+   localtime_r(&t, &set_time);
+   set_time.tm_year = (popup_mod->set_time).tm_year;
+   set_time.tm_mon = (popup_mod->set_time).tm_mon;
+   set_time.tm_mday = (popup_mod->set_time).tm_mday;
+   set_time.tm_hour = 0;
+   mktime(&set_time);
+   strftime(title, BUFF_SIZE, "%x, %a", &set_time);
+   elm_object_part_text_set(popup_mod->popup, "title,text", title);
+}
+
+void
+_set_timepicker_popup_title_text(Popup_Module_Data *popup_mod)
+{
+   char title[BUFF_SIZE];
+   if (!popup_mod) return;
+
+   if (popup_mod->time_24hr)
+     strftime(title, BUFF_SIZE, "%H:%M", &(popup_mod->set_time));
+   else
+     strftime(title, BUFF_SIZE, "%I:%M %p", &(popup_mod->set_time));
+   elm_object_part_text_set(popup_mod->popup, "title,text", title);
+}
+
 static void
-_adjust_max_days(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+_datepicker_value_changed_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__)
 {
    Popup_Module_Data *popup_mod;
-   int year, month, max_days;
+   struct tm min_values, max_values;
+   int idx, field_idx, min, max;
 
    popup_mod = (Popup_Module_Data *)data;
    if (!popup_mod) return;
 
-   year = (int)elm_spinner_value_get(popup_mod->popup_field[ELM_DATETIME_YEAR]);
-   month = (int)elm_spinner_value_get(popup_mod->popup_field[ELM_DATETIME_MONTH]) - 1;
+   for (idx = 0; idx < DATETIME_FIELD_COUNT; idx++)
+     if ((obj == popup_mod->popup_field[idx])) break;
+
+   if (idx > ELM_DATETIME_DATE) return;
+
+   field_idx = idx;
+   DATETIME_MODULE_TM_ARRAY(set_val_arr, &popup_mod->set_time);
+   if (field_idx == ELM_DATETIME_YEAR)
+     *set_val_arr[field_idx] = (int)elm_spinner_value_get(obj) + STRUCT_TM_YEAR_BASE_VALUE;
+   else if (field_idx == ELM_DATETIME_MONTH)
+     *set_val_arr[field_idx] = (int)elm_spinner_value_get(obj) - 1;
+   else
+     *set_val_arr[field_idx] = (int)elm_spinner_value_get(obj);
+
+   popup_mod->mod_data.fields_min_max_get(popup_mod->mod_data.base,
+                       &(popup_mod->set_time), &min_values, &max_values);
+
+   DATETIME_MODULE_TM_ARRAY(min_val_arr, &min_values);
+   DATETIME_MODULE_TM_ARRAY(max_val_arr, &max_values);
 
-   max_days = days_in_month[month];
-  // if ((year % 4 == 0) && (year % 100 != 0 || year % 400 == 0)&& (month == 1))
-   if (__isleap(year) && (month == 1))
-     max_days += 1;
+   for (idx = field_idx; idx <= ELM_DATETIME_DATE; idx++)
+     {
+        min = *min_val_arr[idx];
+        max = *max_val_arr[idx];
+        if (idx == ELM_DATETIME_YEAR)
+          {
+             min += STRUCT_TM_YEAR_BASE_VALUE;
+             max += STRUCT_TM_YEAR_BASE_VALUE;
+          }
+        else if (idx == ELM_DATETIME_MONTH)
+          {
+             min += 1;
+             max += 1;
+          }
+        elm_spinner_min_max_set(popup_mod->popup_field[idx], min, max);
+     }
+   for (idx = field_idx; idx <= ELM_DATETIME_DATE; idx++)
+     {
+        if (idx == ELM_DATETIME_YEAR)
+          *set_val_arr[idx] = (int)elm_spinner_value_get(popup_mod->popup_field[idx]) - STRUCT_TM_YEAR_BASE_VALUE;
+        else if (idx == ELM_DATETIME_MONTH)
+          *set_val_arr[idx] = (int)elm_spinner_value_get(popup_mod->popup_field[idx]) - 1;
+        else
+          *set_val_arr[idx] = (int)elm_spinner_value_get(popup_mod->popup_field[idx]);
+     }
 
-   elm_spinner_min_max_set(popup_mod->popup_field[ELM_DATETIME_DATE], 1, max_days);
+   _set_datepicker_popup_title_text(popup_mod);
 }
 
 static void
-_adjust_ampm(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+_timepicker_value_changed_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__)
 {
    Popup_Module_Data *popup_mod;
-   int time_hours, ampm;
+   struct tm min_values, max_values;
+   int hour, hour_min, hour_max;
+   Eina_Bool is_pm;
 
    popup_mod = (Popup_Module_Data *)data;
    if (!popup_mod) return;
 
-   if(popup_mod->time_24hr) return;
-   time_hours = (int)elm_spinner_value_get(popup_mod->popup_field[ELM_DATETIME_HOUR]);
-   if (time_hours == 12 && (popup_mod->hour_incr || (popup_mod->time_hours == 11)))
+   if (obj == popup_mod->popup_field[ELM_DATETIME_HOUR])
+     {
+        hour = (int)elm_spinner_value_get(obj);
+        if (popup_mod->time_24hr)
+          (popup_mod->set_time).tm_hour = hour;
+        else
+          {
+             is_pm = !!elm_spinner_value_get(popup_mod->popup_field[ELM_DATETIME_AMPM]);
+             if (is_pm)
+               {
+                  hour += 12;
+                  if (hour == 24) hour = 0;
+               }
+             (popup_mod->set_time).tm_hour = hour;
+             if (hour == 0 || hour == 12)
+               elm_spinner_value_set(popup_mod->popup_field[ELM_DATETIME_AMPM], !is_pm);
+          }
+     }
+   else
      {
-        ampm = (int)elm_spinner_value_get(popup_mod->popup_field[ELM_DATETIME_AMPM]);
-        ampm = !ampm;
-        elm_spinner_value_set(popup_mod->popup_field[ELM_DATETIME_AMPM], ampm);
+        (popup_mod->set_time).tm_min = (int)elm_spinner_value_get(obj);
      }
-   else if (time_hours == 11 && (popup_mod->hour_decr || (popup_mod->time_hours == 12)))
+
+   popup_mod->mod_data.fields_min_max_get(popup_mod->mod_data.base,
+                       &(popup_mod->set_time), &min_values, &max_values);
+
+   hour_min = min_values.tm_hour;
+   hour_max = max_values.tm_hour;
+   if (!popup_mod->time_24hr)
      {
-        ampm = (int)elm_spinner_value_get(popup_mod->popup_field[ELM_DATETIME_AMPM]);
-        ampm = !ampm;
-        elm_spinner_value_set(popup_mod->popup_field[ELM_DATETIME_AMPM], ampm);
+        hour_min = 1;
+        hour_max = 12;
      }
-   popup_mod->time_hours = time_hours;
+   elm_spinner_min_max_set(popup_mod->popup_field[ELM_DATETIME_HOUR], hour_min, hour_max);
+   elm_spinner_min_max_set(popup_mod->popup_field[ELM_DATETIME_MINUTE], min_values.tm_min, max_values.tm_min);
+
+   (popup_mod->set_time).tm_min = (int)elm_spinner_value_get(popup_mod->popup_field[ELM_DATETIME_MINUTE]);
+
+   _set_timepicker_popup_title_text(popup_mod);
+}
+
+static void
+_ampm_clicked_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+{
+   Popup_Module_Data *popup_mod;
+   int hour;
+
+   popup_mod = (Popup_Module_Data *)data;
+   if (!popup_mod) return;
+
+   hour = (int)elm_spinner_value_get(popup_mod->popup_field[ELM_DATETIME_HOUR]);
+   if (hour > 12) hour -= 12;
+   elm_spinner_value_set(popup_mod->popup_field[ELM_DATETIME_HOUR], hour);
+
+   _set_timepicker_popup_title_text(popup_mod);
 }
 
 static void
@@ -676,8 +745,9 @@ _show_datepicker_layout(Popup_Module_Data *popup_mod)
          if (content) evas_object_hide(content);
          elm_object_content_set(popup_mod->popup, popup_mod->datepicker_layout);
          evas_object_show(popup_mod->datepicker_layout);
-         elm_object_part_text_set(popup_mod->popup, "title,text", "Set date");
      }
+   elm_datetime_value_get(popup_mod->mod_data.base, &(popup_mod->set_time));
+   _set_datepicker_popup_title_text(popup_mod);
 
    elm_datetime_value_get(popup_mod->mod_data.base, &curr_time);
    year = curr_time.tm_year + STRUCT_TM_YEAR_BASE_VALUE;
@@ -718,8 +788,9 @@ _show_timepicker_layout(Popup_Module_Data *popup_mod)
          if (content) evas_object_hide(content);
          elm_object_content_set(popup_mod->popup, popup_mod->timepicker_layout);
          evas_object_show(popup_mod->timepicker_layout);
-         elm_object_part_text_set(popup_mod->popup, "title,text", "Set time");
      }
+   elm_datetime_value_get(popup_mod->mod_data.base, &(popup_mod->set_time));
+   _set_timepicker_popup_title_text(popup_mod);
 
    elm_datetime_value_get(popup_mod->mod_data.base, &curr_time);
    if (!popup_mod->time_24hr)
@@ -733,7 +804,6 @@ _show_timepicker_layout(Popup_Module_Data *popup_mod)
     elm_spinner_value_set(popup_mod->popup_field[ELM_DATETIME_HOUR], curr_time.tm_hour);
     elm_spinner_value_set(popup_mod->popup_field[ELM_DATETIME_MINUTE], curr_time.tm_min);
     elm_spinner_value_set(popup_mod->popup_field[ELM_DATETIME_AMPM], is_pm);
-    popup_mod->time_hours = curr_time.tm_hour;
 
     for (idx = ELM_DATETIME_HOUR; idx < ELM_DATETIME_AMPM; idx++)
       {
@@ -873,8 +943,7 @@ _create_datepicker_layout(Popup_Module_Data *popup_mod)
        elm_spinner_label_format_set(spinner, "%02.0f");
        snprintf(buf, sizeof(buf), "field%d", idx);
        elm_object_part_content_set(popup_mod->datepicker_layout, buf, spinner);
-       if (idx < ELM_DATETIME_DATE)
-         evas_object_smart_callback_add(spinner, "changed", _adjust_max_days, popup_mod);
+       evas_object_smart_callback_add(spinner, "changed", _datepicker_value_changed_cb, popup_mod);
        popup_mod->popup_field[idx] = spinner;
      }
 
@@ -920,6 +989,10 @@ _create_timepicker_layout(Popup_Module_Data *popup_mod)
        elm_spinner_label_format_set(spinner, "%02.0f");
        snprintf(buf, sizeof(buf), "field%d", (idx - ELM_DATETIME_HOUR));
        elm_object_part_content_set(popup_mod->timepicker_layout, buf, spinner);
+       if (idx != ELM_DATETIME_AMPM)
+         evas_object_smart_callback_add(spinner, "changed", _timepicker_value_changed_cb, popup_mod);
+       else
+         evas_object_smart_callback_add(spinner, "changed", _ampm_clicked_cb, popup_mod);
        popup_mod->popup_field[idx] = spinner;
     }
 
@@ -929,16 +1002,6 @@ _create_timepicker_layout(Popup_Module_Data *popup_mod)
      elm_spinner_min_max_set(popup_mod->popup_field[ELM_DATETIME_HOUR], 1, 12);
    elm_spinner_min_max_set(popup_mod->popup_field[ELM_DATETIME_MINUTE], 0, 59);
    elm_spinner_min_max_set(popup_mod->popup_field[ELM_DATETIME_AMPM], 0, 1);
-   evas_object_smart_callback_add(popup_mod->popup_field[ELM_DATETIME_HOUR],
-                                  "changed", _adjust_ampm, popup_mod);
-   elm_object_signal_callback_add(popup_mod->popup_field[ELM_DATETIME_HOUR],
-       "elm,action,increment,start", "",_hour_increment_start_cb, popup_mod);
-   elm_object_signal_callback_add(popup_mod->popup_field[ELM_DATETIME_HOUR],
-       "elm,action,increment,stop", "",_hour_increment_stop_cb, popup_mod);
-   elm_object_signal_callback_add(popup_mod->popup_field[ELM_DATETIME_HOUR],
-       "elm,action,decrement,start", "",_hour_decrement_start_cb, popup_mod);
-   elm_object_signal_callback_add(popup_mod->popup_field[ELM_DATETIME_HOUR],
-       "elm,action,decrement,stop", "",_hour_decrement_stop_cb, popup_mod);
 
    _set_ampm_special_values(popup_mod);
    _set_timepicker_entry_filter(popup_mod);
@@ -1139,8 +1202,6 @@ obj_hook(Evas_Object *obj __UNUSED__)
    popup_mod->popup = NULL;
    popup_mod->datepicker_layout = NULL;
    popup_mod->timepicker_layout = NULL;
-   popup_mod->hour_incr = EINA_FALSE;
-   popup_mod->hour_decr = EINA_FALSE;
 
    return ((Elm_Datetime_Module_Data*)popup_mod);
 }