#include "wearable/circle/efl_extension_circle_private.h"
#define EEXT_CIRCLE_OBJECT_DATETIME_TYPE "Eext_Circle_Object_Datetime"
-#define MIN_DAYS_IN_MONTH 28
-#define MAX_DAYS_IN_MONTH 31
-#define DATETIME_FIELD_NAME_BUF_MAX 8
-
-#define PICKER_MARK_PARTITION_COUNT_YEAR 50
-#define PICKER_MARK_ANGLE_MONTH 30
-#define PICKER_MARK_ANGLE_HOUR 30
-#define PICKER_MARK_ANGLE_MIN 6
#define EEXT_CIRCLE_OBJECT_DATETIME_DATA_GET(circle_obj, data) \
Eext_Circle_Object_Datetime_Data *data = NULL; \
data = (Eext_Circle_Object_Datetime_Data *)circle_obj->widget_data; \
if (!data)
-#define BG_FILE_COUNT 7
-
-#define DATETIME_ITEM_NAME "default"
-
-//static const double BG_HEIGHT = 360.0;
-//static const double mark_width = 6;
-static const double mark_height =23;
-static const double radius = 168.5; //BG_HEIGHT / 2 - mark_height / 2;
-static const double mark_radius = 2.000317; //1 / sqrt(1 - pow(mark_width / 2 / radius , 2)) * 2;
-static const double ANIMATION_DURATION = 0.3;
-static const double BLINK_DELAY = 0.3;
-
-static char *bg_file_name[] = {
- "date_picker_day_28_bg",
- "date_picker_day_29_bg",
- "date_picker_day_30_bg",
- "date_picker_day_31_bg",
- "date_picker_month_bg",
- "date_picker_year_bg",
- "time_picker_bg",
- 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};
-
-static const int picker_mark_angle_day[4][31] =
-//28 day
-{{0,13,26,39,52,65,78,90,103,116,129,142,155,168,180,193,206,219,232,245,258,270,283,296,309,322,335,348},
-//29 day
-{0,13,25,38,50,63,75,87,100,112,125,137,149,162,174,187,199,211,224,236,249,261,273,286,298,311,323,335,348},
-//30 day
-{0,12,24,36,48,60,72,84,96,108,120,132,144,156,168,180,192,204,216,228,240,252,264,276,288,300,312,324,336,348},
-//31 day
-{0,12,24,36,47,59,70,82,93,105,116,128,139,151,163,175,186,198,209,221,232,244,255,267,278,290,302,314,325,337,349}};
-
-// for accessibility
-static Eina_Bool _accessibility_datetime_ampm_gesutre_cb(void *data, Elm_Atspi_Gesture_Info gesture_info, Evas_Object *obj);
-static void _accessibility_datetime_radio_highlighted_cb(void *data, Evas_Object *obj, void *event_info);
-//
-
-static void
-_eext_circle_object_datetime_picker_mark_angle_set(Eext_Circle_Object *obj, double angle, Eina_Bool anim)
-{
- double angle_offset, real_part;
- Eext_Circle_Object_Item *item;
-
- item = _eext_circle_object_item_get(obj, DATETIME_ITEM_NAME);
- if (anim)
- {
- angle_offset = _eext_circle_object_item_angle_offset_get(item);
- real_part = angle_offset - (int)angle_offset;
-
- angle_offset = (int)angle_offset % 360 + real_part;
- if (angle_offset < 0.0) angle_offset += 360.0;
-
- if (angle - angle_offset > 180.0)
- angle_offset += 360.0;
- else if (angle_offset - angle > 180.0)
- angle_offset -= 360.0;
-
- _eext_circle_object_item_angle_offset_set(item, angle_offset - (mark_radius / 2));
-
- _eext_circle_object_item_angle_transit_set(item, ANIMATION_DURATION,
- mark_radius, angle - (mark_radius / 2),
- EINA_TRUE,
- 0.25, 0.46,
- 0.45, 1.0);
- }
- // for Accessibility
- else if (elm_atspi_bridge_utils_is_screen_reader_enabled() && angle == -1.0f) // Do not display circle object(indicator bar in datetime)
- {
- _eext_circle_object_item_angle_offset_set(item, 0);
- _eext_circle_object_item_angle_set(item, 0);
- }
- //
- else
- {
- _eext_circle_object_item_angle_offset_set(item, angle -(mark_radius / 2));
- _eext_circle_object_item_angle_set(item, mark_radius);
- }
-
- _eext_circle_object_changed(obj);
-}
-
-static int
-_max_days_get(int year, int month)
-{
- struct tm time1;
- time_t t;
- int day;
-
- t = time(NULL);
- localtime_r(&t, &time1);
- time1.tm_year = year;
- time1.tm_mon = month;
- for (day = MIN_DAYS_IN_MONTH; day <= MAX_DAYS_IN_MONTH; day++)
- {
- time1.tm_mday = day;
- /* FIXME: To restrict month wrapping because of summer time in some locales,
- * ignore day light saving mode in mktime(). */
- time1.tm_isdst = -1;
- mktime(&time1);
- if (time1.tm_mday == 1) break;
- }
-
- day--;
- return day;
-}
-
-static Evas_Object *
-_eext_circle_object_datetime_selected_field_object_get(Evas_Object *datetime)
-{
- Evas_Object *radio;
- Elm_Datetime_Field_Type type;
- char buf[DATETIME_FIELD_NAME_BUF_MAX];
-
- for (type = ELM_DATETIME_YEAR; type < ELM_DATETIME_AMPM; type++)
- {
- snprintf(buf, sizeof(buf), "field%d", type);
- radio = elm_object_part_content_get(datetime, buf);
- if (radio)
- return elm_radio_selected_object_get(radio);
- }
-
- return NULL;
-}
-
-static void
-_eext_circle_object_datetime_bg_image_set(Eext_Circle_Object *obj, int index)
-{
- char buf[PATH_MAX];
-
- snprintf(buf, sizeof(buf), "%s/%s.png", IMG_DIR, bg_file_name[index]);
-
- _eext_circle_object_bg_file_path_set(obj, buf);
-}
-
-static void
-_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;
- Evas_Object *radio;
- struct tm t;
- int max_day;
- int bg_image_index = BG_FILE_COUNT - 1;
- double picker_angle = 0.0;
-
- elm_datetime_value_get(datetime, &t);
-
- 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;
- }
- _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 (strstr(efl_class_name_get(obj->widget_object), "CircleDatepicker") != NULL)
- _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.
- * When fixing "datetime" to circle object, the angle will be doubled.
- *
-static void
-_eext_circle_object_datetime_circle_update(Eext_Circle_Object *obj)
-{
- 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;
-
- elm_datetime_value_get(datetime, &t);
- elm_datetime_field_limit_get(datetime, data->current_type, &min, &max);
-
- switch (data->current_type)
- {
- case ELM_DATETIME_YEAR:
- eext_circle_object_value_min_max_set(datetime, (double)min, (double)max);
- eext_circle_object_value_set(datetime, (double)t.tm_year);
- break;
- case ELM_DATETIME_MONTH:
- eext_circle_object_value_min_max_set(datetime, (double)min, (double)max);
- eext_circle_object_value_set(datetime, (double)t.tm_mon);
- break;
- case ELM_DATETIME_DATE:
- min = 1;
- max = _max_days_get(t.tm_year, t.tm_mon);
- eext_circle_object_value_min_max_set(datetime, (double)min, (double)max);
- eext_circle_object_value_set(datetime, (double)t.tm_mday);
- break;
- case ELM_DATETIME_HOUR:
- eext_circle_object_value_min_max_set(datetime, (double)min, (double)max);
- eext_circle_object_value_set(datetime, (double)t.tm_hour);
- break;
- case ELM_DATETIME_MINUTE:
- eext_circle_object_value_min_max_set(datetime, (double)min, (double)max);
- eext_circle_object_value_set(datetime, (double)t.tm_min);
- break;
- case ELM_DATETIME_AMPM:
- eext_circle_object_value_min_max_set(datetime, (double)min, (double)max);
- eext_circle_object_value_set(datetime, (double)t.tm_hour);
- default:
- break;
- }
-
- data->rotary_angle = eext_circle_object_angle_get(datetime);
-}
-*/
-
-static void
-_eext_circle_object_datetime_radio_changed_cb(void *data, Evas_Object *obj, void *event_info)
-{
- Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
-
- if (circle_obj->widget_object == event_info)
- _eext_circle_object_datetime_current_type_update(circle_obj, EINA_FALSE);
- else
- _eext_circle_object_datetime_current_type_update(circle_obj, EINA_TRUE);
-
-/**
- * FIXME(171030): Comment this function out because eext_circle_object_value_set is not applied to angle.
- _eext_circle_object_datetime_circle_update(circle_obj);
-*/
-}
-
-static void
-_eext_circle_object_datetime_changed_cb(void *data, Evas_Object *obj, void *event_info)
-{
- Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
- _eext_circle_object_datetime_current_type_update(circle_obj, EINA_TRUE);
-/**
- * FIXME(171030): Comment this function out because eext_circle_object_value_set is not applied to angle.
- Eext_Circle_Object_Datetime_Data *widget_data = (Eext_Circle_Object_Datetime_Data *)circle_obj->widget_data;
- if (!widget_data->circle_changed)
- _eext_circle_object_datetime_circle_update(circle_obj);
-*/
-}
-
-static void
-_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 max_day;
- int min, max;
-
- elm_datetime_value_get(datetime, &t);
- elm_datetime_field_limit_get(datetime, data->current_type, &min, &max);
- double picker_angle = 0.0;
-
- switch (data->current_type)
- {
- case ELM_DATETIME_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);
- }
- }
- }
- 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;
-
- elm_datetime_value_set(datetime, &t);
- elm_datetime_value_get(datetime, &t);
- 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;
- }
-
- 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)
- {
- 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);
-}
+#define DATETIME_FIELD_NAME_BUF_MAX 8
+static const char SIGNAL_ACTIVATED[] = "rotary,activated";
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
- {
- if (strstr(efl_class_name_get(obj->widget_object), "CircleDatepicker") != NULL)
- _date_update_for_datepicker(obj, value_up);
- else
- _date_update_for_timepicker(obj, value_up);
- }
-}
-
-static Eina_Bool
-_rotary_timer_cb(void *data)
-{
- Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
- Eext_Circle_Object_Datetime_Data *widget_data = (Eext_Circle_Object_Datetime_Data *)circle_obj->widget_data;
- Evas_Object *selected_radio;
-
- selected_radio = _eext_circle_object_datetime_selected_field_object_get(circle_obj->widget_object);
- elm_layout_signal_emit(selected_radio, "elm,state,rotary,inactive", "eext");
-
- widget_data->rotary_timer = NULL;
- return ECORE_CALLBACK_CANCEL;
-}
-
-static Eina_Bool
-_rotary_changed_cb(void *data, Evas_Object *obj, Eext_Rotary_Event_Info* info)
+_eext_circle_object_datetime_activated_cb(void *data,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
{
Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
- Evas_Object *selected_radio;
- Eext_Circle_Object_Datetime_Data *widget_data = (Eext_Circle_Object_Datetime_Data *)circle_obj->widget_data;
- //for accessibility
- if (elm_atspi_bridge_utils_is_screen_reader_enabled() && widget_data->current_type == ELM_DATETIME_AMPM)
- {
- return EINA_TRUE;
- }
- //
-
- if (circle_obj->is_propagated)
- {
- circle_obj->is_propagated = EINA_FALSE;
-
- return EINA_TRUE;
- }
- if (obj == circle_obj->main_obj)
- circle_obj->is_propagated = EINA_TRUE;
-
- //Send rotary active signal to selected radio to off animation(Tizen_2.3.2 UX)
- 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");
-
- if (info->direction == EEXT_ROTARY_DIRECTION_CLOCKWISE)
- _date_update(circle_obj, EINA_TRUE);
- else
- _date_update(circle_obj, EINA_FALSE);
-
- //for accessibility
- if (elm_atspi_bridge_utils_is_screen_reader_enabled())
- {
- Evas_Object *datetime = circle_obj->widget_object;
- struct tm t;
- char buf_read_text[255];
- char buf_month[255];
- char buf_ampm[3];
-
- elm_datetime_value_get(datetime, &t);
+ EEXT_CIRCLE_OBJECT_DATETIME_DATA_GET(circle_obj, widget_data) return;
- bindtextdomain (PACKAGE, LOCALE_DIR);
- elm_atspi_accessible_translation_domain_set(obj, PACKAGE);
-
- switch (widget_data->current_type)
- {
- case ELM_DATETIME_DATE:
- snprintf(buf_read_text, sizeof(buf_read_text), "%2.0f",(double)t.tm_mday);
- break;
- case ELM_DATETIME_MONTH:
- if (t.tm_mon == 0)
- snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_JANUARY"));
- else if (t.tm_mon == 1)
- snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_FEBRUARY"));
- else if (t.tm_mon == 2)
- snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_MARCH"));
- else if (t.tm_mon == 3)
- snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_APRIL"));
- else if (t.tm_mon == 4)
- snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_MAY"));
- else if (t.tm_mon == 5)
- snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_JUNE"));
- else if (t.tm_mon == 6)
- snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_JULY"));
- else if (t.tm_mon == 7)
- snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_AUGUST"));
- else if (t.tm_mon == 8)
- snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_SEPTEMBER"));
- else if (t.tm_mon == 9)
- snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_OCTOBER"));
- else if (t.tm_mon == 10)
- snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_NOVEMBER"));
- else if (t.tm_mon == 11)
- snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_DECEMBER"));
- snprintf(buf_read_text, sizeof(buf_read_text), "%s",buf_month);
- break;
- case ELM_DATETIME_YEAR:
- snprintf(buf_read_text, sizeof(buf_read_text), "%4.0f",(double)t.tm_year + (double)1900.0f);
- break;
- case ELM_DATETIME_HOUR:
- if ((info->direction == EEXT_ROTARY_DIRECTION_CLOCKWISE && t.tm_hour == 12) ||
- (info->direction == EEXT_ROTARY_DIRECTION_COUNTER_CLOCKWISE && t.tm_hour == 23))
- snprintf(buf_ampm, sizeof(buf_ampm), _("IDS_COM_BODY_PM"));
- else if ((info->direction == EEXT_ROTARY_DIRECTION_CLOCKWISE && t.tm_hour == 0) ||
- (info->direction == EEXT_ROTARY_DIRECTION_COUNTER_CLOCKWISE && t.tm_hour == 11))
- snprintf(buf_ampm, sizeof(buf_ampm), _("IDS_COM_BODY_AM"));
- else
- buf_ampm[0] = '\0';
-
- if (t.tm_hour > 12)
- snprintf(buf_read_text, sizeof(buf_read_text), "%2.0f %s",(double)t.tm_hour - 12.0f, buf_ampm);
- else if (t.tm_hour == 0)
- snprintf(buf_read_text, sizeof(buf_read_text), "%2.0f %s",(double)t.tm_hour + 12.0f, buf_ampm);
- else
- snprintf(buf_read_text, sizeof(buf_read_text), "%2.0f %s",(double)t.tm_hour, buf_ampm);
-
- break;
- case ELM_DATETIME_MINUTE:
- snprintf(buf_read_text, sizeof(buf_read_text), "%2.0f",(double)t.tm_min);
- break;
- default:
- break;
- }
- elm_atspi_bridge_utils_say(buf_read_text, EINA_TRUE, NULL, NULL);
- }
- //
-
- if (widget_data->rotary_timer)
- {
- ecore_timer_del(widget_data->rotary_timer);
- widget_data->rotary_timer = NULL;
- }
-
- widget_data->rotary_timer = ecore_timer_add(BLINK_DELAY, _rotary_timer_cb, circle_obj);
-
- return EINA_TRUE;
+ widget_data->activated = EINA_TRUE;
}
static void
{
if (!obj) return;
- //for accessibility
- char buf[DATETIME_FIELD_NAME_BUF_MAX];
- int idx = 0;
- for (idx = ELM_DATETIME_AMPM; idx >= ELM_DATETIME_YEAR; idx--)
- {
- snprintf(buf, sizeof(buf), "field%d", idx);
- Evas_Object *field_obj = elm_object_part_content_get(obj->widget_object, buf);
- if (field_obj)
- {
- Elm_Datetime_Field_Type field_type = (Elm_Datetime_Field_Type)evas_object_data_get(field_obj, "_field_type");
- if (field_type == ELM_DATETIME_AMPM)
- elm_atspi_accessible_gesture_cb_set(field_obj, NULL, NULL);
- evas_object_smart_callback_del(field_obj, "atspi,highlighted", _accessibility_datetime_radio_highlighted_cb);
- }
- }
- //
-
if (obj->widget_data)
{
- Eext_Circle_Object_Datetime_Data *widget_data = (Eext_Circle_Object_Datetime_Data *)obj->widget_data;
- if (widget_data->rotary_timer)
- {
- ecore_timer_del(widget_data->rotary_timer);
- widget_data->rotary_timer = NULL;
- }
-
free(obj->widget_data);
obj->widget_data = NULL;
}
-
- eext_rotary_object_event_callback_del(obj->widget_object, _rotary_changed_cb);
- eext_rotary_object_event_callback_del(obj->main_obj, _rotary_changed_cb);
+ evas_object_smart_callback_del(obj->widget_object, SIGNAL_ACTIVATED, _eext_circle_object_datetime_activated_cb);
+ evas_object_smart_callback_del(obj->main_obj, SIGNAL_ACTIVATED, _eext_circle_object_datetime_activated_cb);
}
static void
-_eext_circle_object_datetime_disabled_cb(Eext_Circle_Object *obj)
+_spinner_focused_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
{
- if (obj->disabled)
- {
- eext_rotary_object_event_callback_del(obj->widget_object, _rotary_changed_cb);
- eext_rotary_object_event_callback_del(obj->main_obj, _rotary_changed_cb);
- }
- else
- {
- eext_rotary_object_event_callback_add(obj->main_obj, _rotary_changed_cb, obj);
- eext_rotary_object_event_callback_add(obj->widget_object, _rotary_changed_cb, obj);
- }
-}
-
-static void
-_accessibility_item_make_trait(char *trait, char *unit, int trait_size)
-{
- const char *format = _("WDS_TTS_TBBODY_ROTATE_BEZEL_TO_ADJUST_PS");
- snprintf(trait, trait_size, format, unit);
-}
-
-//for accessibility
-static char *
-_accessibility_item_name_cb(void *data, Evas_Object *obj)
-{
- char buf[255] = "";
- char buf_month[255];
- char buf_unit[255];
- char buf_trait[255];
- Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
- Evas_Object *datetime = circle_obj->widget_object;
- struct tm t;
- int ret = 0;
-
- Elm_Datetime_Field_Type field_type = (Elm_Datetime_Field_Type)evas_object_data_get(obj, "_field_type");
-
- elm_datetime_value_get(datetime, &t);
-
- bindtextdomain (PACKAGE, LOCALE_DIR);
-
- switch (field_type)
- {
- case ELM_DATETIME_DATE:
- snprintf(buf_unit, sizeof(buf_unit), _("IDS_COM_BODY_DAY"));
- _accessibility_item_make_trait(buf_trait, buf_unit, sizeof(buf_trait));
- ret = snprintf(buf, sizeof(buf), "%2.0f %s %s",(double)t.tm_mday, buf_unit, buf_trait);
- break;
- case ELM_DATETIME_MONTH:
- if (t.tm_mon == 0)
- snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_JANUARY"));
- else if (t.tm_mon == 1)
- snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_FEBRUARY"));
- else if (t.tm_mon == 2)
- snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_MARCH"));
- else if (t.tm_mon == 3)
- snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_APRIL"));
- else if (t.tm_mon == 4)
- snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_MAY"));
- else if (t.tm_mon == 5)
- snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_JUNE"));
- else if (t.tm_mon == 6)
- snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_JULY"));
- else if (t.tm_mon == 7)
- snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_AUGUST"));
- else if (t.tm_mon == 8)
- snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_SEPTEMBER"));
- else if (t.tm_mon == 9)
- snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_OCTOBER"));
- else if (t.tm_mon == 10)
- snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_NOVEMBER"));
- else if (t.tm_mon == 11)
- snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_DECEMBER"));
- snprintf(buf_unit, sizeof(buf_unit), _("IDS_COM_BODY_MONTH"));
- _accessibility_item_make_trait(buf_trait, buf_unit, sizeof(buf_trait));
- ret = snprintf(buf, sizeof(buf), "%s %s %s",buf_month, buf_unit, buf_trait);
- break;
- case ELM_DATETIME_YEAR:
- snprintf(buf_unit, sizeof(buf_unit), _("IDS_COM_BODY_YEAR"));
- _accessibility_item_make_trait(buf_trait, buf_unit, sizeof(buf_trait));
- ret = snprintf(buf, sizeof(buf), "%4.0f %s %s",(double)t.tm_year + (double)1900.0f, buf_unit, buf_trait);
- break;
- case ELM_DATETIME_AMPM:
- snprintf(buf_trait, sizeof(buf_trait), _("WDS_TTS_TBBODY_DOUBLE_TAP_TO_CHANGE"));
- if ((double)t.tm_hour < 12.0f)
- snprintf(buf_unit, sizeof(buf_unit), _("IDS_COM_BODY_AM"));
- else
- snprintf(buf_unit, sizeof(buf_unit), _("IDS_COM_BODY_PM"));
- ret = snprintf(buf, sizeof(buf), "%s %s",buf_unit, buf_trait);
- break;
- case ELM_DATETIME_HOUR:
- snprintf(buf_unit, sizeof(buf_unit), _("IDS_COM_BODY_HOUR"));
- _accessibility_item_make_trait(buf_trait, buf_unit, sizeof(buf_trait));
- ret = snprintf(buf, sizeof(buf), "%2.0f %s %s",(double)t.tm_hour, buf_unit, buf_trait);
- break;
- case ELM_DATETIME_MINUTE:
- snprintf(buf_unit, sizeof(buf_unit), _("IDS_COM_BODY_MINUTE"));
- _accessibility_item_make_trait(buf_trait, buf_unit, sizeof(buf_trait));
- ret = snprintf(buf, sizeof(buf), "%2.0f %s %s",(double)t.tm_min, buf_unit, buf_trait);
- break;
- }
-
- if (ret < 0)
- WRN("text are truncated (%s)", buf);
-
- return strdup(buf);
-
-}
-
-static Eina_Bool
-_accessibility_datetime_ampm_gesutre_cb(void *data, Elm_Atspi_Gesture_Info gesture_info, Evas_Object *obj)
-{
- Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
- Evas_Object *datetime = circle_obj->widget_object;
- char buf_unit[255];
- struct tm t;
-
- switch (gesture_info.type)
- {
- case ELM_ATSPI_GESTURE_ONE_FINGER_DOUBLE_TAP:
- elm_datetime_value_get(datetime, &t);
-
- if ((double)t.tm_hour < 12.0f)
- snprintf(buf_unit, sizeof(buf_unit), _("IDS_COM_BODY_PM"));
- else
- snprintf(buf_unit, sizeof(buf_unit), _("IDS_COM_BODY_AM"));
-
- elm_atspi_bridge_utils_say(buf_unit, EINA_TRUE, NULL, NULL);
- break;
- default:
- break;
- }
+ Eext_Circle_Object *circle_obj = data;
+ EEXT_CIRCLE_OBJECT_DATETIME_DATA_GET(circle_obj, widget_data) return;
- return EINA_FALSE;
+ if (widget_data->activated)
+ eext_rotary_object_event_activated_set(obj, EINA_TRUE);
}
static void
-_accessibility_datetime_radio_highlighted_cb(void *data, Evas_Object *obj, void *event_info)
+_enable_rotary_event(Evas_Object *datetime, Eext_Circle_Object *circle_obj)
{
- char buf[PATH_MAX] = "";
- Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
- Evas_Object *datetime = circle_obj->widget_object;
- Elm_Datetime_Field_Type field_type = (Elm_Datetime_Field_Type)evas_object_data_get(obj, "_field_type");
+ int idx;
+ char buf[DATETIME_FIELD_NAME_BUF_MAX];
- if (field_type == ELM_DATETIME_AMPM)
- {
- Eext_Circle_Object_Datetime_Data *widget_data = (Eext_Circle_Object_Datetime_Data *)circle_obj->widget_data;
- widget_data->current_type = field_type;
- snprintf(buf, sizeof(buf), "field%d", ELM_DATETIME_HOUR);
- Evas_Object *radio_obj = elm_object_part_content_get(datetime, buf);
- elm_radio_value_set(radio_obj, -1);
- _eext_circle_object_datetime_picker_mark_angle_set(circle_obj, -1, EINA_FALSE);
- _eext_circle_object_datetime_bg_image_set(circle_obj, 6);
- }
- else
+ for (idx = ELM_DATETIME_YEAR; idx <= ELM_DATETIME_AMPM; idx++)
{
- elm_radio_value_set(obj, field_type);
- _eext_circle_object_datetime_current_type_update(circle_obj, EINA_TRUE);
- }
-
- elm_atspi_accessible_name_cb_set(obj, _accessibility_item_name_cb, (Eext_Circle_Object*)circle_obj);
- elm_atspi_accessible_reading_info_type_set(obj, ELM_ACCESSIBLE_READING_INFO_TYPE_NAME);
-}
-//
-
-static void
-date_field_focus_cb(void *data, const Efl_Event *event)
-{
- int type = evas_object_data_get(event->object, "field_type");
- Eo* spinner = evas_object_data_get(event->object, "field_obj");
-
- 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_limits_get(spinner, &circle_data->min, &circle_data->max);
-
- _eext_circle_object_datetime_current_type_update(circle_obj, EINA_TRUE);
-}
+ snprintf(buf, sizeof(buf), "field%d", idx);
+ Evas_Object *field_obj = elm_object_part_content_get(datetime, buf);
-static void add_date_type(Evas_Object *obj, int index, Eext_Circle_Object *circle_obj)
-{
- //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_direct_text_input_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);
+ if (field_obj)
+ {
+ eext_circle_object_spinner_add(field_obj, circle_obj->surface);
+ evas_object_smart_callback_add(field_obj, "focused", _spinner_focused_cb, circle_obj);
+ }
+ }
}
-static void
+static Eina_Bool
_eext_circle_object_datetime_init(Eext_Circle_Object *obj, Evas_Object *datetime)
{
Eext_Circle_Object_Datetime_Data *data;
- Eext_Circle_Object_Item *item;
-
- char buf[DATETIME_FIELD_NAME_BUF_MAX];
- int idx;
obj->widget_object = datetime;
obj->widget_type = EEXT_CIRCLE_OBJECT_DATETIME_TYPE;
- obj->del_func = _eext_circle_object_datetime_del_cb;
- obj->disabled_func = _eext_circle_object_datetime_disabled_cb;
- //obj->bg_obj_get_func = _eext_circle_object_datetime_bg_obj_get_cb;
data = (Eext_Circle_Object_Datetime_Data *)calloc(1, sizeof(Eext_Circle_Object_Datetime_Data));
- obj->widget_data = (void *)data;
+ if (!data) return EINA_FALSE;
- 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);
- _eext_circle_object_item_angle_offset_set(item, item->angle_offset -(mark_radius / 2));
- _eext_circle_object_item_angle_set(item, mark_radius);
- _eext_circle_object_item_append(obj, item);
-
- if (efl_isa(datetime, EFL_UI_LEGACY_INTERFACE))
- {
-
- 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
- {
- if (strstr(efl_class_name_get(datetime), "CircleDatepicker") != NULL)
- {
- 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++)
- {
- snprintf(buf, sizeof(buf), "field%d", idx);
-
- Evas_Object *field_obj = elm_object_part_content_get(datetime, buf);
- if (field_obj)
- {
- Elm_Datetime_Field_Type field_type = (Elm_Datetime_Field_Type)evas_object_data_get(field_obj, "_field_type");
- if (field_type != ELM_DATETIME_AMPM)
- evas_object_smart_callback_add(field_obj, "changed",
- _eext_circle_object_datetime_radio_changed_cb, obj);
- }
- }
-
- //for accessibility
- for (idx = ELM_DATETIME_YEAR; idx <= ELM_DATETIME_AMPM; idx++)
- {
- snprintf(buf, sizeof(buf), "field%d", idx);
- Evas_Object *field_obj = elm_object_part_content_get(obj->widget_object, buf);
- if (field_obj)
- {
- evas_object_smart_callback_add(field_obj, "atspi,highlighted", _accessibility_datetime_radio_highlighted_cb, obj);
- Elm_Datetime_Field_Type field_type = (Elm_Datetime_Field_Type)evas_object_data_get(field_obj, "_field_type");
- if (field_type == ELM_DATETIME_AMPM)
- {
- elm_atspi_accessible_gesture_cb_set(field_obj, _accessibility_datetime_ampm_gesutre_cb, obj);
- }
- }
- }
- //
-
- evas_object_smart_callback_add(datetime, "changed",
- _eext_circle_object_datetime_changed_cb, obj);
-
- _eext_circle_object_datetime_current_type_update(obj, EINA_FALSE);
-/**
- * FIXME(171030): Comment this function out because eext_circle_object_value_set is not applied to angle.
- _eext_circle_object_datetime_circle_update(obj);
-*/
+ obj->widget_data = (void *)data;
+ data->activated = EINA_FALSE;
+ obj->del_func = _eext_circle_object_datetime_del_cb;
+ obj->disabled_func = NULL;
- 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);
+ _enable_rotary_event(datetime, obj);
+ evas_object_smart_callback_add(obj->widget_object, SIGNAL_ACTIVATED, _eext_circle_object_datetime_activated_cb, obj);
+ evas_object_smart_callback_add(obj->main_obj, SIGNAL_ACTIVATED, _eext_circle_object_datetime_activated_cb, obj);
+ return EINA_TRUE;
}
EAPI Evas_Object *
EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return NULL;
- _eext_circle_object_datetime_init(circle_obj, datetime);
+ if (!_eext_circle_object_datetime_init(circle_obj, datetime))
+ return NULL;
return obj;
}
-
-/**
- * FIXME(150420) : After deciding how to support current types to application developer, we will define these APIs' name and parameters.
- *
-EAPI Elm_Datetime_Field_Type
-eext_circle_object_datetime_selected_field_type_get(const Evas_Object *obj)
-{
- EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return 0;
- EEXT_CIRCLE_OBJECT_DATETIME_DATA_GET(circle_obj, data) return 0;
-
- return data->current_type;
-}
-
-EAPI void
-eext_circle_object_datetime_selected_field_type_set(Evas_Object *obj, Elm_Datetime_Field_Type type)
-{
- Evas_Object *radio;
-
- EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
- EEXT_CIRCLE_OBJECT_DATETIME_DATA_GET(circle_obj, data) return;
-
- if (data->current_type == type) return;
-
- radio = _eext_circle_object_datetime_selected_field_object_get(obj);
- elm_radio_value_set(radio, type);
- data->current_type = type;
- _eext_circle_object_datetime_circle_update(circle_obj);
-}
-*/
#include "wearable/circle/efl_extension_circle_private.h"
#define EEXT_CIRCLE_OBJECT_SPINNER_TYPE "Eext_Circle_Object_Spinner"
-#define SPINNER_ITEM_NAME "default"
#define EEXT_CIRCLE_OBJECT_SPINNER_DATA_GET(circle_obj, data) \
Eext_Circle_Object_Spinner_Data *data = NULL; \
data = (Eext_Circle_Object_Spinner_Data *)circle_obj->widget_data; \
if (!data)
-static const double MARK_HEIGHT = 23.0;
-static const double RADIUS = 168.5; //BG_HEIGHT / 2 - MARK_HEIGHT / 2;
-static const double MARK_RADIUS = 2.000317;
-// chord = 2 * radius * sin(x/2), x = arcsin(sin(x)), arcsin(x) = 1 / sqrt(1 - pow(x, 2))
-
-static const double END_EFFECT_ANGLE = 15.0;
-
-static const double ANIMATION_DURATION = 0.3;
-
-// ----------------------------------------- Accessibility API --------------------------------------//
-static void _accessibility_spinner_highlighted_cb(void *data, Evas_Object *obj, void *event_info);
-static void _accessibility_spinner_unhighlighted_cb(void *data, Evas_Object *obj, void *event_info);
-
-// ----------------------------------------- animation API --------------------------------------//
+static const char SIGNAL_ACTIVATED[] = "rotary,activated";
+static const char SIGNAL_DEACTIVATED[] = "rotary,deactivated";
static void
-_eext_circle_object_spinner_mark_angle_offset_set(Eext_Circle_Object *obj, double angle)
-{
- Eext_Circle_Object_Item *item;
-
- item = _eext_circle_object_item_get(obj, SPINNER_ITEM_NAME);
-
- _eext_circle_object_item_angle_offset_set(item, angle - (MARK_RADIUS / 2));
- _eext_circle_object_item_angle_set(item, MARK_RADIUS);
-}
-
-static Eina_Bool
-_end_effect_expired_timer_cb(void *data)
+_eext_circle_object_spinner_activated_cb(void *data,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
{
Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
- Eext_Circle_Object_Spinner_Data *widget_data = (Eext_Circle_Object_Spinner_Data *)circle_obj->widget_data;
- Eext_Circle_Object_Item *item;
-
- item = _eext_circle_object_item_get(circle_obj, SPINNER_ITEM_NAME);
-
- _eext_circle_object_item_angle_transit_set(item, ANIMATION_DURATION,
- MARK_RADIUS, widget_data->to_angle_offset - (MARK_RADIUS / 2),
- EINA_TRUE,
- 0.25, 0.46,
- 0.45, 1.0);
-
- widget_data->end_effect_expired_timer = NULL;
-
- return ECORE_CALLBACK_CANCEL;
-}
-
-static void
-_eext_circle_object_spinner_mark_update(Eext_Circle_Object *obj, Eina_Bool animate)
-{
- Eext_Circle_Object_Spinner_Data *widget_data = (Eext_Circle_Object_Spinner_Data *)obj->widget_data;
-
- if (evas_object_visible_get(obj->widget_object) && animate)
- {
- Eext_Circle_Object_Item *item;
-
- item = _eext_circle_object_item_get(obj, SPINNER_ITEM_NAME);
-
- if (widget_data->end_effect_angle)
- {
- if (widget_data->end_effect_expired_timer) return;
-
- _eext_circle_object_item_angle_transit_set(item, ANIMATION_DURATION,
- MARK_RADIUS, widget_data->to_angle_offset + widget_data->end_effect_angle - (MARK_RADIUS / 2),
- EINA_TRUE,
- 0.25, 0.46,
- 0.45, 1.0);
-
- widget_data->end_effect_expired_timer = ecore_timer_add(ANIMATION_DURATION, _end_effect_expired_timer_cb, obj);
- }
- else
- {
- if (widget_data->end_effect_expired_timer)
- {
- ecore_timer_del(widget_data->end_effect_expired_timer);
- widget_data->end_effect_expired_timer = NULL;
- }
-
- _eext_circle_object_item_angle_transit_set(item, ANIMATION_DURATION,
- MARK_RADIUS, widget_data->to_angle_offset - (MARK_RADIUS / 2),
- EINA_TRUE,
- 0.25, 0.46,
- 0.45, 1.0);
- }
- }
- else
- _eext_circle_object_spinner_mark_angle_offset_set(obj, widget_data->to_angle_offset);
-}
-
-static double
-_eext_circle_object_spinner_angle_get(Eext_Circle_Object *obj)
-{
- Eext_Circle_Object_Spinner_Data *widget_data = (Eext_Circle_Object_Spinner_Data *)obj->widget_data;
- double min, max, angle;
-
- if (widget_data->angle) return widget_data->angle;
-
- elm_spinner_min_max_get(obj->widget_object, &min, &max);
-
- if (elm_spinner_wrap_get(obj->widget_object))
- angle = 360 / (max - min + 1);
- else
- {
- if (min == max)
- angle = 0.0;
- else
- angle = 360 / (max - min);
- }
-
- return angle;
-}
-
-static double
-_eext_circle_object_spinner_angle_offset_get(Eext_Circle_Object *obj, double val)
-{
- double min, angle_offset, real_part;
-
- elm_spinner_min_max_get(obj->widget_object, &min, NULL);
-
- angle_offset = (val - min) * _eext_circle_object_spinner_angle_get(obj);
- real_part = angle_offset - (int)angle_offset;
- angle_offset = (int)angle_offset % 360 + real_part;
+ EEXT_CIRCLE_OBJECT_SPINNER_DATA_GET(circle_obj, widget_data) return;
- return angle_offset;
+ widget_data->spinner_activated = EINA_TRUE;
}
static void
-_eext_circle_object_spinner_update(Eext_Circle_Object *obj)
+_eext_circle_object_spinner_deactivated_cb(void *data,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
{
- Eext_Circle_Object_Spinner_Data *widget_data = (Eext_Circle_Object_Spinner_Data *)obj->widget_data;
- double val;
-
- val = elm_spinner_value_get(obj->widget_object);
-
- widget_data->to_angle_offset = _eext_circle_object_spinner_angle_offset_get(obj, val);
+ Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+ EEXT_CIRCLE_OBJECT_SPINNER_DATA_GET(circle_obj, widget_data) return;
- _eext_circle_object_spinner_mark_update(obj, EINA_FALSE);
+ widget_data->spinner_activated = EINA_FALSE;
}
static void
-_eext_circle_object_spinner_changed_cb(void *data, Evas_Object *obj, void *event_info)
+_eext_circle_object_spinner_genlist_activated_cb(void *data,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
{
Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
- Eext_Circle_Object_Spinner_Data *widget_data = (Eext_Circle_Object_Spinner_Data *)circle_obj->widget_data;
+ EEXT_CIRCLE_OBJECT_SPINNER_DATA_GET(circle_obj, widget_data) return;
- if (widget_data->rotary_event)
- _eext_circle_object_spinner_mark_update(circle_obj, EINA_TRUE);
- else
- _eext_circle_object_spinner_update(circle_obj);
+ widget_data->genlist_activated = EINA_TRUE;
}
static void
-_eext_circle_object_spinner_focused_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+_eext_circle_object_spinner_genlist_deactivated_cb(void *data,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
{
- Evas_Object *text_button;
+ Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+ EEXT_CIRCLE_OBJECT_SPINNER_DATA_GET(circle_obj, widget_data) return;
- text_button = elm_object_part_content_get(obj, "elm.swallow.text_button");
- elm_layout_signal_emit(text_button, "elm,state,selected", "elm");
+ widget_data->genlist_activated = EINA_FALSE;
}
static void
-_eext_circle_object_spinner_unfocused_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+_spinner_genlist_hide_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
- Evas_Object *text_button;
-
- text_button = elm_object_part_content_get(obj, "elm.swallow.text_button");
- elm_layout_signal_emit(text_button, "elm,state,unselected", "elm");
-}
+ Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+ EEXT_CIRCLE_OBJECT_SPINNER_DATA_GET(circle_obj, widget_data) return;
-static double
-_looping_angle_distance_get(double from_angle_offset, double to_angle_offset, Eina_Bool value_up)
-{
- double angle_distance = 0;
+ if (!widget_data->circle_genlist) return;
- if (value_up)
- {
- if (from_angle_offset > to_angle_offset)
- angle_distance = 360 - from_angle_offset + to_angle_offset;
- else if (from_angle_offset < to_angle_offset)
- angle_distance = to_angle_offset - from_angle_offset;
- }
- else
- {
- if (from_angle_offset > to_angle_offset)
- angle_distance = from_angle_offset - to_angle_offset;
- else if (from_angle_offset < to_angle_offset)
- angle_distance = from_angle_offset + 360 - to_angle_offset;
- }
+ widget_data->genlist_visible = EINA_FALSE;
- return angle_distance;
+ if (widget_data->genlist_activated) eext_rotary_object_event_activated_set(circle_obj->widget_object, EINA_TRUE);
}
static void
-_eext_circle_object_spinner_value_update(Eext_Circle_Object *obj, Eina_Bool value_up)
-{
- Eext_Circle_Object_Spinner_Data *widget_data = (Eext_Circle_Object_Spinner_Data *)obj->widget_data;
- double val, step, min, max;
-
- val = elm_spinner_value_get(obj->widget_object);
-
- step = elm_spinner_step_get(obj->widget_object);
- elm_spinner_min_max_get(obj->widget_object, &min, &max);
-
- widget_data->end_effect_angle = 0.0;
-
- if (elm_spinner_wrap_get(obj->widget_object))
- {
- if (value_up)
- {
- if (val + step > max)
- {
- widget_data->to_angle_offset += _looping_angle_distance_get(
- _eext_circle_object_spinner_angle_offset_get(obj, max),
- _eext_circle_object_spinner_angle_offset_get(obj, min),
- value_up);
- val = min;
- }
- else
- {
- widget_data->to_angle_offset += _eext_circle_object_spinner_angle_get(obj) * step;
- val += step;
- }
- }
- else
- {
- if (val - step < min)
- {
- widget_data->to_angle_offset -= _looping_angle_distance_get(
- _eext_circle_object_spinner_angle_offset_get(obj, min),
- _eext_circle_object_spinner_angle_offset_get(obj, max),
- value_up);
- val = max;
- }
- else
- {
- widget_data->to_angle_offset -= _eext_circle_object_spinner_angle_get(obj) * step;
- val -= step;
- }
- }
- }
- else
- {
- if (value_up)
- {
- if (val + step > max)
- {
- if (val == max)
- widget_data->end_effect_angle = END_EFFECT_ANGLE;
- else
- widget_data->to_angle_offset += widget_data->angle * (max - val);
- }
- else
- widget_data->to_angle_offset += _eext_circle_object_spinner_angle_get(obj) * step;
-
- val += step;
- }
- else
- {
- if (val - step < min)
- {
- if (val == min)
- widget_data->end_effect_angle = -END_EFFECT_ANGLE;
- else
- widget_data->to_angle_offset -= widget_data->angle * (val - min);
- }
- else
- widget_data->to_angle_offset -= _eext_circle_object_spinner_angle_get(obj) * step;
-
- val -= step;
- }
- }
-
- widget_data->rotary_event = EINA_TRUE;
- elm_spinner_value_set(obj->widget_object, val);
- widget_data->rotary_event = EINA_FALSE;
-}
-
-static Eina_Bool
-_rotary_timer_cb(void *data)
+_spinner_genlist_show_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
{
Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
- Eext_Circle_Object_Spinner_Data *widget_data = (Eext_Circle_Object_Spinner_Data *)circle_obj->widget_data;
- Eext_Circle_Object_Item *item;
- Evas_Object *btn;
- double angle_offset_diff;
-
- btn = elm_object_part_content_get(circle_obj->widget_object, "elm.swallow.text_button");
+ EEXT_CIRCLE_OBJECT_SPINNER_DATA_GET(circle_obj, widget_data) return;
- if (!evas_object_focus_get(btn)) return ECORE_CALLBACK_CANCEL;
+ Evas_Object *genlist = NULL;
- item = _eext_circle_object_item_get(circle_obj, SPINNER_ITEM_NAME);
- if (!item) return ECORE_CALLBACK_CANCEL;
+ if (!widget_data->circle_genlist)
+ {
+ genlist = elm_object_part_content_get(obj, "elm.swallow.genlist");
- angle_offset_diff = fabs(_eext_circle_object_item_angle_offset_get(item)
- - item->draw.angle_offset);
+ widget_data->genlist = genlist;
+ widget_data->circle_genlist = eext_circle_object_genlist_add(widget_data->genlist, circle_obj->surface);
- if (angle_offset_diff <= 1.0e-8)
- elm_layout_signal_emit(elm_object_part_content_get(circle_obj->widget_object, "elm.swallow.text_button"),
- "elm,state,rotary,inactive", "eext");
+ eext_circle_object_genlist_scroller_policy_set(widget_data->circle_genlist, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
- widget_data->rotary_timer = NULL;
+ evas_object_smart_callback_add(widget_data->genlist, "hide", _spinner_genlist_hide_cb, circle_obj);
+ evas_object_smart_callback_add(widget_data->circle_genlist, SIGNAL_ACTIVATED, _eext_circle_object_spinner_genlist_activated_cb, circle_obj);
+ evas_object_smart_callback_add(widget_data->circle_genlist, SIGNAL_DEACTIVATED, _eext_circle_object_spinner_genlist_deactivated_cb, circle_obj);
+ }
- return ECORE_CALLBACK_CANCEL;
+ widget_data->genlist_visible = EINA_TRUE;
+ if (widget_data->spinner_activated) eext_rotary_object_event_activated_set(widget_data->circle_genlist, EINA_TRUE);
}
static Eina_Bool
-_rotary_changed_cb(void *data, Evas_Object *obj, Eext_Rotary_Event_Info *info)
+_rotary_changed_cb(void *data, Evas_Object *obj EINA_UNUSED, Eext_Rotary_Event_Info *info EINA_UNUSED)
{
- Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+ Eext_Circle_Object *circle_obj = data;
Eext_Circle_Object_Spinner_Data *widget_data = (Eext_Circle_Object_Spinner_Data *)circle_obj->widget_data;
-
- if (circle_obj->is_propagated)
- {
- circle_obj->is_propagated = EINA_FALSE;
-
- return EINA_TRUE;
- }
-
- if (elm_atspi_bridge_utils_is_screen_reader_enabled())
- {
- if (!widget_data->a11y_highlighted)
- return EINA_TRUE;
- }
-
- if (obj == circle_obj->main_obj)
- circle_obj->is_propagated = EINA_TRUE;
-
- elm_layout_signal_emit(elm_object_part_content_get(circle_obj->widget_object, "elm.swallow.text_button"),
- "elm,state,rotary,active", "eext");
-
- if (info->direction == EEXT_ROTARY_DIRECTION_CLOCKWISE)
- _eext_circle_object_spinner_value_update(circle_obj, EINA_TRUE);
- else
- _eext_circle_object_spinner_value_update(circle_obj, EINA_FALSE);
-
- if (widget_data->rotary_timer)
+ if (!widget_data->genlist_visible)
{
- ecore_timer_del(widget_data->rotary_timer);
- widget_data->rotary_timer = NULL;
- }
-
- widget_data->rotary_timer = ecore_timer_add(1.0, _rotary_timer_cb, circle_obj);
-
- /* Accessibility */
- if (elm_atspi_bridge_utils_is_screen_reader_enabled())
- {
- double val;
- char buf[255];
- const char *buf_val = NULL;
- Evas_Object *btn = elm_object_part_content_get(circle_obj->widget_object, "elm.swallow.text_button");
- val = elm_spinner_value_get(circle_obj->widget_object);
- buf_val = elm_layout_text_get(btn, "elm.text");
- if(buf_val)
- snprintf(buf, sizeof(buf), "%s",buf_val);
- else
- snprintf(buf, sizeof(buf), "%.0f",val);
- elm_atspi_bridge_utils_say((const char*)buf, EINA_TRUE, NULL, NULL);
+ widget_data->genlist_visible = EINA_TRUE;
+ elm_layout_signal_emit(circle_obj->widget_object, "elm,action,genlist,toggle", "elm");
}
return EINA_TRUE;
}
static void
_eext_circle_object_spinner_del_cb(Eext_Circle_Object *obj)
{
- if (!obj) return;
-
- if (obj->widget_data)
- {
- Eext_Circle_Object_Spinner_Data *widget_data = (Eext_Circle_Object_Spinner_Data *)obj->widget_data;
- // for accessibility
- Evas_Object *btn = elm_object_part_content_get(obj->widget_object, "elm.swallow.text_button");
- evas_object_smart_callback_del(btn, "atspi,highlighted", _accessibility_spinner_highlighted_cb);
- evas_object_smart_callback_del(btn, "atspi,unhighlighted", _accessibility_spinner_unhighlighted_cb);
- //
- if (widget_data->end_effect_expired_timer)
- {
- ecore_timer_del(widget_data->end_effect_expired_timer);
- widget_data->end_effect_expired_timer = NULL;
- }
-
- if (widget_data->rotary_timer)
- {
- ecore_timer_del(widget_data->rotary_timer);
- widget_data->rotary_timer = NULL;
- }
+ if (!obj)
+ return;
- free(obj->widget_data);
- obj->widget_data = NULL;
- }
+ EEXT_CIRCLE_OBJECT_SPINNER_DATA_GET(obj, widget_data) return;
- eext_rotary_object_event_callback_del(obj->widget_object, _rotary_changed_cb);
- eext_rotary_object_event_callback_del(obj->main_obj, _rotary_changed_cb);
-}
+ evas_object_smart_callback_del_full(obj->widget_object, SIGNAL_ACTIVATED, _eext_circle_object_spinner_activated_cb, obj);
+ evas_object_smart_callback_del_full(obj->main_obj, SIGNAL_ACTIVATED, _eext_circle_object_spinner_activated_cb, obj);
+ evas_object_smart_callback_del_full(obj->widget_object, SIGNAL_DEACTIVATED, _eext_circle_object_spinner_deactivated_cb, obj);
+ evas_object_smart_callback_del_full(obj->main_obj, SIGNAL_DEACTIVATED, _eext_circle_object_spinner_deactivated_cb, obj);
-static void
-_eext_circle_object_spinner_disabled_cb(Eext_Circle_Object *obj)
-{
- if (obj->disabled)
+ if (widget_data->circle_genlist)
{
- eext_rotary_object_event_callback_del(obj->widget_object, _rotary_changed_cb);
- eext_rotary_object_event_callback_del(obj->main_obj, _rotary_changed_cb);
+ evas_object_smart_callback_del_full(widget_data->circle_genlist, SIGNAL_ACTIVATED, _eext_circle_object_spinner_genlist_activated_cb, obj);
+ evas_object_smart_callback_del_full(widget_data->circle_genlist, SIGNAL_DEACTIVATED, _eext_circle_object_spinner_genlist_deactivated_cb, obj);
}
- else
+
+ if (obj->widget_data)
{
- 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);
+ free(obj->widget_data);
+ obj->widget_data = NULL;
}
}
-static void
-_efl_ui_range_changed_cb(void *data EINA_UNUSED, const Efl_Event *ev)
-{
- Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
- Eext_Circle_Object_Spinner_Data *widget_data = (Eext_Circle_Object_Spinner_Data *)circle_obj->widget_data;
-
- if (widget_data->rotary_event)
- _eext_circle_object_spinner_mark_update(circle_obj, EINA_TRUE);
- else
- _eext_circle_object_spinner_update(circle_obj);
-}
-
static void
_eext_circle_object_spinner_init(Eext_Circle_Object *obj, Evas_Object *spinner)
{
Eext_Circle_Object_Spinner_Data *data;
- Eext_Circle_Object_Item *item;
obj->widget_object = spinner;
obj->widget_type = EEXT_CIRCLE_OBJECT_SPINNER_TYPE;
obj->del_func = _eext_circle_object_spinner_del_cb;
- obj->disabled_func = _eext_circle_object_spinner_disabled_cb;
- //C# FIXME: If activate is true, efl ui spinner is not shown
- //obj->visible_on_activate = EINA_TRUE;
-
+ obj->disabled_func = NULL;
+ obj->visible_on_activate = EINA_TRUE;
data = (Eext_Circle_Object_Spinner_Data *)calloc(1, sizeof(Eext_Circle_Object_Spinner_Data));
- obj->widget_data = (void *)data;
-
- item = _eext_circle_object_item_new();
- _eext_circle_object_item_name_set(item, SPINNER_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);
- _eext_circle_object_item_angle_offset_set(item, item->angle_offset - (MARK_RADIUS / 2));
- _eext_circle_object_item_angle_set(item, MARK_RADIUS);
- _eext_circle_object_item_append(obj, item);
-
- elm_spinner_editable_set(spinner, EINA_FALSE);
-
- if (strstr(efl_class_name_get(spinner), "CircleSpinner") != NULL)
- {
- efl_event_callback_add(spinner, EFL_UI_RANGE_EVENT_CHANGED, _efl_ui_range_changed_cb, obj);
- //C# FIXME: consider focus / unfocus
- }
- else
+ if (!data)
{
- evas_object_smart_callback_add(spinner, "changed", _eext_circle_object_spinner_changed_cb, obj);
- evas_object_smart_callback_add(spinner, "focused", _eext_circle_object_spinner_focused_cb, NULL);
- evas_object_smart_callback_add(spinner, "unfocused", _eext_circle_object_spinner_unfocused_cb, NULL);
-
+ ERR("Could not allocate memory for Eext_Circle_Object_Spinner_Data!");
+ return;
}
- //for accessibility
- evas_object_smart_callback_add(elm_object_part_content_get(obj->widget_object, "elm.swallow.text_button"), "atspi,highlighted", _accessibility_spinner_highlighted_cb, obj);
- evas_object_smart_callback_add(elm_object_part_content_get(obj->widget_object, "elm.swallow.text_button"), "atspi,unhighlighted", _accessibility_spinner_unhighlighted_cb, obj);
- //
+ obj->widget_data = (void *)data;
+ data->genlist_visible = EINA_FALSE;
+ data->spinner_activated = EINA_FALSE;
+ data->genlist_activated = EINA_FALSE;
+ evas_object_smart_callback_add(spinner, "list,show", _spinner_genlist_show_cb, obj);
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);
+
+ evas_object_smart_callback_add(obj->widget_object, SIGNAL_ACTIVATED, _eext_circle_object_spinner_activated_cb, obj);
+ evas_object_smart_callback_add(obj->main_obj, SIGNAL_ACTIVATED, _eext_circle_object_spinner_activated_cb, obj);
+ evas_object_smart_callback_add(obj->widget_object, SIGNAL_DEACTIVATED, _eext_circle_object_spinner_deactivated_cb, obj);
+ evas_object_smart_callback_add(obj->main_obj, SIGNAL_DEACTIVATED, _eext_circle_object_spinner_deactivated_cb, obj);
}
EAPI Evas_Object *
EAPI void
eext_circle_object_spinner_angle_set(Evas_Object *obj, double angle)
{
- EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
- EEXT_CIRCLE_OBJECT_SPINNER_DATA_GET(circle_obj, widget_data) return;
-
- if ((angle <= 0) || (widget_data->angle == angle)) return;
-
- widget_data->angle = angle;
-}
-static char *
-_accessible_description_cb(void *data, Evas_Object *obj)
-{
- Eext_Circle_Object *circle_obj = data;
- double val;
- char buf_desc[255];
- char buf[255];
- const char *buf_val = NULL;
- const char *buf_unit = NULL;
- const char *format;
- int ret = 0;
-
- Evas_Object *btn = elm_object_part_content_get(circle_obj->widget_object, "elm.swallow.text_button");
-
- val = elm_spinner_value_get(circle_obj->widget_object);
- buf_unit = elm_object_part_text_get(circle_obj->widget_object, "elm.text");
- buf_val = elm_layout_text_get(btn, "elm.text");
-
- bindtextdomain (PACKAGE, LOCALE_DIR);
- if(buf_unit)
- {
- format = _("WDS_TTS_TBBODY_ROTATE_BEZEL_TO_ADJUST_PS");
- snprintf(buf_desc, sizeof(buf_desc), format, buf_unit);
- if(buf_val)
- ret = snprintf(buf, sizeof(buf), "%s %s %s",buf_val, buf_unit, buf_desc);
- else
- ret = snprintf(buf, sizeof(buf), "%.0f %s %s",val, buf_unit, buf_desc);
- }
- else
- {
- format = _("WDS_TTS_TBBODY_ROTATE_BEZEL_TO_ADJUST_PS");
- snprintf(buf_desc, sizeof(buf_desc), format, "");
- if(buf_val)
- ret = snprintf(buf, sizeof(buf), "%s %s",buf_val, buf_desc);
- else
- ret = snprintf(buf, sizeof(buf), "%.0f %s",val, buf_desc);
- }
-
- if (ret < 0)
- WRN("text are truncated (%s)", buf);
-
- return strdup(buf);
-}
-static void
-_accessibility_spinner_highlighted_cb(void *data, Evas_Object *obj, void *event_info)
-{
- Eext_Circle_Object *circle_obj = data;
- Eext_Circle_Object_Spinner_Data *widget_data = (Eext_Circle_Object_Spinner_Data *)circle_obj->widget_data;
- Evas_Object *btn = elm_object_part_content_get(circle_obj->widget_object, "elm.swallow.text_button");
-
- /* TODO: Reading information should be changed with UX team */
- elm_atspi_accessible_description_cb_set(btn, _accessible_description_cb, circle_obj);
- elm_atspi_accessible_reading_info_type_set(btn, ELM_ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION);
-
- elm_object_focus_set(circle_obj->widget_object, EINA_TRUE);
- widget_data->a11y_highlighted = EINA_TRUE;
-}
-static void
-_accessibility_spinner_unhighlighted_cb(void *data, Evas_Object *obj, void *event_info)
-{
- Eext_Circle_Object *circle_obj = data;
- Eext_Circle_Object_Spinner_Data *widget_data = (Eext_Circle_Object_Spinner_Data *)circle_obj->widget_data;
-
- elm_object_focus_set(circle_obj->widget_object, EINA_FALSE);
- widget_data->a11y_highlighted = EINA_FALSE;
}