}
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;
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.
{
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
}
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;
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);
}
}
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
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)
{
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);
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++)
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 *