From: Taehyub Kim Date: Thu, 13 Jun 2019 05:49:04 +0000 (+0900) Subject: circle_datetime: C# supports Efl.Ui.DatePicker and TimePicker X-Git-Tag: submit/tizen/20190619.051039^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=2a32c7dd36b63db7825ea023c57d2fef9ce2052f;p=platform%2Fcore%2Fuifw%2Fefl-ext.git circle_datetime: C# supports Efl.Ui.DatePicker and TimePicker Change-Id: I991cd2488c18bd8c8a10f52cb8483ccb9f106469 --- diff --git a/inc/wearable/circle/efl_extension_circle_private.h b/inc/wearable/circle/efl_extension_circle_private.h index 1d63a02..7a043ac 100644 --- a/inc/wearable/circle/efl_extension_circle_private.h +++ b/inc/wearable/circle/efl_extension_circle_private.h @@ -160,6 +160,8 @@ struct _Eext_Circle_Object_Item { typedef struct _Eext_Circle_Object_Datetime_Data Eext_Circle_Object_Datetime_Data; struct _Eext_Circle_Object_Datetime_Data { Elm_Datetime_Field_Type current_type; + double min; + double max; double rotary_angle; double type_current_angle; Ecore_Timer *rotary_timer; diff --git a/src/wearable/circle/efl_extension_circle_object_datetime.c b/src/wearable/circle/efl_extension_circle_object_datetime.c index 6089b56..cf57906 100755 --- a/src/wearable/circle/efl_extension_circle_object_datetime.c +++ b/src/wearable/circle/efl_extension_circle_object_datetime.c @@ -176,7 +176,7 @@ _eext_circle_object_datetime_bg_image_set(Eext_Circle_Object *obj, int index) } static void -_eext_circle_object_datetime_current_type_update(Eext_Circle_Object *obj, Eina_Bool anim) +_current_type_update_for_datetime(Eext_Circle_Object *obj, Eina_Bool anim) { Eext_Circle_Object_Datetime_Data *data = (Eext_Circle_Object_Datetime_Data *)obj->widget_data; Evas_Object *datetime = obj->widget_object; @@ -188,49 +188,126 @@ _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) { data->current_type = elm_radio_state_value_get(radio); data->rotary_angle = eext_circle_object_angle_get(datetime); - switch (data->current_type) { - case ELM_DATETIME_YEAR: - bg_image_index = 5; - 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, anim); - break; - case ELM_DATETIME_MONTH: - bg_image_index = 4; - picker_angle = (double)((t.tm_mon) * PICKER_MARK_ANGLE_MONTH); - _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, anim); - break; - case ELM_DATETIME_DATE: - max_day = _max_days_get(t.tm_year, t.tm_mon); - bg_image_index = max_day % 28; - picker_angle = (double)(picker_mark_angle_day[max_day - MIN_DAYS_IN_MONTH][(t.tm_mday > max_day ? max_day:t.tm_mday) - 1]); - _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, anim); - break; - case ELM_DATETIME_HOUR: - picker_angle = (double)((t.tm_hour) * PICKER_MARK_ANGLE_HOUR); - _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, anim); - bg_image_index = 6; - break; - case ELM_DATETIME_MINUTE: - picker_angle = (double)(t.tm_min * PICKER_MARK_ANGLE_MIN); - _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, anim); - bg_image_index = 6; - break; - default: - break; - } - + case ELM_DATETIME_YEAR: + bg_image_index = 5; + 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, anim); + break; + case ELM_DATETIME_MONTH: + bg_image_index = 4; + picker_angle = (double)((t.tm_mon) * PICKER_MARK_ANGLE_MONTH); + _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, anim); + break; + case ELM_DATETIME_DATE: + max_day = _max_days_get(t.tm_year, t.tm_mon); + bg_image_index = max_day % 28; + picker_angle = (double)(picker_mark_angle_day[max_day - MIN_DAYS_IN_MONTH][(t.tm_mday > max_day ? max_day:t.tm_mday) - 1]); + _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, anim); + break; + case ELM_DATETIME_HOUR: + picker_angle = (double)((t.tm_hour) * PICKER_MARK_ANGLE_HOUR); + _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, anim); + bg_image_index = 6; + break; + case ELM_DATETIME_MINUTE: + picker_angle = (double)(t.tm_min * PICKER_MARK_ANGLE_MIN); + _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, anim); + bg_image_index = 6; + break; + default: + break; + } _eext_circle_object_datetime_bg_image_set(obj, bg_image_index); } } +static void +_current_type_update_for_datepicker(Eext_Circle_Object *obj, Eina_Bool anim) +{ + Eext_Circle_Object_Datetime_Data *data = (Eext_Circle_Object_Datetime_Data *)obj->widget_data; + Evas_Object *datetime = obj->widget_object; + + int max_day; + int bg_image_index = BG_FILE_COUNT - 1; + double picker_angle = 0.0; + int year, month, day; + efl_ui_datepicker_date_get(datetime, &year, &month, &day); + + switch (data->current_type) + { + case ELM_DATETIME_YEAR: + bg_image_index = 5; + picker_angle = (double)(picker_mark_angle_year[(int)(year) % PICKER_MARK_PARTITION_COUNT_YEAR]); + _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, anim); + break; + case ELM_DATETIME_MONTH: + bg_image_index = 4; + picker_angle = (double)((month) * PICKER_MARK_ANGLE_MONTH); + _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, anim); + break; + case ELM_DATETIME_DATE: + max_day = _max_days_get(year - 1900, month); + bg_image_index = max_day % 28; + picker_angle = (double)(picker_mark_angle_day[max_day - MIN_DAYS_IN_MONTH][(day > max_day ? max_day:day) - 1]); + _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, anim); + break; + default: + break; + } + + _eext_circle_object_datetime_bg_image_set(obj, bg_image_index); +} + +static void +_current_type_update_for_timepicker(Eext_Circle_Object *obj, Eina_Bool anim) +{ + Eext_Circle_Object_Datetime_Data *data = (Eext_Circle_Object_Datetime_Data *)obj->widget_data; + Evas_Object *datetime = obj->widget_object; + + int bg_image_index = BG_FILE_COUNT - 1; + double picker_angle = 0.0; + int hour, minute; + efl_ui_timepicker_time_get(datetime, &hour, &minute); + + switch (data->current_type) + { + case ELM_DATETIME_HOUR: + picker_angle = (double)((hour) * PICKER_MARK_ANGLE_HOUR); + _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, anim); + bg_image_index = 6; + break; + case ELM_DATETIME_MINUTE: + picker_angle = (double)(minute * PICKER_MARK_ANGLE_MIN); + _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, anim); + bg_image_index = 6; + break; + default: + break; + } + _eext_circle_object_datetime_bg_image_set(obj, bg_image_index); +} + +static void +_eext_circle_object_datetime_current_type_update(Eext_Circle_Object *obj, Eina_Bool anim) +{ + if (efl_isa(obj->widget_object, EFL_UI_LEGACY_INTERFACE)) + _current_type_update_for_datetime(obj, anim); + else + { + if (!strcmp(efl_class_name_get(obj->widget_object), "Efl.Ui.Wearable.CircleDatePicker")) + _current_type_update_for_datepicker(obj, anim); + else + _current_type_update_for_timepicker(obj, anim); + } +} + /** * FIXME(171030): This sets eext_circle_object data values with a handle "datetime", * but this is not working because "datetime" is elm_datetime, not circle object. @@ -287,9 +364,6 @@ _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 @@ -315,108 +389,81 @@ _eext_circle_object_datetime_changed_cb(void *data, Evas_Object *obj, void *even } static void -_date_update(Eext_Circle_Object *obj, Eina_Bool value_up) +_date_update_for_datetime(Eext_Circle_Object *obj, Eina_Bool value_up) { Eext_Circle_Object_Datetime_Data *data = (Eext_Circle_Object_Datetime_Data *)obj->widget_data; Evas_Object *datetime = obj->widget_object; struct tm t; - int min, max; int max_day; - double picker_angle = 0.0; - - int year, month, day; - year = month = day = 0; + int min, max; - if (efl_isa(datetime, EFL_UI_LEGACY_INTERFACE)) - { - elm_datetime_value_get(datetime, &t); - elm_datetime_field_limit_get(datetime, data->current_type, &min, &max); - } - else - { - efl_ui_datepicker_date_get(datetime, &year, &month, &day); - } + elm_datetime_value_get(datetime, &t); + elm_datetime_field_limit_get(datetime, data->current_type, &min, &max); + double picker_angle = 0.0; - //C# FIXME: Implements other types - // Here, Only year type is implemented switch (data->current_type) { case ELM_DATETIME_YEAR: - if (efl_isa(datetime, EFL_UI_LEGACY_INTERFACE)) - { - 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; - - picker_angle = (double)(picker_mark_angle_year[(int)((t.tm_year + 1900) % PICKER_MARK_PARTITION_COUNT_YEAR)]); - } - else - { - if (value_up) year += 1; - else year -= 1; - picker_angle = (double)(picker_mark_angle_year[(int)(year) % PICKER_MARK_PARTITION_COUNT_YEAR]); - } + 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; + 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: if (value_up) t.tm_mon += 1; else t.tm_mon -= 1; - if (t.tm_mon < min) t.tm_mon = max; else if (t.tm_mon > max) t.tm_mon = min; picker_angle = (double)((t.tm_mon) * PICKER_MARK_ANGLE_MONTH); _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, EINA_TRUE); break; + case ELM_DATETIME_DATE: if (value_up) t.tm_mday += 1; else t.tm_mday -= 1; - int old_mday = t.tm_mday; - if (t.tm_mday < min) t.tm_mday = max; else if (t.tm_mday > max) t.tm_mday = min; else - { - elm_datetime_value_set(datetime, &t); - elm_datetime_value_get(datetime, &t); - if (t.tm_mday < old_mday) - { - if (value_up) t.tm_mday = min; - else - { - t.tm_mday = max; - elm_datetime_value_set(datetime, &t); - elm_datetime_value_get(datetime, &t); - } - } - } - + { + elm_datetime_value_set(datetime, &t); + elm_datetime_value_get(datetime, &t); + if (t.tm_mday < old_mday) + { + if (value_up) t.tm_mday = min; + else + { + t.tm_mday = max; + elm_datetime_value_set(datetime, &t); + elm_datetime_value_get(datetime, &t); + } + } + } max_day = _max_days_get(t.tm_year, t.tm_mon); - picker_angle = (double)(picker_mark_angle_day[max_day - MIN_DAYS_IN_MONTH][(t.tm_mday > max_day ? max_day:t.tm_mday) - 1]); _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, EINA_TRUE); break; + case ELM_DATETIME_HOUR: if (value_up) t.tm_hour += 1; else t.tm_hour -= 1; - if (t.tm_hour < min) t.tm_hour = max; else if (t.tm_hour > max) t.tm_hour = min; - elm_datetime_value_set(datetime, &t); elm_datetime_value_get(datetime, &t); picker_angle = (double)((t.tm_hour) * PICKER_MARK_ANGLE_HOUR); _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, EINA_TRUE); break; + case ELM_DATETIME_MINUTE: if (value_up) t.tm_min += 1; else t.tm_min -= 1; - if (t.tm_min < min) t.tm_min = max; else if (t.tm_min > max) t.tm_min = min; @@ -425,20 +472,126 @@ _date_update(Eext_Circle_Object *obj, Eina_Bool value_up) picker_angle = (double)(t.tm_min * PICKER_MARK_ANGLE_MIN); _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, EINA_TRUE); break; + case ELM_DATETIME_AMPM: if (value_up && t.tm_hour < 12) t.tm_hour += 12; else if (t.tm_hour >= 12) t.tm_hour -= 12; + + default: + break; + } + + elm_datetime_value_set(datetime, &t); +} + +static void +_date_update_for_datepicker(Eext_Circle_Object *obj, Eina_Bool value_up) +{ + Eext_Circle_Object_Datetime_Data *data = (Eext_Circle_Object_Datetime_Data *)obj->widget_data; + Evas_Object *datetime = obj->widget_object; + + int max_day; + int min, max; + + min = (int)data->min; + max = (int)data->max; + double picker_angle = 0.0; + + int year, month, day; + efl_ui_datepicker_date_get(datetime, &year, &month, &day); + + switch (data->current_type) + { + case ELM_DATETIME_YEAR: + if (value_up) year += 1; + else year -= 1; + if (year < min) year = max; + else if (year > max) year = min; + picker_angle = (double)(picker_mark_angle_year[(int)(year) % PICKER_MARK_PARTITION_COUNT_YEAR]); + _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, EINA_TRUE); + break; + + case ELM_DATETIME_MONTH: + if (value_up) month += 1; + else month -= 1; + if (month < min) month = max; + else if (month > max) month = min; + picker_angle = (double)((month) * PICKER_MARK_ANGLE_MONTH); + _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, EINA_TRUE); + break; + + case ELM_DATETIME_DATE: + if (value_up) day += 1; + else day -= 1; + if (day < min) day = max; + else if(day > max) day = min; + max_day = _max_days_get(year - 1900, month); + picker_angle = (double)(picker_mark_angle_day[max_day - MIN_DAYS_IN_MONTH][(day > max_day ? max_day:day) - 1]); + _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, EINA_TRUE); + break; default: break; } - if (efl_isa(datetime, EFL_UI_LEGACY_INTERFACE)) + efl_ui_datepicker_date_set(datetime, year, month, day); +} + + +static void +_date_update_for_timepicker(Eext_Circle_Object *obj, Eina_Bool value_up) +{ + Eext_Circle_Object_Datetime_Data *data = (Eext_Circle_Object_Datetime_Data *)obj->widget_data; + Evas_Object *datetime = obj->widget_object; + + int max_day; + int min, max; + + min = (int)data->min; + max = (int)data->max; + double picker_angle = 0.0; + + int hour, minute; + efl_ui_timepicker_time_get(datetime, &hour, &minute); + + switch (data->current_type) { - elm_datetime_value_set(datetime, &t); + case ELM_DATETIME_HOUR: + if (value_up) hour += 1; + else hour -= 1; + if (hour < 0 ) hour = max + 11; + else if (hour > (max + 11)) hour = 0; + picker_angle = (double)((hour) * PICKER_MARK_ANGLE_HOUR); + _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, EINA_TRUE); + break; + + case ELM_DATETIME_MINUTE: + if (value_up) minute += 1; + else minute -= 1; + if (minute < min) minute = max; + else if (minute > max) minute = min; + picker_angle = (double)(minute * PICKER_MARK_ANGLE_MIN); + _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, EINA_TRUE); + break; + + default: + break; } + + efl_ui_timepicker_time_set(datetime, hour, minute); +} + + +static void +_date_update(Eext_Circle_Object *obj, Eina_Bool value_up) +{ + if (efl_isa(obj->widget_object, EFL_UI_LEGACY_INTERFACE)) + _date_update_for_datetime(obj, value_up); else { - efl_ui_datepicker_date_set(datetime, year, month, day); + if (!strcmp(efl_class_name_get(obj->widget_object), "Efl.Ui.Wearable.CircleDatePicker")) + _date_update_for_datepicker(obj, value_up); + else + _date_update_for_timepicker(obj, value_up); } } @@ -482,7 +635,6 @@ _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 @@ -772,36 +924,30 @@ _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; -} + int type = evas_object_data_get(event->object, "field_type"); + Eo* spinner = evas_object_data_get(event->object, "field_obj"); -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; + Eext_Circle_Object *circle_obj = data; + EEXT_CIRCLE_OBJECT_DATETIME_DATA_GET(circle_obj, circle_data) return; + circle_data->current_type = type; + efl_ui_range_min_max_get(spinner, &circle_data->min, &circle_data->max); + + _eext_circle_object_datetime_current_type_update(circle_obj, EINA_TRUE); } -static void add_date_type(Evas_Object *obj) +static void add_date_type(Evas_Object *obj, int index, Eext_Circle_Object *circle_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); + //C# FIXME: The text button is used to get focus in Efl.Ui.SpinButton + // since the spin button cannot get the focus, + // Therefore, the text button should be changed to the spin button + // when the spin button's focus is supported. + efl_ui_spin_button_editable_set(obj, EINA_FALSE); + Evas_Object *text_btn = elm_layout_content_get(obj, "efl.text_button"); + evas_object_data_set(text_btn, "field_type", index); + evas_object_data_set(text_btn, "field_obj", obj); + efl_event_callback_add(text_btn, EFL_UI_FOCUS_OBJECT_EVENT_FOCUS_CHANGED, date_field_focus_cb, circle_obj); } - static void _eext_circle_object_datetime_init(Eext_Circle_Object *obj, Evas_Object *datetime) { @@ -821,6 +967,7 @@ _eext_circle_object_datetime_init(Eext_Circle_Object *obj, Evas_Object *datetime obj->widget_data = (void *)data; item = _eext_circle_object_item_new(); + _eext_circle_object_item_name_set(item, DATETIME_ITEM_NAME); _eext_circle_object_item_color_set(item, 250, 125, 47, 255); _eext_circle_object_item_radius_set(item, radius); _eext_circle_object_item_line_width_set(item, mark_height); @@ -830,23 +977,39 @@ _eext_circle_object_datetime_init(Eext_Circle_Object *obj, Evas_Object *datetime if (efl_isa(datetime, EFL_UI_LEGACY_INTERFACE)) { - elm_object_style_set(datetime, "datepicker/circle"); + 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); + _eext_circle_object_datetime_bg_image_set(obj, BG_FILE_COUNT - 1); } else { - 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); + if (!strcmp(efl_class_name_get(datetime), "Efl.Ui.Wearable.CircleDatePicker")) + { + data->current_type = ELM_DATETIME_YEAR; + Evas_Object *date_field0 = efl_content_get(efl_part(datetime, "efl.field0")); + add_date_type(date_field0, ELM_DATETIME_MONTH, obj); + + Evas_Object *date_field1 = efl_content_get(efl_part(datetime, "efl.field1")); + add_date_type(date_field1, ELM_DATETIME_DATE, obj); + + Evas_Object *date_field2 = efl_content_get(efl_part(datetime, "efl.field2")); + add_date_type(date_field2, ELM_DATETIME_YEAR, obj); + } + else + { + data->current_type = ELM_DATETIME_HOUR; + Evas_Object *date_field0 = efl_content_get(efl_part(datetime, "efl.field1")); + add_date_type(date_field0, ELM_DATETIME_HOUR, obj); + + Evas_Object *date_field1 = efl_content_get(efl_part(datetime, "efl.field2")); + add_date_type(date_field1, ELM_DATETIME_MINUTE, obj); + } } for (idx = ELM_DATETIME_HOUR; idx <= ELM_DATETIME_AMPM; idx++) @@ -892,7 +1055,6 @@ _eext_circle_object_datetime_init(Eext_Circle_Object *obj, Evas_Object *datetime eext_rotary_object_event_callback_add(obj->widget_object, _rotary_changed_cb, obj); eext_rotary_object_event_callback_add(obj->main_obj, _rotary_changed_cb, obj); - _eext_circle_object_datetime_bg_image_set(obj, BG_FILE_COUNT - 1); } EAPI Evas_Object *