[C# datetime]: supports Efl.Ui.DatePicker compatibility 03/203703/4
authorTaehyub Kim <taehyub.kim@samsung.com>
Tue, 12 Feb 2019 04:31:34 +0000 (13:31 +0900)
committerTaehyub Kim <taehyub.kim@samsung.com>
Thu, 18 Apr 2019 02:15:49 +0000 (11:15 +0900)
Change-Id: I9502f376e136fea38a84e130be2c1f4b38546a49

src/wearable/circle/efl_extension_circle_object_datetime.c

index 5ab4e5f2cf3232820aeff1af81c769bdf5f3f446..8cac91e074a1ef3c72d177934ea2c71de5cd0bef 100755 (executable)
@@ -58,6 +58,8 @@ static char *bg_file_name[] = {
    NULL
 };
 
+static int datepicker_type = 0;
+
 static const int picker_mark_angle_year[] =
 {0,7,14,21,28,36,43,50,57,64,72,79,86,93,100,108,115,122,129,136,144,151,158,165,172,180,187,194,201,208,216,223,230,237,244,252,259,266,273,280,288,295,302,309,316,324,331,338,345,352};
 
@@ -186,6 +188,7 @@ _eext_circle_object_datetime_current_type_update(Eext_Circle_Object *obj, Eina_B
 
    elm_datetime_value_get(datetime, &t);
 
+   //C# FIXME: should consider current picker type
    radio = _eext_circle_object_datetime_selected_field_object_get(datetime);
    if (radio)
      {
@@ -284,6 +287,9 @@ _eext_circle_object_datetime_radio_changed_cb(void *data, Evas_Object *obj, void
 {
    Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
 
+   //C# FIXME: When datepicker and timepicker is changed, current type should be updated
+   //          please define datepicker_type and timepicker_type static value and update
+   //          when picker focus is changed
    if (circle_obj->widget_object == event_info)
      _eext_circle_object_datetime_current_type_update(circle_obj, EINA_FALSE);
    else
@@ -318,19 +324,41 @@ _date_update(Eext_Circle_Object *obj, Eina_Bool value_up)
    int max_day;
    double picker_angle = 0.0;
 
-   elm_datetime_value_get(datetime, &t);
-   elm_datetime_field_limit_get(datetime, data->current_type, &min, &max);
+   int year, month, day;
+   year = month = day = 0;
 
+   if (!strcmp(efl_class_name_get(datetime), "Datepicker"))
+     {
+        efl_ui_datepicker_date_get(datetime, &year, &month, &day);
+     }
+   else
+     {
+        elm_datetime_value_get(datetime, &t);
+        elm_datetime_field_limit_get(datetime, data->current_type, &min, &max);
+     }
+
+   //C# FIXME: Implements other types
+   //          Here, Only year type is implemented
    switch (data->current_type)
      {
         case ELM_DATETIME_YEAR:
-           if (value_up) t.tm_year += 1;
-           else t.tm_year -= 1;
+           if (!strcmp(efl_class_name_get(datetime), "Datepicker"))
+             {
+                if (value_up) year += 1;
+                else year -= 1;
+                picker_angle = (double)(picker_mark_angle_year[(int)(year) % PICKER_MARK_PARTITION_COUNT_YEAR]);
+             }
+           else
+             {
+                if (value_up) t.tm_year += 1;
+                else t.tm_year -= 1;
 
-           if (t.tm_year < min) t.tm_year = max;
-           else if (t.tm_year > max) t.tm_year = min;
+                if (t.tm_year < min) t.tm_year = max;
+                else if (t.tm_year > max) t.tm_year = min;
+
+                picker_angle = (double)(picker_mark_angle_year[(int)((t.tm_year + 1900) % PICKER_MARK_PARTITION_COUNT_YEAR)]);
+           }
 
-           picker_angle = (double)(picker_mark_angle_year[(int)((t.tm_year + 1900) % PICKER_MARK_PARTITION_COUNT_YEAR)]);
            _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, EINA_TRUE);
            break;
         case ELM_DATETIME_MONTH:
@@ -404,7 +432,14 @@ _date_update(Eext_Circle_Object *obj, Eina_Bool value_up)
            break;
      }
 
-   elm_datetime_value_set(datetime, &t);
+   if (!strcmp(efl_class_name_get(datetime), "Datepicker"))
+     {
+        efl_ui_datepicker_date_set(datetime, year, month, day);
+     }
+   else
+     {
+        elm_datetime_value_set(datetime, &t);
+     }
 }
 
 static Eina_Bool
@@ -447,6 +482,7 @@ _rotary_changed_cb(void *data, Evas_Object *obj, Eext_Rotary_Event_Info* info)
    selected_radio = _eext_circle_object_datetime_selected_field_object_get(circle_obj->widget_object);
    elm_object_signal_emit(selected_radio, "elm,state,rotary,active", "eext");
 
+   //C# FIXME: Implements other types
    if (info->direction == EEXT_ROTARY_DIRECTION_CLOCKWISE)
      _date_update(circle_obj, EINA_TRUE);
    else
@@ -733,6 +769,39 @@ _accessibility_datetime_radio_highlighted_cb(void *data, Evas_Object *obj, void
 }
 //
 
+static void
+date_field_focus_cb(void *data, const Efl_Event *event)
+{
+   int value = (int)data;
+   ERR("current focused type:%d", value);
+   datepicker_type = value;
+}
+
+static void
+date_field_legacy_focus_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+   int value = (int)data;
+   ERR("legacy: current focused type:%d", value);
+   datepicker_type = value;
+}
+
+static void add_date_type(Evas_Object *obj)
+{
+      double max;
+      efl_ui_range_min_max_get(obj, NULL, &max);
+      efl_ui_widget_focus_allow_set(obj, EINA_TRUE);
+      int value = -1;
+
+      //C# FIXME: consider picker type
+      if (max >= 2000) value = 2;
+      else if(max >= 30.0) value = 1;
+      else value = 0;
+
+      evas_object_smart_callback_add(obj, "focused", date_field_legacy_focus_cb, value);
+      efl_event_callback_add(obj, EFL_UI_FOCUS_OBJECT_EVENT_FOCUS_CHANGED, date_field_focus_cb, value);
+}
+
+
 static void
 _eext_circle_object_datetime_init(Eext_Circle_Object *obj, Evas_Object *datetime)
 {
@@ -761,12 +830,24 @@ _eext_circle_object_datetime_init(Eext_Circle_Object *obj, Evas_Object *datetime
 
    elm_object_style_set(datetime, "datepicker/circle");
 
-   evas_object_smart_callback_add(elm_object_part_content_get(datetime, "field0"), "changed",
-                                  _eext_circle_object_datetime_radio_changed_cb, obj);
-   evas_object_smart_callback_add(elm_object_part_content_get(datetime, "field1"), "changed",
-                                  _eext_circle_object_datetime_radio_changed_cb, obj);
-   evas_object_smart_callback_add(elm_object_part_content_get(datetime, "field2"), "changed",
-                                  _eext_circle_object_datetime_radio_changed_cb, obj);
+   if (!strcmp(efl_class_name_get(datetime), "Datepicker"))
+     {
+        Evas_Object *date_field0 = efl_content_get(efl_part(datetime, "efl.field0"));
+        add_date_type(date_field0);
+        Evas_Object *date_field1 = efl_content_get(efl_part(datetime, "efl.field1"));
+        add_date_type(date_field1);
+        Evas_Object *date_field2 = efl_content_get(efl_part(datetime, "efl.field2"));
+        add_date_type(date_field2);
+     }
+   else
+     {
+        evas_object_smart_callback_add(elm_object_part_content_get(datetime, "field0"), "changed",
+                                       _eext_circle_object_datetime_radio_changed_cb, obj);
+        evas_object_smart_callback_add(elm_object_part_content_get(datetime, "field1"), "changed",
+                                       _eext_circle_object_datetime_radio_changed_cb, obj);
+        evas_object_smart_callback_add(elm_object_part_content_get(datetime, "field2"), "changed",
+                                       _eext_circle_object_datetime_radio_changed_cb, obj);
+      }
 
    for (idx = ELM_DATETIME_HOUR; idx <= ELM_DATETIME_AMPM; idx++)
      {