From: Hosang Kim Date: Tue, 31 Dec 2019 11:38:37 +0000 (+0900) Subject: efl-ext: apply prod efl-extension for supporting ONE UI X-Git-Tag: submit/tizen/20200114.214303^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=d5434f01eb55f1bc548d642c84ff99f1f328dcd4;p=platform%2Fcore%2Fuifw%2Fefl-ext.git efl-ext: apply prod efl-extension for supporting ONE UI add supporting color class - slider - progressbar - scroller - genlist - gengrid Change-Id: I7b46a2a6bda3bee893f3c4fa8e36b1ffafcf62c9 --- diff --git a/inc/wearable/circle/efl_extension_circle_private.h b/inc/wearable/circle/efl_extension_circle_private.h index c07ac55..cbdb8ed 100644 --- a/inc/wearable/circle/efl_extension_circle_private.h +++ b/inc/wearable/circle/efl_extension_circle_private.h @@ -42,12 +42,15 @@ typedef enum } Eext_Circle_Surface_Type; struct _Eext_Circle_Surface { +#define EEXT_CIRCLE_SURFACE_MAGIC 0x87810516 + EINA_MAGIC; Evas_Object *parent; Evas_Object *main_obj; Evas_Object *vg_obj; Efl_VG *vg_root; Evas_Object *bg_obj; const char *bg_file_path; + unsigned char *buffer; Evas_Coord w, h; Evas_Coord center_x, center_y; Eext_Circle_Surface_Type type; @@ -55,9 +58,21 @@ struct _Eext_Circle_Surface { Eina_List *render_objs; Ecore_Job *render_job; + Ecore_Idle_Enterer *render_idle_enterer; Eext_Circle_Surface *parent_surface; Eina_List *sub_surfaces; Eext_Circle_Object *deactivated_obj; + + Eina_Bool changed : 1; + Eina_Bool color_changed : 1; + Eina_Bool bg_rendered : 1; + Eina_Bool image_rendered : 1; + Eina_Bool is_mirrored : 1; + //ONEUI1.5(13Aug2019): Fix for precision loss on angle calculation + double angle_diff; + double old_angle; + // + Evas_Map *map; }; typedef struct _Eext_Circle_Color Eext_Circle_Color; @@ -86,12 +101,15 @@ struct _Eext_Circle_Object { void (*disabled_func)(Eext_Circle_Object *obj); // color_changed_func: When color of an item is changed, it will be called. void (*color_changed_func)(Eext_Circle_Object *obj, const char *item_name); + //Do something before vector render. + void (*render_pre_cb)(Eext_Circle_Object *obj); Eina_Bool visible : 1; Eina_Bool disabled : 1; Eina_Bool visible_on_activate: 1; Eina_Bool is_active: 1; Eina_Bool is_propagated: 1; + Eina_Bool changed: 1; }; typedef struct _Eext_Circle_Object_Item Eext_Circle_Object_Item; @@ -154,18 +172,27 @@ struct _Eext_Circle_Object_Item { } angle_transit; Eina_Bool round_cap; + Eina_Bool color_changed; }; /* Datetime widget data */ typedef struct _Eext_Circle_Object_Datetime_Data Eext_Circle_Object_Datetime_Data; struct _Eext_Circle_Object_Datetime_Data { Elm_Datetime_Field_Type current_type; + Eext_Circle_Object* circle_obj; Eina_Bool activated; + //ONEUI1.5(21Jun2019): Avoid duplicate ampm object creation + Eina_Bool ampm_created; + // + //ONEUI1.5(02Jul2019): Set activate front spinner when datepicker set activate + Evas_Object *current_activated_obj; + // }; /* Progressbar widget data */ typedef struct _Eext_Circle_Object_Progressbar_Data Eext_Circle_Object_Progressbar_Data; struct _Eext_Circle_Object_Progressbar_Data { + Evas_Object *parent; Eext_Circle_Color color; Eext_Circle_Color bg_color; Eext_Circle_Color disabled_color; @@ -177,13 +204,17 @@ typedef struct _Eext_Circle_Object_Slider_Data Eext_Circle_Object_Slider_Data; struct _Eext_Circle_Object_Slider_Data { double value_step; Evas_Object *parent; - Evas_Object *hit_rect; Eext_Circle_Color color; Eext_Circle_Color bg_color; Eext_Circle_Color disabled_color; Eext_Circle_Color disabled_bg_color; Eext_Circle_Color cue_color; Eext_Circle_Color cue_press_color; + //ONEUI1.5(11Jan2019): Slider access support + Ecore_Timer *highlight_timer; + Ecore_Timer *read_timer; + // + unsigned int rotary_event_time_stamp; Evas_Point pressed_point; double prev_angle; @@ -195,27 +226,86 @@ struct _Eext_Circle_Object_Slider_Data { Eina_Bool drag : 1; Eina_Bool tap : 1; Eina_Bool freeze : 1; - Eina_Bool rotary: 1; + Eina_Bool touch_enabled : 1; + // ONEUI1.5(23Jul2019) : s/w bezel support + Eina_Bool user_touch_overwritten : 1; // true if _eext_circle_object_slider_touch_enabled_set has been called, false otherwise. + // }; /* Genlist widget data */ +typedef struct _Eext_Circle_Object_Genlist_Index_Item Eext_Circle_Object_Genlist_Index_Item; +struct _Eext_Circle_Object_Genlist_Index_Item { + Elm_Object_Item *item; + const char *letter; +}; + +typedef struct _Eext_Circle_Object_Genlist_Rotary_Time Eext_Circle_Object_Genlist_Rotary_Time; +struct _Eext_Circle_Object_Genlist_Rotary_Time { + double time; +}; + +//ONEUI1.5(20182310) : Circular Gengrid +typedef struct _Eext_Circle_Object_Gengrid_Rotary_Time Eext_Circle_Object_Gengrid_Rotary_Time; +struct _Eext_Circle_Object_Gengrid_Rotary_Time { + double time; +}; +// + typedef struct _Eext_Circle_Object_Genlist_Data Eext_Circle_Object_Genlist_Data; struct _Eext_Circle_Object_Genlist_Data { + Ecore_Timer *bar_first_show_timer; + Ecore_Timer *change_flag_timer; Ecore_Timer *bar_hide_timer; Elm_Scroller_Policy policy_h, policy_v; - int dest_y; Eext_Circle_Color color; Eext_Circle_Color bg_color; Eext_Circle_Color disabled_color; Eext_Circle_Color disabled_bg_color; + //ONEUI1.5(04July2019): Support different color with bezel + Eext_Circle_Color bezel_color; + Eina_Stringshare *bezel_scrollbar_color_class; + // + + Evas_Object *index_layout; + Ecore_Timer *index_hide_timer; + Eina_List *index_item_list; + Eext_Circle_Object_Genlist_Index_Item *index_selected_item; + Evas_Object *g_rect; + Evas_Object *g_layer; + Eina_Bool index_shown_anim : 1; + + int current_phase; + + Eina_List *rotary_times; + double last_time; + int rotary_count; + int detent_count; + + Evas_Object *handler_layout; + double handler_angle; Eina_Bool realized_callback_added : 1; -}; + Eina_Bool drag_callback_added : 1; -typedef struct _Eext_Circle_Object_Gengrid_Rotary_Time Eext_Circle_Object_Gengrid_Rotary_Time; -struct _Eext_Circle_Object_Gengrid_Rotary_Time { - double time; + Eext_Circle_Object_Item *item; + Eext_Circle_Object_Item *bg_item; + Elm_Object_Item *current_item; + Elm_Object_Item *aligned_item; + Eina_Bool scrollbar_initializing; + const char *scrollbar_color_class; + const char *scrollbar_bg_color_class; + Evas_Object *access_object; + int dest_y; + double bar_size_y; + unsigned int latest_time_stamp; + Eina_Bool scrollbar_first_shown : 1; + Eina_Bool scrollbar_shown : 1; + Eina_Bool handler_drag : 1; + Eina_Bool handler : 1; + //ONEUI1.5(04July2019): Support different color with bezel + Eina_Bool bezel_on : 1; + // }; typedef struct _Eext_Circle_Object_Gengrid_Data Eext_Circle_Object_Gengrid_Data; @@ -260,22 +350,41 @@ struct _Eext_Circle_Object_Scroller_Data { Ecore_Timer *bar_hide_timer; Elm_Scroller_Policy policy_v, policy_h; + Evas_Object *handler_layout; + double handler_angle; + Eext_Circle_Color vertical_color; Eext_Circle_Color vertical_bg_color; Eext_Circle_Color horizontal_color; Eext_Circle_Color horizontal_bg_color; Eext_Circle_Color disabled_color; Eext_Circle_Color disabled_bg_color; + //ONEUI1.5(04July2019): Support different color with bezel + Eext_Circle_Color bezel_vertical_color; + Eext_Circle_Color bezel_horizontal_color; + Eina_Stringshare *bezel_scrollbar_color_class; + // int step_x, step_y; int line_width; double radius; + + const char *scrollbar_color_class; + const char *scrollbar_bg_color_class; + + //ONEUI1.5(04July2019): Support different color with bezel + Eina_Bool bezel_on : 1; + // + Eina_Bool handler : 1; + Eina_Bool handler_drag : 1; + Eina_Bool handler_shown : 1; }; /* Spinner widget data */ typedef struct _Eext_Circle_Object_Spinner_Data Eext_Circle_Object_Spinner_Data; struct _Eext_Circle_Object_Spinner_Data { Evas_Object *genlist, *circle_genlist; + Eext_Circle_Object* circle_obj; Eina_Bool genlist_visible, spinner_activated, genlist_activated; }; diff --git a/inc/wearable/circle/efl_extension_rotary.h b/inc/wearable/circle/efl_extension_rotary.h index 55aadc0..be4780e 100644 --- a/inc/wearable/circle/efl_extension_rotary.h +++ b/inc/wearable/circle/efl_extension_rotary.h @@ -76,6 +76,22 @@ typedef enum _Eext_Rotary_Event_Direction EEXT_ROTARY_DIRECTION_COUNTER_CLOCKWISE /**< Rotary is rotated counter clockwise direction */ } Eext_Rotary_Event_Direction; + +typedef enum _Eext_Rotary_Event_Type +{ + EEXT_ROTARY_EVENT_TYPE_UNDEFINED = -1, + EEXT_ROTARY_EVENT_TYPE_NONE = 0, + EEXT_ROTARY_EVENT_TYPE_HW_BEZEL = 1 << 0, + EEXT_ROTARY_EVENT_TYPE_SW_BEZEL = 1 << 1 +} Eext_Rotary_Event_Type; + +typedef void (*Eext_Rotary_Event_Changed_Cb) (int *node, void *user_data); + +EAPI Eext_Rotary_Event_Type eext_rotary_event_type_get(void); +EAPI Eina_Bool eext_rotary_event_is_enabled(void); +EAPI void eext_rotary_event_changed_callback_add(Eext_Rotary_Event_Changed_Cb cb, void* data); +EAPI void eext_rotary_event_changed_callback_del(Eext_Rotary_Event_Changed_Cb cb); + /** * @WEARABLE_ONLY * @brief Rotary event information structure diff --git a/inc/wearable/efl_extension_common_private.h b/inc/wearable/efl_extension_common_private.h index 2f71aa2..af1ef02 100644 --- a/inc/wearable/efl_extension_common_private.h +++ b/inc/wearable/efl_extension_common_private.h @@ -109,7 +109,9 @@ struct _Eext_Rotary_Selector_Data { Evas_Object *parent; Evas_Object *rotary_selector; Evas_Object *event_area; + //ONEUI1.5(08Jun2018): Add gesture swipe support Evas_Object *gesture_layer; + // Eina_List *item_list; int item_count; int selected_index; @@ -153,6 +155,11 @@ struct _Eext_Rotary_Selector_Data { Ecore_Timer *longpress_timer; Ecore_Timer *stand_timer; Ecore_Timer *item_del_timer; + //ONEUI1.5(14Jun2018): Edit mode screen reader support + Ecore_Timer *highlight_timer; + Eina_Bool highlighted; + Eina_Bool rot_highlighted; + // Eext_Rotary_Selector_Direction stand_dir; int drag_item_index; int drop_item_index; @@ -181,9 +188,18 @@ struct _Eext_Rotary_Selector_Data { Evas_Object *accessible_need_highlight_obj; // + //ONEUI1.5(20Jun2017): Add next/prev icons for product style. + Eina_Bool is_product_style; + Eina_Bool checked_product_style; + Evas_Object* next_icon; + Evas_Object* prev_icon; + // + + //ONEUI1.5(04Jun2018): Delay for item animation + double item_swap_animator_delay_time; double item_drag_page_delay_time; double item_longpress_move_delay_time; - + // Evas_Object *drag_obj; Evas_Coord drag_pos_x; Evas_Coord drag_pos_y; @@ -211,6 +227,15 @@ struct _Eext_Rotary_Selector_Item_State_Color { Eext_Rotary_Selector_Item_Color disabled_color; }; +typedef struct +{ + Evas_Object *parent; + Eina_List *item_list; + Eext_Rotary_Selector_Item *add_item; + Eext_Rotary_Selector_Item *title_item; + Eina_Bool add_enabled; +} Rotary_Genlist_Data; + struct _Eext_Rotary_Selector_Item { EEXT_OBJECT_ITEM; int index; @@ -233,9 +258,17 @@ struct _Eext_Rotary_Selector_Item { Evas_Object *content_icon; Evas_Object *custom_content; Eina_Bool delete_enabled; + Rotary_Genlist_Data *rgd; + Evas_Object *obj; + Evas_Object *dummy_button; + Elm_Object_Item *item; + Evas_Object *content; + Elm_Genlist_Item_Class *itc; + char *part; + char *main_text; + char *sub_text; }; - /* More Option data */ typedef struct _Eext_More_Option_Data Eext_More_Option_Data; struct _Eext_More_Option_Data { @@ -249,11 +282,36 @@ struct _Eext_More_Option_Data { Evas_Object* cue_access_object; Evas_Object* cue_target_object; // + Evas_Object* genlist; + Evas_Object* circle_genlist; + Evas_Object *blur_image; + Ecore_Timer *effect_timer; + unsigned int effect_count; + //ONEUI1.5(27May2019): Reduce tbm memory by adding surface on demand + Eext_Circle_Surface *surface; + // + //ONEUI1.5(20190424):Avoid panel close by api when panel is not active. + Eina_Bool is_panel_active; + // + //ONEUI1.5(30May2019): Improve VI effect + Ecore_Idler *blur_idler; + // + //ONEUI1.5(20Jun2019): Add blur timer in case blur idler is not invoked + Ecore_Timer *blur_timer; + // + //ONEUI1.5(20Jun2019): Add genlist scroller color class change + Eina_Stringshare *scrollbar_bezel_fg_color_class; + Eina_Stringshare *scrollbar_fg_color_class; + Eina_Stringshare *scrollbar_bg_color_class; + // + void *mask_buffer; }; typedef struct _Eext_Panel_Data Eext_Panel_Data; struct _Eext_Panel_Data { + double prev_rel_y; // For determining scroll direction Evas_Object *parent; + Evas_Object *layout; Evas_Object *eext_panel; Evas_Object *primary_panel; Evas_Object *assist_panel; diff --git a/packaging/efl-extension.spec b/packaging/efl-extension.spec index aa70d9d..134cbc1 100644 --- a/packaging/efl-extension.spec +++ b/packaging/efl-extension.spec @@ -38,6 +38,12 @@ BuildRequires: pkgconfig(glib-2.0) BuildRequires: lcov %endif +#TIZEN_ONLY(20191212): adding internal interface for rotary event type +BuildRequires: pkgconfig(vconf) +BuildRequires: pkgconfig(capi-system-info) +BuildRequires: pkgconfig(capi-ui-efl-util) +# + Requires(post): /sbin/ldconfig Requires(postun): /sbin/ldconfig @@ -55,7 +61,6 @@ Requires: %{name} = %{version}-%{release} %description devel EFL extension library providing small utility functions (devel) - %if 0%{?gcov:1} %package gcov Summary: EFL extensiona library (gcov) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 2d39eb7..e48b79a 100755 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -121,6 +121,20 @@ FOREACH(flag ${LIB_TARGET_PKGS_LDFLAGS}) message("LIB_TARGET_PKGS_LDFLAGS ${flag}") ENDFOREACH(flag) +#TIZEN_ONLY(20191212): adding packages for interface of rotary event type +PKG_CHECK_MODULES(LIB_ROTARY_PKGS REQUIRED + vconf + capi-system-info + capi-ui-efl-util +) +FOREACH(flag ${LIB_ROTARY_PKGS_CFLAGS}) + SET(LIB_CFLAGS "${LIB_CFLAGS} ${flag}") +ENDFOREACH(flag) +FOREACH(flag ${LIB_ROTARY_PKGS_LDFLAGS}) + SET(LIB_PKGS_LDFLAGS "${LIB_PKGS_LDFLAGS} ${flag}") +ENDFOREACH(flag) +# + SET_TARGET_PROPERTIES(${LIB_NAME} PROPERTIES COMPILE_FLAGS "${LIB_CFLAGS}") SET_TARGET_PROPERTIES(${LIB_NAME} PROPERTIES VERSION ${VERSION}) SET_TARGET_PROPERTIES(${LIB_NAME} PROPERTIES SOVERSION ${VERSION_MAJOR}) diff --git a/src/efl_extension.c b/src/efl_extension.c index a7ed5a4..d2a10e7 100644 --- a/src/efl_extension.c +++ b/src/efl_extension.c @@ -45,13 +45,14 @@ eext_mod_init(void) EINA_LOG_ERR("could not register efl-extension log domain."); _eext_log_dom = EINA_LOG_DOMAIN_GLOBAL; } - INF("Init"); + + LOGI("Init"); } __DESTRUCTOR__ static void eext_mod_shutdown(void) { - INF("Shutdown\n"); + LOGI("Shutdown\n"); if ((_eext_log_dom > -1) && (_eext_log_dom != EINA_LOG_DOMAIN_GLOBAL)) { eina_log_domain_unregister(_eext_log_dom); @@ -69,14 +70,14 @@ eext_mod_shutdown(void) void _eext_magic_fail(const void *d, eext_magic m, eext_magic req_m, const char *fname) { - ERR("\n*** MAGIC FAIL (%s) ***\n", fname); + LOGE("\n*** MAGIC FAIL (%s) ***\n", fname); if (!d) - ERR(" Input handle pointer is NULL!"); + LOGE(" Input handle pointer is NULL!"); else if (m == EEXT_MAGIC_NONE) - ERR(" Input handle has already been freed!"); + LOGE(" Input handle has already been freed!"); else if (m != req_m) - ERR(" Input handle is wrong type\n" + LOGE(" Input handle is wrong type\n" " Expected: %08x - %s\n" " Supplied: %08x - %s", (unsigned int)req_m, _magic_string_get(req_m), @@ -101,7 +102,7 @@ eext_win_tzsh_native_window_get(const Elm_Win *obj) if (strcmp(elm_object_widget_type_get(obj), "Elm_Win")) { - ERR(" Input object is not elm_win widget"); + LOGE(" Input object is not elm_win widget"); return 0; } if (engine_name && @@ -129,7 +130,7 @@ eext_win_keygrab_set(Elm_Win *obj, const char *key) Eina_Bool ret = EINA_FALSE; ret = elm_win_keygrab_set(obj, key, 0, 0, 0, ELM_WIN_KEYGRAB_TOPMOST); if (!ret) - ERR(" Can't set keygrab of [%s].", key); + LOGE(" Can't set keygrab of [%s].", key); return ret; } @@ -139,6 +140,6 @@ eext_win_keygrab_unset(Elm_Win *obj, const char *key) Eina_Bool ret = EINA_FALSE; ret = elm_win_keygrab_unset(obj, key, 0, 0); if (!ret) - ERR(" Can't unset keygrab of [%s].", key); + LOGE(" Can't unset keygrab of [%s].", key); return ret; } diff --git a/src/efl_extension_events.c b/src/efl_extension_events.c index f6d2b0b..07d9645 100644 --- a/src/efl_extension_events.c +++ b/src/efl_extension_events.c @@ -83,6 +83,8 @@ _eext_object_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) Eina_List *l; Eext_Event_Callback *callback; + if (!event_mgr) return; + l = eina_list_data_find_list(event_mgr->obj_events, obj_event); if (!l) return; @@ -344,39 +346,39 @@ _eext_key_grab_obj_create(Eext_Event_Mgr *event_mgr) evas_object_event_callback_add(key_grab_rect, EVAS_CALLBACK_KEY_UP, _eext_key_grab_rect_key_up_cb, event_mgr); if (!evas_object_key_grab(key_grab_rect, EEXT_KEY_STOP, 0, 0, EINA_FALSE)) - ERR("Failed to grab END KEY\n"); + LOGE("Failed to grab END KEY\n"); if (!evas_object_key_grab(key_grab_rect, EEXT_KEY_STOP2, 0, 0, EINA_FALSE)) - ERR("Failed to grab END KEY\n"); + LOGE("Failed to grab END KEY\n"); if (!evas_object_key_grab(key_grab_rect, EEXT_KEY_STOP3, 0, 0, EINA_FALSE)) - ERR("Failed to grab END KEY\n"); + LOGE("Failed to grab END KEY\n"); if (!evas_object_key_grab(key_grab_rect, EEXT_KEY_SEND, 0, 0, EINA_FALSE)) - ERR("Failed to grab MORE KEY\n"); + LOGE("Failed to grab MORE KEY\n"); if (!evas_object_key_grab(key_grab_rect, EEXT_KEY_SEND2, 0, 0, EINA_FALSE)) - ERR("Failed to grab MORE KEY\n"); + LOGE("Failed to grab MORE KEY\n"); if (!evas_object_key_grab(key_grab_rect, EEXT_KEY_SEND3, 0, 0, EINA_FALSE)) - ERR("Failed to grab MORE KEY\n"); + LOGE("Failed to grab MORE KEY\n"); if (!evas_object_key_grab(key_grab_rect, EEXT_KEY_BACK, 0, 0, EINA_FALSE)) ERR ("Failed to grab BACK KEY\n"); if (!evas_object_key_grab(key_grab_rect, EEXT_KEY_BACK2, 0, 0, EINA_FALSE)) - ERR("Failed to grab BACK KEY\n"); + LOGE("Failed to grab BACK KEY\n"); if (!evas_object_key_grab(key_grab_rect, EEXT_KEY_BACK3, 0, 0, EINA_FALSE)) - ERR("Failed to grab BACK KEY\n"); + LOGE("Failed to grab BACK KEY\n"); if (!evas_object_key_grab(key_grab_rect, EEXT_KEY_MENU, 0, 0, EINA_FALSE)) - ERR("Failed to grab MENU KEY\n"); + LOGE("Failed to grab MENU KEY\n"); if (!evas_object_key_grab(key_grab_rect, EEXT_KEY_MENU2, 0, 0, EINA_FALSE)) - ERR("Failed to grab MENU KEY\n"); + LOGE("Failed to grab MENU KEY\n"); if (!evas_object_key_grab(key_grab_rect, EEXT_KEY_MENU3, 0, 0, EINA_FALSE)) - ERR("Failed to grab MENU KEY\n"); + LOGE("Failed to grab MENU KEY\n"); event_mgr->key_grab_rect = key_grab_rect; } @@ -387,7 +389,7 @@ _eext_event_mgr_new(Evas *e) Eext_Event_Mgr *event_mgr = calloc(1, sizeof(Eext_Event_Mgr)); if (!event_mgr) { - ERR("Failed to allocate event manager"); + LOGE("Failed to allocate event manager"); return NULL; } event_mgr->e = e; @@ -489,7 +491,7 @@ eext_object_event_callback_add(Evas_Object *obj, Eext_Callback_Type type, Eext_E obj_event = calloc(1, sizeof(Eext_Object_Event)); if (!obj_event) { - ERR("Failed to allocate object event"); + LOGE("Failed to allocate object event"); return; } evas_object_data_set(obj, EEXT_OBJ_KEY_OBJ_EVENT, obj_event); @@ -506,7 +508,7 @@ eext_object_event_callback_add(Evas_Object *obj, Eext_Callback_Type type, Eext_E callback = calloc(1, sizeof(Eext_Event_Callback)); if (!callback) { - ERR("Failed to allocate event callback"); + LOGE("Failed to allocate event callback"); return; } callback->type = type; @@ -526,17 +528,17 @@ eext_gesture_event_dispatch(Eext_Gesture_Event_Type type, int x, int y) eldbus_init(); if (!(conn = eldbus_connection_get(ELDBUS_CONNECTION_TYPE_SYSTEM))) { - ERR("Connection to system bus failed"); + LOGE("Connection to system bus failed"); return; } if (!(dobj = eldbus_object_get(conn, E_A11Y_SERVICE_BUS_NAME, E_A11Y_SERVICE_NAVI_OBJ_PATH))) { - ERR("Failed to create eldbus object"); + LOGE("Failed to create eldbus object"); goto fail_obj; } if (!(proxy = eldbus_proxy_get(dobj, E_A11Y_SERVICE_NAVI_IFC_NAME))) { - ERR("Failed to create proxy object for 'org.tizen.GestureNavigation'"); + LOGE("Failed to create proxy object for 'org.tizen.GestureNavigation'"); goto fail_proxy; } eldbus_proxy_call(proxy, "DispatchGestureEvent", NULL, NULL, -1, "iii", type, x, y); diff --git a/src/wearable/circle/efl_extension_circle_object.c b/src/wearable/circle/efl_extension_circle_object.c index 6edf552..2597636 100644 --- a/src/wearable/circle/efl_extension_circle_object.c +++ b/src/wearable/circle/efl_extension_circle_object.c @@ -18,48 +18,6 @@ #include "efl_extension_private.h" #include "wearable/circle/efl_extension_circle_private.h" -static void -_eext_circle_object_del_cb(void *data, - Evas *e, - Evas_Object *obj, - void *event_info) -{ - Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data; - Eext_Circle_Object_Item *item; - Eina_List *l, *l_next; - - if (!circle_obj) - { - ERR("Eext_Circle_Object is NULL"); - return; - } - - efl_unref(circle_obj->vg_container); - - if (circle_obj->del_func) - circle_obj->del_func(circle_obj); - - EINA_LIST_FOREACH_SAFE(circle_obj->items, l, l_next, item) - { - _eext_circle_object_item_free(item); - } - - if (circle_obj->surface) - { - _eext_circle_surface_object_remove(circle_obj->surface, circle_obj); - circle_obj->surface = NULL; - } - - circle_obj->visible = EINA_FALSE; - - if (obj) - evas_object_data_del(obj, EEXT_CIRCLE_OBJECT_TYPE); - - _eext_circle_object_bg_file_path_set(circle_obj, NULL); - - free(circle_obj); -} - static void _eext_circle_object_show_cb(void *data, Evas *e, @@ -117,10 +75,6 @@ _eext_circle_object_widget_object_show_cb(void *data, circle_obj->visible = EINA_TRUE; _eext_circle_object_changed(circle_obj); } - else - { - evas_object_show(circle_obj->main_obj); - } } static void @@ -155,21 +109,44 @@ _eext_circle_object_widget_object_enabled_cb(void *data, Evas_Object *obj, void } static void -_eext_circle_object_resize_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +_eext_circle_object_del_cb(void *data, + Evas *e, + Evas_Object *obj, + void *event_info) { - //C# FIXME: make resizable when using single usability - return; + Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data; + Eext_Circle_Object_Item *item; + Eina_List *l, *l_next; + + if (!circle_obj) + { + LOGE("Eext_Circle_Object is NULL"); + return; + } + + efl_unref(circle_obj->vg_container); + if (circle_obj->del_func) + circle_obj->del_func(circle_obj); + + EINA_LIST_FOREACH_SAFE(circle_obj->items, l, l_next, item) + { + _eext_circle_object_item_free(item); + } + + if (circle_obj->surface) + { + _eext_circle_surface_object_remove(circle_obj->surface, circle_obj); + circle_obj->surface = NULL; + } - /* - Evas_Coord w, h; + circle_obj->visible = EINA_FALSE; - evas_object_geometry_get(obj, NULL, NULL, &w, &h); + if (obj) + evas_object_data_del(obj, EEXT_CIRCLE_OBJECT_TYPE); - double radius = w > h? h : w; - radius /= 2; + _eext_circle_object_bg_file_path_set(circle_obj, NULL); - eext_circle_object_radius_set(obj, radius); - */ + free(circle_obj); } ////////////////////////////// @@ -190,9 +167,14 @@ _eext_circle_object_add(Evas_Object *parent, Evas_Object *widget_obj, Eext_Circl { surface = _eext_circle_surface_init(obj, NULL, EEXT_CIRCLE_SURFACE_TYPE_PRIVATE); circle_obj->private_surface = surface; + if (!surface) + { + free(circle_obj); + return NULL; + } } - // Obj is expected to be elm_image object. + // Obj is expected to be elm_table object. circle_obj->main_obj = obj; circle_obj->widget_object = widget_obj; circle_obj->widget_data = NULL; @@ -207,7 +189,6 @@ _eext_circle_object_add(Evas_Object *parent, Evas_Object *widget_obj, Eext_Circl evas_object_data_set(obj, EEXT_CIRCLE_OBJECT_TYPE, circle_obj); evas_object_repeat_events_set(obj, EINA_TRUE); - evas_object_event_callback_add(obj, EVAS_CALLBACK_RESIZE, _eext_circle_object_resize_cb, NULL); evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL, _eext_circle_object_del_cb, circle_obj); evas_object_event_callback_add(obj, EVAS_CALLBACK_SHOW, _eext_circle_object_show_cb, circle_obj); evas_object_event_callback_add(obj, EVAS_CALLBACK_HIDE, _eext_circle_object_hide_cb, circle_obj); @@ -228,26 +209,12 @@ _eext_circle_object_add(Evas_Object *parent, Evas_Object *widget_obj, Eext_Circl return obj; } -EAPI void -eext_circle_object_connect(Eext_Circle_Surface *surface, Evas_Object *widget_obj) -{ - EEXT_CIRCLE_OBJECT_GET(widget_obj, circle_obj) return; - _eext_circle_surface_object_append(surface, circle_obj); -} - -EAPI void -eext_circle_object_disconnect(Eext_Circle_Surface *surface, Evas_Object *widget_obj) -{ - EEXT_CIRCLE_OBJECT_GET(widget_obj, circle_obj) return; - _eext_circle_surface_object_remove(surface, circle_obj); - _eext_circle_surface_object_append(circle_obj->private_surface, circle_obj); -} - void _eext_circle_object_changed(Eext_Circle_Object *obj) { if (!obj) return; + obj->changed = EINA_TRUE; if (obj->surface) _eext_circle_surface_changed(obj->surface); } @@ -260,13 +227,13 @@ _eext_circle_object_item_get(const Eext_Circle_Object *obj, const char *name) if (!obj) { - ERR("Eext_Circle_Object is NULL! It returns NULL!"); + LOGE("Eext_Circle_Object is NULL! It returns NULL!"); return NULL; } if (!name) { - ERR("The given item name is NULL! It returns NULL!"); + LOGE("The given item name is NULL! It returns NULL!"); return NULL; } @@ -278,7 +245,7 @@ _eext_circle_object_item_get(const Eext_Circle_Object *obj, const char *name) return item; } - ERR("There is no [%s] item in the given object[%p:%s]! It returns NULL!", name, obj->main_obj, obj->widget_type); + LOGE("There is no [%s] item in the given object[%p:%s]! It returns NULL!", name, obj->main_obj, obj->widget_type); return NULL; } @@ -482,6 +449,7 @@ eext_circle_object_add(Evas_Object *parent, Eext_Circle_Surface *surface) EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return NULL; + circle_obj->changed = EINA_FALSE; item = _eext_circle_object_item_new(); _eext_circle_object_item_append(circle_obj, item); @@ -661,6 +629,31 @@ eext_circle_object_item_value_set(Evas_Object *obj, const char *item_name, doubl if (item) _eext_circle_object_item_value_set(item, value); + + if (!strcmp(circle_obj->widget_type, "Eext_Circle_Object_Slider") && !strcmp(item_name, "default")) + { + Eext_Circle_Object_Item *cue = NULL, *effect = NULL; + cue = _eext_circle_object_item_get(circle_obj, "cue"); + effect = _eext_circle_object_item_get(circle_obj, "effect"); + + double angle; + angle = _eext_circle_object_item_angle_get(item); + + if (cue) + { + cue->angle_offset = cue->min_angle - 1.0; + _eext_circle_object_item_angle_offset_set(cue, angle - 0.05); + _eext_circle_object_item_angle_set(cue, 0.1); + } + + if (effect) + { + effect->angle_offset = effect->min_angle - 1.0; + _eext_circle_object_item_angle_offset_set(effect, angle - 0.05); + _eext_circle_object_item_angle_set(effect, 0.1); + } + + } } EAPI double diff --git a/src/wearable/circle/efl_extension_circle_object_datetime.c b/src/wearable/circle/efl_extension_circle_object_datetime.c index b6ad90f..78eb7e2 100755 --- a/src/wearable/circle/efl_extension_circle_object_datetime.c +++ b/src/wearable/circle/efl_extension_circle_object_datetime.c @@ -40,6 +40,10 @@ _eext_circle_object_datetime_activated_cb(void *data, EEXT_CIRCLE_OBJECT_DATETIME_DATA_GET(circle_obj, widget_data) return; widget_data->activated = EINA_TRUE; + //ONEUI1.5(02Jul2019): Set activate front spinner when datepicker set activate + if (widget_data->current_activated_obj) + eext_rotary_object_event_activated_set(widget_data->current_activated_obj, EINA_TRUE); + // } static void @@ -58,32 +62,151 @@ _eext_circle_object_datetime_del_cb(Eext_Circle_Object *obj) static void _spinner_focused_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Eext_Circle_Object *circle_obj = data; + EEXT_CIRCLE_OBJECT_DATETIME_DATA_GET(circle_obj, widget_data) return; + //ONEUI1.5(04Feb2019): Trigger rotary event on highlighted object in atspi mode + if (elm_atspi_bridge_utils_is_screen_reader_enabled()) return; + // + if (widget_data->activated) + { + eext_rotary_object_event_activated_set(obj, EINA_TRUE); + //ONEUI1.5(01Oct2019): Update the activated object + widget_data->current_activated_obj = obj; + // + } +} + +//ONEUI1.5(04Feb2019): Trigger rotary event on highlighted object in atspi mode +static void +_spinner_highlighted_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) { Eext_Circle_Object *circle_obj = data; EEXT_CIRCLE_OBJECT_DATETIME_DATA_GET(circle_obj, widget_data) return; if (widget_data->activated) - eext_rotary_object_event_activated_set(obj, EINA_TRUE); + { + eext_rotary_object_event_activated_set(obj, EINA_TRUE); + //ONEUI1.5(01Oct2019): Update the activated object + widget_data->current_activated_obj = obj; + // + } } +// +//ONEUI1.5(04Feb2019): Enable rotary on all fields of datetime, format changed can be triggered many times +//and causes empty field issue and also As field objects are never deleted, we dont need format,changed. static void _enable_rotary_event(Evas_Object *datetime, Eext_Circle_Object *circle_obj) { int idx; char buf[DATETIME_FIELD_NAME_BUF_MAX]; + //ONEUI1.5(21Jun2019): Avoid duplicate ampm object creation + Elm_Datetime_Field_Type field_type ; + EEXT_CIRCLE_OBJECT_DATETIME_DATA_GET(circle_obj, widget_data) return; + // + //ONEUI1.5(02Jul2019): Set activate front spinner when datepicker set activate + const char *style = elm_object_style_get(datetime); + // 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(datetime, buf); - if (field_obj) { eext_circle_object_spinner_add(field_obj, circle_obj->surface); + //ONEUI1.5(21Jun2019): Avoid duplicate ampm object creation + field_type = (Elm_Datetime_Field_Type)evas_object_data_get(field_obj, "_field_type"); + if (field_type == ELM_DATETIME_AMPM) + widget_data->ampm_created = EINA_TRUE; + // + //ONEUI1.5(02Jul2019): Set activate front spinner when datepicker set activate + if (!strcmp(style, "timepicker/circle")) + { + if (idx == ELM_DATETIME_HOUR) + widget_data->current_activated_obj = field_obj; + } + else + { + if (idx == ELM_DATETIME_YEAR) + widget_data->current_activated_obj = field_obj; + } + // evas_object_smart_callback_add(field_obj, "focused", _spinner_focused_cb, circle_obj); + //ONEUI1.5(04Feb2019): Trigger rotary event on highlighted object + evas_object_smart_callback_add(field_obj, "atspi,highlighted", _spinner_highlighted_cb, circle_obj); + // } } } +// + +//ONEUI1.5(10Apr2019): enable rotary event on am/pm when it is swallowed as per format +static void +_eext_circle_object_datetime_timelayout_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + int idx; + char buf[DATETIME_FIELD_NAME_BUF_MAX]; + Evas_Object *field_obj = NULL; + Elm_Datetime_Field_Type field_type; + Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data; + //ONEUI1.5(21Jun2019): Avoid duplicate ampm object creation + EEXT_CIRCLE_OBJECT_DATETIME_DATA_GET(circle_obj, widget_data) return; + + if (widget_data->ampm_created) return; + // + + for (idx = ELM_DATETIME_YEAR; idx <= ELM_DATETIME_AMPM; idx++) + { + snprintf(buf, sizeof(buf), "field%d", idx); + field_obj = elm_object_part_content_get(obj, buf); + if (!field_obj) continue; + field_type = (Elm_Datetime_Field_Type)evas_object_data_get(field_obj, "_field_type"); + if (field_type == ELM_DATETIME_AMPM) break; + } + 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); + evas_object_smart_callback_add(field_obj, "atspi,highlighted", _spinner_highlighted_cb, circle_obj); + } +} +// + +//ONEUI1.5(02Jul2019): Set activate front spinner when datepicker set activate +static void +_eext_circle_object_datetime_stye_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data; + EEXT_CIRCLE_OBJECT_DATETIME_DATA_GET(circle_obj, widget_data) return; + + int idx; + char buf[DATETIME_FIELD_NAME_BUF_MAX]; + const char *style = elm_object_style_get(circle_obj->widget_object); + + for (idx = ELM_DATETIME_YEAR; idx <= ELM_DATETIME_HOUR; idx++) + { + snprintf(buf, sizeof(buf), "field%d", idx); + Evas_Object *field_obj = elm_object_part_content_get(obj, buf); + if (field_obj) + { + if (!strcmp(style, "timepicker/circle")) + { + if (idx == ELM_DATETIME_HOUR) + widget_data->current_activated_obj = field_obj; + } + else + { + if (idx == ELM_DATETIME_YEAR) + widget_data->current_activated_obj = field_obj; + } + } + } + if (widget_data->activated) + eext_rotary_object_event_activated_set(widget_data->current_activated_obj, EINA_TRUE); +} +// static Eina_Bool _eext_circle_object_datetime_init(Eext_Circle_Object *obj, Evas_Object *datetime) @@ -96,15 +219,30 @@ _eext_circle_object_datetime_init(Eext_Circle_Object *obj, Evas_Object *datetime data = (Eext_Circle_Object_Datetime_Data *)calloc(1, sizeof(Eext_Circle_Object_Datetime_Data)); if (!data) return EINA_FALSE; + data->circle_obj = obj; + //ONEUI1.5(21Jun2019): Avoid duplicate ampm object creation + data->ampm_created = EINA_FALSE; + // obj->widget_data = (void *)data; data->activated = EINA_FALSE; obj->del_func = _eext_circle_object_datetime_del_cb; obj->disabled_func = NULL; + //ONEUI1.5(02Jul2019): Set activate front spinner when datepicker set activate + data->current_activated_obj = NULL; + // + //ONEUI1.5(04Feb2019): Enable rotary on all fields of date-time, format changed can be triggered many times + //and causes empty field issue and also As field objects are never deleted, we don't need format,changed. _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); - + //ONEUI1.5(10Apr2019): enable rotary event on am/pm when it is swallowed as per format + evas_object_smart_callback_add(obj->widget_object, "timelayout,changed", _eext_circle_object_datetime_timelayout_changed_cb, obj); + // + //ONEUI1.5(02Jul2019): Set activate front spinner when datepicker set activate + evas_object_smart_callback_add(obj->widget_object, "field,location,changed", _eext_circle_object_datetime_stye_changed_cb, obj); + // return EINA_TRUE; } diff --git a/src/wearable/circle/efl_extension_circle_object_gengrid.c b/src/wearable/circle/efl_extension_circle_object_gengrid.c index 0ea0503..4c4cb7a 100644 --- a/src/wearable/circle/efl_extension_circle_object_gengrid.c +++ b/src/wearable/circle/efl_extension_circle_object_gengrid.c @@ -47,6 +47,26 @@ #define ROTARY_PHASE_N3 1.5 #define ROTARY_PHASE_N4 4 +#define SCROLL_BAR_COLOR_R 14 +#define SCROLL_BAR_COLOR_G 137 +#define SCROLL_BAR_COLOR_B 181 +#define SCROLL_BAR_COLOR_A 255 + +#define SCROLL_BAR_BG_COLOR_R 250 +#define SCROLL_BAR_BG_COLOR_G 250 +#define SCROLL_BAR_BG_COLOR_B 250 +#define SCROLL_BAR_BG_COLOR_A 38 + +#define SCROLL_BAR_COLOR_DISABLED_R 45 +#define SCROLL_BAR_COLOR_DISABLED_G 45 +#define SCROLL_BAR_COLOR_DISABLED_B 45 +#define SCROLL_BAR_COLOR_DISABLED_A 255 + +#define SCROLL_BAR_BG_COLOR_DISABLED_R 45 +#define SCROLL_BAR_BG_COLOR_DISABLED_G 45 +#define SCROLL_BAR_BG_COLOR_DISABLED_B 45 +#define SCROLL_BAR_BG_COLOR_DISABLED_A 63 + static const char SIGNAL_LOADED[] = "loaded"; static const char SIGNAL_ACTIVATED[] = "rotary,activated"; static const char SIGNAL_DEACTIVATED[] = "rotary,deactivated"; @@ -230,17 +250,6 @@ _eext_circle_object_gengrid_region_show(Eext_Circle_Object *circle_obj, elm_scroller_region_bring_in(circle_obj->widget_object, x, y_pos, w, h); } -static Eext_Circle_Object_Gengrid_Rotary_Time * -_eext_circle_object_gengrid_rotary_time_new(double time) -{ - Eext_Circle_Object_Gengrid_Rotary_Time *rotary_time = calloc(1, sizeof(Eext_Circle_Object_Gengrid_Rotary_Time)); - - if (rotary_time) - rotary_time->time = time; - - return rotary_time; -} - static Eina_Bool _rotary_changed_cb(void *data, Evas_Object *obj, @@ -364,7 +373,6 @@ _eext_circle_object_gengrid_scrollbar_update(Eext_Circle_Object *circle_obj) widget_data->bar_size_y = 0; _eext_circle_object_item_color_set(widget_data->item, 0, 0, 0, 0); _eext_circle_object_item_color_set(widget_data->bg_item, 0, 0, 0, 0); - _eext_circle_object_changed(circle_obj); return; } if (horizontal) @@ -622,8 +630,6 @@ _eext_circle_object_gengrid_init_scroller_info(Eext_Circle_Object *circle_obj) _eext_circle_object_item_color_set(widget_data->item, 0, 0, 0, 0); _eext_circle_object_item_color_set(widget_data->bg_item, 0, 0, 0, 0); - - _eext_circle_object_changed(circle_obj); } static void @@ -783,6 +789,43 @@ _eext_circle_object_gengrid_del_cb(Eext_Circle_Object *circle_obj) eext_rotary_object_event_callback_del(circle_obj->widget_object, _rotary_changed_cb); } +static void +_update_color_info(Eext_Circle_Object *obj) +{ + EEXT_CIRCLE_OBJECT_GENGRID_DATA_GET(obj, widget_data) return; + int r, g, b, a; + + if (!edje_object_color_class_get(elm_layout_edje_get(obj->widget_object), + widget_data->scrollbar_color_class, + &r, &g, &b, &a, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)) + { + r = SCROLL_BAR_COLOR_R; + g = SCROLL_BAR_COLOR_G; + b = SCROLL_BAR_COLOR_B; + a = SCROLL_BAR_COLOR_A; + } + widget_data->color.r = r; + widget_data->color.g = g; + widget_data->color.b = b; + widget_data->color.a = a; + + if (!edje_object_color_class_get(elm_layout_edje_get(obj->widget_object), + widget_data->scrollbar_bg_color_class, + &r, &g, &b, &a, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)) + { + r = SCROLL_BAR_BG_COLOR_R; + g = SCROLL_BAR_BG_COLOR_G; + b = SCROLL_BAR_BG_COLOR_B; + a = SCROLL_BAR_BG_COLOR_A; + } + widget_data->bg_color.r = r; + widget_data->bg_color.g = g; + widget_data->bg_color.b = b; + widget_data->bg_color.a = a; +} + static void _eext_circle_object_gengrid_init(Eext_Circle_Object *circle_obj, Evas_Object *gengrid) @@ -795,19 +838,21 @@ _eext_circle_object_gengrid_init(Eext_Circle_Object *circle_obj, circle_obj->mirrored_state = EEXT_CIRCLE_MIRRORED_CONFIG; widget_data = (Eext_Circle_Object_Gengrid_Data *)calloc(1, sizeof(Eext_Circle_Object_Gengrid_Data)); + if (!widget_data) + { + LOGE("Could not allocate memory for Eext_Circle_Object_Gengrid_Data!"); + return; + } + widget_data->policy_v = ELM_SCROLLER_POLICY_AUTO; widget_data->scrollbar_initializing = EINA_FALSE; widget_data->scrollbar_color_class = edje_object_data_get(elm_layout_edje_get(gengrid), "bar_color_class"); widget_data->scrollbar_bg_color_class = edje_object_data_get(elm_layout_edje_get(gengrid), "bar_bg_color_class"); + circle_obj->widget_data = (void *)widget_data; + _update_color_info(circle_obj); + widget_data->bg_item = _eext_circle_object_item_new(); - edje_object_color_class_get(elm_layout_edje_get(circle_obj->widget_object), - widget_data->scrollbar_bg_color_class, - &widget_data->bg_color.r, - &widget_data->bg_color.g, - &widget_data->bg_color.b, - &widget_data->bg_color.a, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); _eext_circle_object_item_name_set(widget_data->bg_item, GENGRID_BG_ITEM_NAME); _eext_circle_object_item_color_set(widget_data->bg_item, 0, 0, 0, 0); if (elm_gengrid_horizontal_get(gengrid)) @@ -827,13 +872,6 @@ _eext_circle_object_gengrid_init(Eext_Circle_Object *circle_obj, _eext_circle_object_item_append(circle_obj, widget_data->bg_item); widget_data->item = _eext_circle_object_item_new(); - edje_object_color_class_get(elm_layout_edje_get(circle_obj->widget_object), - widget_data->scrollbar_color_class, - &widget_data->color.r, - &widget_data->color.g, - &widget_data->color.b, - &widget_data->color.a, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); _eext_circle_object_item_name_set(widget_data->item, GENGRID_ITEM_NAME); _eext_circle_object_item_color_set(widget_data->item, 0, 0, 0, 0); if (elm_gengrid_horizontal_get(gengrid)) @@ -852,8 +890,6 @@ _eext_circle_object_gengrid_init(Eext_Circle_Object *circle_obj, } _eext_circle_object_item_append(circle_obj, widget_data->item); - circle_obj->widget_data = (void *)widget_data; - elm_scroller_policy_set(circle_obj->widget_object, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); evas_object_smart_callback_add(circle_obj->widget_object, SIGNAL_ACTIVATED, _eext_circle_object_gengrid_activated_cb, circle_obj); @@ -894,7 +930,7 @@ eext_circle_object_gengrid_scroller_policy_set(Evas_Object *obj, EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return; EEXT_CIRCLE_OBJECT_GENGRID_DATA_GET(circle_obj, widget_data) { - ERR("Eext_Circle_Object type mismatch: expected type [%s], given type [%s]", + LOGE("Eext_Circle_Object type mismatch: expected type [%s], given type [%s]", EEXT_CIRCLE_OBJECT_GENGRID_TYPE, circle_obj->widget_type); return; } @@ -935,7 +971,7 @@ eext_circle_object_gengrid_scroller_policy_get(const Evas_Object *obj, EEXT_CIRCLE_OBJECT_GENGRID_DATA_GET(circle_obj, widget_data) { - ERR("Eext_Circle_Object type mismatch: expected type [%s], given type [%s]", + LOGE("Eext_Circle_Object type mismatch: expected type [%s], given type [%s]", EEXT_CIRCLE_OBJECT_GENGRID_TYPE, circle_obj->widget_type); if (policy_h) *policy_h = ELM_SCROLLER_POLICY_AUTO; if (policy_v) *policy_v = ELM_SCROLLER_POLICY_AUTO; diff --git a/src/wearable/circle/efl_extension_circle_object_genlist.c b/src/wearable/circle/efl_extension_circle_object_genlist.c index ead141f..57f3a37 100644 --- a/src/wearable/circle/efl_extension_circle_object_genlist.c +++ b/src/wearable/circle/efl_extension_circle_object_genlist.c @@ -17,18 +17,30 @@ #include "efl_extension.h" #include "efl_extension_private.h" #include "wearable/circle/efl_extension_circle_private.h" - #define EEXT_CIRCLE_OBJECT_GENLIST_TYPE "Eext_Circle_Object_Genlist" #define VERTICAL_BAR_ANGLE_START 60.0 #define VERTICAL_BAR_ANGLE_RANGE 60.0 #define VERTICAL_BAR_ANGLE_MAX_SIZE 60.0 #define VERTICAL_BAR_ANGLE_MIN_SIZE 6.0 +#define VERTICAL_BAR_ANGLE_HANDLER_SIZE 15.3 #define VERTICAL_BAR_TRANSIT_TIME 0.2 #define VERTICAL_BAR_HIDE_WAITTING_TIME 0.2 #define VERTICAL_BAR_HIDE_WAITTING_TIME_ON_INITIALIZING 1.0 #define VERTICAL_BAR_WIDTH_SIZE 10 -#define VERTICAL_BAR_RADIUS_SIZE 174 // (180 - (BAR_WIDTH / 2) - 1) +#define HANDLER_BAR_WIDTH_SIZE 32 +#define VERTICAL_BAR_RADIUS_SIZE 174 // (180 - 6) +#define DETENT_SCROLL_DISTANCE_RATE 0.4 +#define ROTARY_EVENT_TIME_STAMP_THRESHOLD 500 +//ONEUI1.5(04July2019): Support different color with bezel +#define SCROLL_BAR_TRANSIT_TIME 0.2 +// +#define SURFACE_WIDTH 360 + +#define ROTARY_PHASE_N1 0.1 +#define ROTARY_PHASE_N2 3 +#define ROTARY_PHASE_N3 1.5 +#define ROTARY_PHASE_N4 4 #define SCROLL_BAR_COLOR_R 14 #define SCROLL_BAR_COLOR_G 137 @@ -50,6 +62,30 @@ #define SCROLL_BAR_BG_COLOR_DISABLED_B 45 #define SCROLL_BAR_BG_COLOR_DISABLED_A 63 +static const char SIGNAL_LOADED[] = "loaded"; +static const char SIGNAL_SCROLL[] = "scroll"; +static const char SIGNAL_SCROLL_ANIM_STOP[] = "scroll,anim,stop"; +static const char SIGNAL_INDEX_SHOW[] = "index,state,show"; +static const char SIGNAL_INDEX_HIDE[] = "index,state,hide"; +static const char SIGNAL_EDGE_TOP_ROTARY_DETENTED[] = "elm,edge,top,rotary,detented"; +static const char SIGNAL_EDGE_BOTTOM_ROTARY_DETENTED[] = "elm,edge,bottom,rotary,detented"; +static const char SIGNAL_ITEM_DELETED[] = "item,deleted"; +static const char SIG_ALIGNED_ITEM_DETECTED[] = "aligned,item,detected"; +static const char SIG_BRING_IN_ITEM_ADJUSTED[] = "bring_in,item,adjusted"; +static const char SIG_REALIZED[] = "realized"; +static const char SIG_INDEX_SHOW[] = "index,show"; +static const char HANDLER_STYLE[] = "prod/handler"; +//ONEUI1.5(18FEB2019): Genlist resume/pause signal for scrollbar show +static const char SIG_GENLIST_RESUME[] = "genlist,resume"; +static const char SIG_GENLIST_PAUSE[] = "genlist,pause"; +// +//ONEUI1.5(03JUN2019): Update circle genlist on theme change +static const char SIG_THEME_CHANGED[] = "theme,changed"; +// + +Elm_Scrollable_Smart_Interface_Data* __elm_scrollable_smart_interface_data_get(Eo *obj); +extern void elm_pan_pos_adjust(Eo *obj, Evas_Coord *x, Evas_Coord *y); + #define EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, data) \ Eext_Circle_Object_Genlist_Data *data = NULL; \ if (circle_obj && circle_obj->widget_data && \ @@ -57,508 +93,1843 @@ data = (Eext_Circle_Object_Genlist_Data *)circle_obj->widget_data; \ if (!data) +#define EEXT_CIRCLE_OBJECT_GENLIST_SCROLL_IFACE_DATA_GET(o, ptr) \ + Elm_Scrollable_Smart_Interface_Data *ptr = \ + (Elm_Scrollable_Smart_Interface_Data *)(__elm_scrollable_smart_interface_data_get((Eo *)o)); \ + if (!ptr) \ + { \ + LOGE("No interface data for object %p (%s)", o, evas_object_type_get(o)); \ + } + #define GENLIST_ITEM_NAME "default" #define GENLIST_BG_ITEM_NAME "vertical,scroll,bg" +#define STR_DUP(x) x ? (char *)eina_stringshare_add(x) : NULL -static void _eext_circle_object_genlist_scrollbar_update(Eext_Circle_Object *obj); -static void _eext_circle_object_genlist_scrollbar_show(Eext_Circle_Object *obj, - double hide_waiting_time); +static void _eext_circle_object_genlist_index_drag_cb(void *data, + Evas_Object *obj, + void *event_info); +static void _eext_circle_object_genlist_scrollbar_show(Eext_Circle_Object *circle_obj); +static Eina_Bool _eext_circle_object_genlist_change_flag_cb(void *); +static Eina_Bool _eext_circle_object_genlist_scrollbar_first_show_cb(void *); +extern Eina_Bool __elm_product_theme_is_loaded(void); -static void -_eext_circle_object_genlist_region_show(void *data, Eina_Bool clockwise) +static Evas_Event_Flags _index_layout_lines_end(void *data, void *event_info); +static Evas_Event_Flags _index_layout_tap_end(void *data, void *event_info); +static void _remove_gesture_layer(Eext_Circle_Object *circle_obj); + + +static Eext_Circle_Object_Genlist_Index_Item * +_eext_circle_object_genlist_index_item_new(Eext_Circle_Object *circle_obj, + Elm_Object_Item *item, + const char *letter) { - Eext_Circle_Object *obj = (Eext_Circle_Object *)data; - Evas_Coord x, y, vw, vh; - Elm_Object_Item *next_item; + Eext_Circle_Object_Genlist_Index_Item *index_item; + + if (!circle_obj || !letter || !item) return NULL; + + EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return NULL; - if (!obj) return; + index_item = (Eext_Circle_Object_Genlist_Index_Item *)calloc(1, sizeof(Eext_Circle_Object_Genlist_Index_Item)); + if (!index_item) return NULL; + + index_item->letter = eina_stringshare_add(letter); + index_item->item = item; + + if (!widget_data->index_item_list) + widget_data->index_selected_item = index_item; + + return index_item; +} + +static void +_eext_circle_object_genlist_index_hide(Eext_Circle_Object *circle_obj) +{ + EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return; - if (efl_isa(obj->widget_object, EFL_UI_LEGACY_INTERFACE)) + if (widget_data->index_layout) { - elm_scroller_region_get(obj->widget_object, NULL, NULL, &vw, &vh); - evas_object_geometry_get(obj->widget_object, &x, &y, NULL, NULL); + Eext_Circle_Object_Genlist_Rotary_Time *rotary_time; - next_item = elm_genlist_at_xy_item_get(obj->widget_object, (vw / 2) + x, (vh / 2) + y, 0); + if (widget_data->index_hide_timer) + { + ecore_timer_del(widget_data->index_hide_timer); + widget_data->index_hide_timer = NULL; + } - if (!next_item) return; + evas_object_smart_callback_call(circle_obj->main_obj, "index,state,hide", widget_data->index_layout); + elm_object_signal_emit(widget_data->index_layout, SIGNAL_INDEX_HIDE, "elm"); - if (clockwise) - next_item = elm_genlist_item_next_get(next_item); - else - next_item = elm_genlist_item_prev_get(next_item); + if (widget_data->index_selected_item) + { + widget_data->current_item = widget_data->index_selected_item->item; + } + + if (elm_atspi_bridge_utils_is_screen_reader_enabled() && widget_data->access_object) + { + elm_atspi_component_highlight_grab(widget_data->current_item); + } - if (!next_item) return; + if (widget_data->drag_callback_added) + { + evas_object_smart_callback_del_full(circle_obj->widget_object, "drag", _eext_circle_object_genlist_index_drag_cb, circle_obj); + widget_data->drag_callback_added = EINA_FALSE; + } - elm_genlist_item_bring_in(next_item, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE); + EINA_LIST_FREE(widget_data->rotary_times, rotary_time) + free(rotary_time); + + if (!__elm_product_theme_is_loaded()) + widget_data->index_selected_item = NULL; + widget_data->rotary_count = 0; + widget_data->current_phase = 0; } - else +} + +static Eina_Bool +_eext_circle_object_genlist_index_hide_timer_cb(void *data) +{ + Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data; + _eext_circle_object_genlist_index_hide(circle_obj); + //ONEUI1.5(19Jun2019): Enable sw/hw bezel + if (!eext_rotary_event_is_enabled()) + _remove_gesture_layer(circle_obj); + + return ECORE_CALLBACK_DONE; +} + +static void +_eext_circle_object_genlist_index_show(Eext_Circle_Object *circle_obj) +{ + double hide_time = ROTARY_PHASE_N3; + EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return; + + if (widget_data->index_layout) { - Eina_Size2D size; - Eina_Position2D pos = efl_ui_scrollable_content_pos_get(obj->widget_object); - Eina_Rect rect = efl_ui_scrollable_viewport_geometry_get(obj->widget_object); + if (widget_data->index_hide_timer) + { + ecore_timer_del(widget_data->index_hide_timer); + widget_data->index_hide_timer = NULL; + } + else + { + evas_object_smart_callback_call(circle_obj->main_obj, "index,state,show", widget_data->index_layout); + elm_object_signal_emit(widget_data->index_layout, SIGNAL_INDEX_SHOW, "elm"); + } - //C# FIXME: list should be center aligned - if (clockwise) + if (widget_data->index_selected_item) { - rect.y = pos.y + 30; - efl_ui_scrollable_scroll(obj->widget_object, rect, EINA_TRUE); + evas_object_smart_callback_call(circle_obj->main_obj, "index,state,change", widget_data->index_selected_item->item); + elm_object_part_text_set(widget_data->index_layout, "elm.text", widget_data->index_selected_item->letter); } else + elm_object_part_text_set(widget_data->index_layout, "elm.text", ""); +//ONEUI1.5(25Feb2019): Update based on 2019 watch access UX + if (elm_atspi_bridge_utils_is_screen_reader_enabled() && widget_data->index_selected_item && widget_data->access_object) { - rect.y = pos.y - 30; - efl_ui_scrollable_scroll(obj->widget_object, rect, EINA_TRUE); + char *first_text; + Eina_Strbuf *buf; + + buf = eina_strbuf_new(); + eina_strbuf_append(buf, widget_data->index_selected_item->letter); + eina_strbuf_append(buf, ", "); + eina_strbuf_append(buf, _("WDS_TTS_TBOPT_INDEX_SCROLL")); + first_text = eina_strbuf_string_steal(buf); + eina_strbuf_free(buf); + elm_atspi_accessible_name_set(widget_data->access_object, first_text); + Eext_Rotary_Event_Type _rotary_event_type = eext_rotary_event_type_get(); + if (_rotary_event_type == EEXT_ROTARY_EVENT_TYPE_HW_BEZEL) + elm_atspi_accessible_description_set(widget_data->access_object, _("WDS_TTS_TBBODY_ROTATE_BEZEL_TO_SEARCH_INDEX")); + else if (_rotary_event_type == EEXT_ROTARY_EVENT_TYPE_SW_BEZEL && eext_rotary_event_is_enabled()) + elm_atspi_accessible_description_set(widget_data->access_object, _("WDS_ACCS_TBBODY_SWIPE_THE_BEZEL_TO_SEARCH_THE_INDEX")); + else + elm_atspi_accessible_description_set(widget_data->access_object, _("WDS_ACCS_TBBODY_SWIPE_UP_OR_DOWN_TO_JUMP_TO_NEXT_LETTER_OF_THE_ALPHABET")); + + elm_atspi_component_highlight_grab(widget_data->access_object); + hide_time = ROTARY_PHASE_N4; } +// + widget_data->index_hide_timer = ecore_timer_add(hide_time, _eext_circle_object_genlist_index_hide_timer_cb, circle_obj); } } static Eina_Bool -_rotary_changed_cb(void *data, Evas_Object *obj, Eext_Rotary_Event_Info *info) +_eext_circle_object_genlist_index_selected_item_update(Eext_Circle_Object_Genlist_Data *widget_data, + Eina_Bool next) { - Eext_Circle_Object *circle_obj = data; + Eext_Circle_Object_Genlist_Index_Item *index_item; + Elm_Object_Item *genlist_item; + Eina_List *l; - if (circle_obj->is_propagated) + if (!widget_data->index_selected_item) { - circle_obj->is_propagated = EINA_FALSE; + if (next) + genlist_item = elm_genlist_item_next_get(widget_data->current_item); + else + genlist_item = elm_genlist_item_prev_get(widget_data->current_item); - return EINA_TRUE; + while (genlist_item) + { + EINA_LIST_FOREACH(widget_data->index_item_list, l, index_item) + { + if (index_item->item == genlist_item) + { + widget_data->index_selected_item = index_item; + return EINA_TRUE; + } + } + + if (next) + genlist_item = elm_genlist_item_next_get(genlist_item); + else + genlist_item = elm_genlist_item_prev_get(genlist_item); + } } - if (obj == circle_obj->main_obj) - circle_obj->is_propagated = EINA_TRUE; - if (info->direction == EEXT_ROTARY_DIRECTION_CLOCKWISE) - _eext_circle_object_genlist_region_show(circle_obj, EINA_TRUE); else - _eext_circle_object_genlist_region_show(circle_obj, EINA_FALSE); + { + Eina_Bool found = EINA_FALSE; - _eext_circle_object_genlist_scrollbar_update(circle_obj); - _eext_circle_object_genlist_scrollbar_show(circle_obj, - VERTICAL_BAR_HIDE_WAITTING_TIME_ON_INITIALIZING); + if (next) + { + EINA_LIST_FOREACH(widget_data->index_item_list, l, index_item) + { + if (widget_data->index_selected_item == index_item) + { + found = EINA_TRUE; + continue; + } + + if (found) + { + widget_data->index_selected_item = index_item; + return EINA_TRUE; + } + } + } + else + { + EINA_LIST_REVERSE_FOREACH(widget_data->index_item_list, l, index_item) + { + if (widget_data->index_selected_item == index_item) + { + found = EINA_TRUE; + continue; + } + + if (found) + { + widget_data->index_selected_item = index_item; + return EINA_TRUE; + } + } + } + } - return EINA_TRUE; + return EINA_FALSE; } static void -_eext_circle_object_genlist_scrollbar_update(Eext_Circle_Object *obj) +_eext_circle_object_genlist_index_selected_item_region_show(Eext_Circle_Object *obj) { - Eext_Circle_Object_Item *item; - Evas_Coord ch; /* content h */ - Evas_Coord py, vh; /* postion y, viewport h*/ - double ratio; - double bar_pos_y = VERTICAL_BAR_ANGLE_START; - double bar_size_y = VERTICAL_BAR_ANGLE_RANGE; - double vertical_bar_angle_range = VERTICAL_BAR_ANGLE_RANGE; + EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(obj, widget_data) return; + if (!widget_data->index_selected_item) return; - if (!obj) return; + elm_genlist_item_show(widget_data->index_selected_item->item, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE); +} - item = _eext_circle_object_item_get(obj, GENLIST_ITEM_NAME); +static void +_eext_circle_object_genlist_region_show(Eext_Circle_Object *circle_obj, + Eina_Bool clockwise) +{ + EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return; - Eina_Size2D size; - Eina_Rect rect; - Eina_Position2D pos; + Elm_Object_Item *next_item = NULL; + Evas_Coord x = 0, y = 0, w = 0, h = 0; + Evas_Coord ch = 0, scroll_y = 0; + Eina_Bool loop_v = EINA_FALSE; - //C# FIXME: Optimize the code - ch = 0; - size.w = size.h = 0; - rect.x = rect.y = rect.w = rect.h = 0; - pos.x = pos.y = 0; + elm_scroller_loop_get(circle_obj->widget_object, NULL, &loop_v); - if (efl_isa(obj->widget_object, EFL_UI_LEGACY_INTERFACE)) - { - elm_scroller_child_size_get(obj->widget_object, NULL, &ch); - elm_scroller_region_get(obj->widget_object, NULL, &py, NULL, &vh); - } - else - { - size = efl_ui_scrollable_content_size_get(obj->widget_object); - rect = efl_ui_scrollable_viewport_geometry_get(obj->widget_object); - pos = efl_ui_scrollable_content_pos_get(obj->widget_object); - } + elm_scroller_child_size_get(circle_obj->widget_object, NULL, &ch); + elm_scroller_region_get(circle_obj->widget_object, &x, &y, &w, &h); - if (ch > 0) + if (!elm_object_scroll_item_align_enabled_get(circle_obj->widget_object)) { - ratio = (double)ch / (double)vh; - - if (ratio == 0) return; + if (h >= ch) return; - if (ch > vh) + if (widget_data->policy_v != ELM_SCROLLER_POLICY_OFF && !widget_data->scrollbar_first_shown) { - bar_size_y = vertical_bar_angle_range / ratio; + _eext_circle_object_genlist_scrollbar_first_show_cb(circle_obj); + if (widget_data->change_flag_timer) + { + ecore_timer_del(widget_data->change_flag_timer); + widget_data->change_flag_timer = NULL; + } + widget_data->scrollbar_initializing = EINA_FALSE; + } - if (bar_size_y > VERTICAL_BAR_ANGLE_MAX_SIZE) - bar_size_y = VERTICAL_BAR_ANGLE_MAX_SIZE; - if (bar_size_y < VERTICAL_BAR_ANGLE_MIN_SIZE) - bar_size_y = VERTICAL_BAR_ANGLE_MIN_SIZE; + if (clockwise) + { + if (y < widget_data->dest_y) + scroll_y = y + (widget_data->dest_y - y) + (h * DETENT_SCROLL_DISTANCE_RATE); + else + scroll_y = y + h * DETENT_SCROLL_DISTANCE_RATE; + + if (scroll_y > ch - h) + scroll_y = ch - h; + if (scroll_y == y) + edje_object_signal_emit(elm_layout_edje_get(circle_obj->widget_object), SIGNAL_EDGE_BOTTOM_ROTARY_DETENTED, "elm"); + } + else + { + if (y > 0) + { + if (y > widget_data->dest_y) + scroll_y = y - (y - widget_data->dest_y) - (h * DETENT_SCROLL_DISTANCE_RATE); + else + scroll_y = y - h * DETENT_SCROLL_DISTANCE_RATE; + + if (scroll_y < 0) + scroll_y = 0; + } + else + edje_object_signal_emit(elm_layout_edje_get(circle_obj->widget_object), SIGNAL_EDGE_TOP_ROTARY_DETENTED, "elm"); } - bar_pos_y += (double)py / ch * vertical_bar_angle_range; - _eext_circle_object_item_angle_set(item, bar_size_y); - _eext_circle_object_item_angle_offset_set(item, bar_pos_y); + widget_data->dest_y = scroll_y; + elm_scroller_region_bring_in(circle_obj->widget_object, x, scroll_y, w, h); + return; } - else if (size.h > 0) - { - ratio = (double)size.h / (double)rect.h; - if (ratio == 0) return; + next_item = widget_data->current_item; - if (size.h > rect.h) - { - bar_size_y = vertical_bar_angle_range / ratio; + if (!next_item) return; + //ONEUI1.5(15Oct2019): Finger scroll is possible when ch > h and in loop case + // bezel scroll have to be supported to be in sync with + // finger scroll behaviour + if (!loop_v && ch < h + elm_config_finger_size_get()) return; + else if (loop_v && (ch < h)) return; + // - if (bar_size_y > VERTICAL_BAR_ANGLE_MAX_SIZE) - bar_size_y = VERTICAL_BAR_ANGLE_MAX_SIZE; - if (bar_size_y < VERTICAL_BAR_ANGLE_MIN_SIZE) - bar_size_y = VERTICAL_BAR_ANGLE_MIN_SIZE; + if (clockwise) + { + Elm_Object_Item *last_item = elm_genlist_last_item_get(circle_obj->widget_object); + if ((y + h + elm_config_finger_size_get()) >= ch && !loop_v) + { + edje_object_signal_emit(elm_layout_edje_get(circle_obj->widget_object), SIGNAL_EDGE_BOTTOM_ROTARY_DETENTED, "elm"); + return; + } + else + { + if (next_item != last_item) + next_item = elm_genlist_item_next_get(next_item); + else if (loop_v) + next_item = elm_genlist_first_item_get(circle_obj->widget_object); + } + } + else + { + Elm_Object_Item *first_item = elm_genlist_first_item_get(circle_obj->widget_object); + if (y > (elm_config_finger_size_get() * -1) && y < elm_config_finger_size_get() && !loop_v) + { + edje_object_signal_emit(elm_layout_edje_get(circle_obj->widget_object), SIGNAL_EDGE_TOP_ROTARY_DETENTED, "elm"); + return; + } + else + { + if (next_item != first_item) + next_item = elm_genlist_item_prev_get(next_item); + else if (loop_v) + next_item = elm_genlist_last_item_get(circle_obj->widget_object); } - bar_pos_y += (double)pos.y / size.h * vertical_bar_angle_range; + } + + if (!next_item) return; - _eext_circle_object_item_angle_set(item, bar_size_y); - _eext_circle_object_item_angle_offset_set(item, bar_pos_y); + if (next_item != widget_data->current_item) + { + elm_genlist_item_bring_in(next_item, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE); } } -static void -_eext_circle_object_genlist_realized_cb(void *data, - Evas_Object *obj, - void *event_info) +static Eext_Circle_Object_Genlist_Rotary_Time * +_eext_circle_object_genlist_rotary_time_new(double time) { - Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data; - - EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return; + Eext_Circle_Object_Genlist_Rotary_Time *rotary_time = calloc(1, sizeof(Eext_Circle_Object_Genlist_Rotary_Time)); - if (widget_data->policy_v == ELM_SCROLLER_POLICY_OFF) return; + if (rotary_time) + rotary_time->time = time; - _eext_circle_object_genlist_scrollbar_update(circle_obj); + return rotary_time; } static void -_eext_circle_object_genlist_color_changed_cb(Eext_Circle_Object *obj, const char *item_name) +_eext_circle_object_genlist_index_scroll_phase_update(Eext_Circle_Object_Genlist_Data *widget_data) { - Eext_Circle_Object_Item *item; - int r, g, b, a; + if(!widget_data->index_item_list) return; - EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(obj, widget_data) return; + Eext_Circle_Object_Genlist_Rotary_Time *rotary_time; + double current_time, start_time; + double reset_time = ROTARY_PHASE_N3; - item = _eext_circle_object_item_get(obj, item_name); - if (!item) return; + if (elm_atspi_bridge_utils_is_screen_reader_enabled()) + { + reset_time = ROTARY_PHASE_N4; + } - _eext_circle_object_item_color_get(item, &r, &g, &b, &a); + current_time = ecore_time_get(); - if (!strcmp(item_name, GENLIST_ITEM_NAME)) + if ((current_time - widget_data->last_time) > reset_time) { - widget_data->color.r = r; - widget_data->color.g = g; - widget_data->color.b = b; - widget_data->color.a = a; + EINA_LIST_FREE(widget_data->rotary_times, rotary_time) + free(rotary_time); - return; + widget_data->rotary_count = 0.0; + widget_data->current_phase = 0; } - if (!strcmp(item_name, GENLIST_BG_ITEM_NAME)) + widget_data->last_time = current_time; + + if (widget_data->current_phase == 0) { - widget_data->bg_color.r = r; - widget_data->bg_color.g = g; - widget_data->bg_color.b = b; - widget_data->bg_color.a = a; + rotary_time = _eext_circle_object_genlist_rotary_time_new(current_time); + widget_data->rotary_times = eina_list_append(widget_data->rotary_times, rotary_time); + widget_data->rotary_count += 1; - return; + if (widget_data->rotary_count > ROTARY_PHASE_N2) + { + rotary_time = eina_list_data_get(widget_data->rotary_times); + free(rotary_time); + + widget_data->rotary_times = eina_list_remove_list(widget_data->rotary_times, + widget_data->rotary_times); + } + + if (widget_data->rotary_count >= ROTARY_PHASE_N2) + { + rotary_time = eina_list_data_get(widget_data->rotary_times); + start_time = rotary_time->time; + + if ((current_time - start_time) < ROTARY_PHASE_N1) + { + EINA_LIST_FREE(widget_data->rotary_times, rotary_time) + free(rotary_time); + + // Current time is saved and used for checking delay in next phase + rotary_time = _eext_circle_object_genlist_rotary_time_new(current_time); + widget_data->rotary_times = eina_list_append(widget_data->rotary_times, rotary_time); + widget_data->current_phase = 1; + widget_data->rotary_count = 0; + + } + } + } + else if (widget_data->current_phase == 1) + { + EINA_LIST_FREE(widget_data->rotary_times, rotary_time) + free(rotary_time); + + rotary_time = _eext_circle_object_genlist_rotary_time_new(current_time); + widget_data->rotary_times = eina_list_append(widget_data->rotary_times, rotary_time); + widget_data->rotary_count += 1; } } +static void +_eext_circle_object_genlist_index_drag_cb(void *data, Evas_Object *obj, + void *event_info) +{ + Eext_Circle_Object *circle_obj = data; + EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return; + + _eext_circle_object_genlist_index_hide(circle_obj); +} + static Eina_Bool -_eext_circle_object_genlist_scrollbar_policy_hide_cb(void *data) +_rotary_changed_cb(void *data, + Evas_Object *obj, + Eext_Rotary_Event_Info *info) { - Eext_Circle_Object *obj = (Eext_Circle_Object *)data; - Eext_Circle_Object_Item *item; - Eina_List *l; + Eina_Bool clockwise; + unsigned int time_stamp_diff; + + Eext_Circle_Object *circle_obj = data; + EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return EINA_TRUE; + + Eina_Bool loop_v = EINA_FALSE; - EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(obj, widget_data) return ECORE_CALLBACK_CANCEL; + elm_scroller_loop_get(circle_obj->widget_object, NULL, &loop_v); - if (widget_data->realized_callback_added) + if (circle_obj->is_propagated) { - evas_object_smart_callback_del_full(obj->widget_object, "realized", _eext_circle_object_genlist_realized_cb, obj); - widget_data->realized_callback_added = EINA_FALSE; + circle_obj->is_propagated = EINA_FALSE; + + return EINA_TRUE; } + //ONEUI1.5(04July2019): Support different color with bezel + if (__elm_product_theme_is_loaded()) + widget_data->bezel_on = EINA_TRUE; + // - EINA_LIST_FOREACH(obj->items, l, item) + if (obj == circle_obj->main_obj) { - _eext_circle_object_item_color_transit_set(item, VERTICAL_BAR_TRANSIT_TIME, - 0, 0, 0, 0, - EINA_TRUE, - 0.25, 0.46, 0.45, 1.0); + circle_obj->is_propagated = EINA_TRUE; } - if (widget_data->bar_hide_timer) + if (!widget_data->drag_callback_added && widget_data->index_layout) { - ecore_timer_del(widget_data->bar_hide_timer); - widget_data->bar_hide_timer = NULL; + evas_object_smart_callback_add(circle_obj->widget_object, "drag", _eext_circle_object_genlist_index_drag_cb, circle_obj); + widget_data->drag_callback_added = EINA_TRUE; } - return ECORE_CALLBACK_CANCEL; -} + time_stamp_diff = info->time_stamp - widget_data->latest_time_stamp; + if (time_stamp_diff > ROTARY_EVENT_TIME_STAMP_THRESHOLD || !widget_data->current_item) + { + Evas_Coord ox, oy, ow, oh; + evas_object_geometry_get(circle_obj->widget_object, &ox, &oy, &ow, &oh); + widget_data->current_item = elm_genlist_at_xy_item_get(circle_obj->widget_object, ox + ow/2, oy + oh/2, NULL); + if (!elm_object_scroll_item_align_enabled_get(circle_obj->widget_object)) + { + Evas_Coord y; + elm_scroller_region_get(circle_obj->widget_object, NULL, &y, NULL, NULL); + widget_data->dest_y = y; + } + if (loop_v && !widget_data->current_item) + widget_data->current_item = elm_genlist_first_item_get(circle_obj->widget_object); + widget_data->detent_count = 0; + //ONEUI1.5(25Oct2019): Logs for genlist rotary operation + LOGE("obj (%p) current_item (%p) direction (%d)", obj, widget_data->current_item, info->direction); + // + } -static void -_eext_circle_object_genlist_scrollbar_show(Eext_Circle_Object *obj, - double hide_waiting_time) -{ - Eext_Circle_Object_Item *item; + if (elm_object_scroll_item_align_enabled_get(circle_obj->widget_object) && loop_v && + (abs(widget_data->detent_count) >= elm_genlist_items_count(circle_obj->widget_object) / 2)) + return EINA_TRUE; - EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(obj, widget_data) return; + widget_data->latest_time_stamp = info->time_stamp; - if (widget_data->realized_callback_added) + if (info->direction == EEXT_ROTARY_DIRECTION_CLOCKWISE) { - evas_object_smart_callback_del_full(obj->widget_object, "realized", _eext_circle_object_genlist_realized_cb, obj); - widget_data->realized_callback_added = EINA_FALSE; + clockwise = EINA_TRUE; + widget_data->detent_count++; } - - if (widget_data->bar_hide_timer) + else { - ecore_timer_del(widget_data->bar_hide_timer); - widget_data->bar_hide_timer = NULL; + clockwise = EINA_FALSE; + widget_data->detent_count--; } - item = _eext_circle_object_item_get(obj, GENLIST_BG_ITEM_NAME); - if (obj->disabled) - _eext_circle_object_item_color_set(item, - widget_data->disabled_bg_color.r, - widget_data->disabled_bg_color.g, - widget_data->disabled_bg_color.b, - widget_data->disabled_bg_color.a); - else - _eext_circle_object_item_color_set(item, - widget_data->bg_color.r, - widget_data->bg_color.g, - widget_data->bg_color.b, - widget_data->bg_color.a); - - item = _eext_circle_object_item_get(obj, GENLIST_ITEM_NAME); - if (obj->disabled) - _eext_circle_object_item_color_set(item, - widget_data->disabled_color.r, - widget_data->disabled_color.g, - widget_data->disabled_color.b, - widget_data->disabled_color.a); - else - _eext_circle_object_item_color_set(item, - widget_data->color.r, - widget_data->color.g, - widget_data->color.b, - widget_data->color.a); + _eext_circle_object_genlist_index_scroll_phase_update(widget_data); - if (widget_data->policy_v == ELM_SCROLLER_POLICY_AUTO) + if ((widget_data->current_phase == 1) && widget_data->index_item_list && + _eext_circle_object_genlist_index_selected_item_update(widget_data, clockwise)) { - widget_data->bar_hide_timer = ecore_timer_add(hide_waiting_time, - _eext_circle_object_genlist_scrollbar_policy_hide_cb, - obj); + _eext_circle_object_genlist_index_show(circle_obj); + _eext_circle_object_genlist_index_selected_item_region_show(circle_obj); + } + else if (widget_data->current_phase == 1) + { + _eext_circle_object_genlist_index_hide(circle_obj); + } + + if (widget_data->current_phase == 0) + { + widget_data->index_selected_item = NULL; + _eext_circle_object_genlist_region_show(circle_obj, clockwise); } + + return EINA_TRUE; } static void -_eext_circle_object_genlist_show_cb(void *data, - Evas *e, - Evas_Object *obj, - void *event_info) +_eext_circle_object_genlist_items_index_clear_internal(Eext_Circle_Object *circle_obj) { - Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data; + Eext_Circle_Object_Genlist_Index_Item *index_item; EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return; - if (widget_data->policy_v == ELM_SCROLLER_POLICY_OFF) return; - - _eext_circle_object_genlist_scrollbar_update(circle_obj); - _eext_circle_object_genlist_scrollbar_show(circle_obj, - VERTICAL_BAR_HIDE_WAITTING_TIME_ON_INITIALIZING); - if (!widget_data->realized_callback_added) + if (widget_data->index_item_list) { - evas_object_smart_callback_add(circle_obj->widget_object, "realized", _eext_circle_object_genlist_realized_cb, circle_obj); - widget_data->realized_callback_added = EINA_TRUE; + EINA_LIST_FREE(widget_data->index_item_list, index_item) + { + eina_stringshare_del(index_item->letter); + index_item->letter = NULL; + free(index_item); + } } + + widget_data->index_item_list = NULL; + widget_data->index_selected_item = NULL; } static void -_eext_circle_object_genlist_scroll_cb(void *data, - Evas_Object *obj, - void *event_info) +_update_color_info(Eext_Circle_Object *obj) { - Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data; - - EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return; - - if (widget_data->policy_v == ELM_SCROLLER_POLICY_OFF) return; + EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(obj, widget_data) return; + int r, g, b, a; - _eext_circle_object_genlist_scrollbar_update(circle_obj); - _eext_circle_object_genlist_scrollbar_show(circle_obj, - VERTICAL_BAR_HIDE_WAITTING_TIME); + if (!edje_object_color_class_get(elm_layout_edje_get(obj->widget_object), + widget_data->scrollbar_color_class, + &r, &g, &b, &a, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)) + { + r = SCROLL_BAR_COLOR_R; + g = SCROLL_BAR_COLOR_G; + b = SCROLL_BAR_COLOR_B; + a = SCROLL_BAR_COLOR_A; + } + widget_data->color.r = r; + widget_data->color.g = g; + widget_data->color.b = b; + widget_data->color.a = a; + + if (!edje_object_color_class_get(elm_layout_edje_get(obj->widget_object), + widget_data->scrollbar_bg_color_class, + &r, &g, &b, &a, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)) + { + r = SCROLL_BAR_BG_COLOR_R; + g = SCROLL_BAR_BG_COLOR_G; + b = SCROLL_BAR_BG_COLOR_B; + a = SCROLL_BAR_BG_COLOR_A; + } + widget_data->bg_color.r = r; + widget_data->bg_color.g = g; + widget_data->bg_color.b = b; + widget_data->bg_color.a = a; + + if (!edje_object_color_class_get(elm_layout_edje_get(obj->widget_object), + widget_data->bezel_scrollbar_color_class, + &r, &g, &b, &a, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)) + { + r = SCROLL_BAR_COLOR_R; + g = SCROLL_BAR_COLOR_G; + b = SCROLL_BAR_COLOR_B; + a = SCROLL_BAR_COLOR_A; + } + widget_data->bezel_color.r = r; + widget_data->bezel_color.g = g; + widget_data->bezel_color.b = b; + widget_data->bezel_color.a = a; } static void -_scroll_cb(void *data EINA_UNUSED, const Efl_Event *ev) +_eext_circle_object_genlist_bg_color_set(Eext_Circle_Object *circle_obj) { - Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data; - EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return; - - if (widget_data->policy_v == ELM_SCROLLER_POLICY_OFF) return; - - _eext_circle_object_genlist_scrollbar_update(circle_obj); - _eext_circle_object_genlist_scrollbar_show(circle_obj, - VERTICAL_BAR_HIDE_WAITTING_TIME); + int a; + + edje_object_color_class_get(elm_layout_edje_get(circle_obj->widget_object), + widget_data->scrollbar_bg_color_class, + &widget_data->bg_color.r, + &widget_data->bg_color.g, + &widget_data->bg_color.b, + &widget_data->bg_color.a, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); + + //ONEUI1.5(31July2019): Fix VI effect logic about hide + _eext_circle_object_item_color_get(widget_data->bg_item, NULL, NULL, NULL, &a); + if (!a) + { + _eext_circle_object_item_color_set(widget_data->bg_item, + widget_data->bg_color.r, + widget_data->bg_color.g, + widget_data->bg_color.b, + 0); + } + else + { + // + _eext_circle_object_item_color_set(widget_data->bg_item, + widget_data->bg_color.r, + widget_data->bg_color.g, + widget_data->bg_color.b, + widget_data->bg_color.a); + } } static void -_eext_circle_object_genlist_del_cb(Eext_Circle_Object *obj) +_eext_circle_object_genlist_line_color_set(Eext_Circle_Object *circle_obj) { - EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(obj, widget_data) return; - - evas_object_event_callback_del_full(obj->widget_object, EVAS_CALLBACK_SHOW, _eext_circle_object_genlist_show_cb, obj); - evas_object_smart_callback_del_full(obj->widget_object, "scroll", _eext_circle_object_genlist_scroll_cb, obj); - - if (widget_data->realized_callback_added) + EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return; + int a; + + edje_object_color_class_get(elm_layout_edje_get(circle_obj->widget_object), + widget_data->scrollbar_color_class, + &widget_data->color.r, + &widget_data->color.g, + &widget_data->color.b, + &widget_data->color.a, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); + + //ONEUI1.5(31July2019): Fix VI effect logic about hide + _eext_circle_object_item_color_get(widget_data->item, NULL, NULL, NULL, &a); + if (!a) { - evas_object_smart_callback_del_full(obj->widget_object, "realized", _eext_circle_object_genlist_realized_cb, obj); - widget_data->realized_callback_added = EINA_FALSE; + _eext_circle_object_item_color_set(widget_data->item, + widget_data->color.r, + widget_data->color.g, + widget_data->color.b, + 0); } - - if (widget_data->bar_hide_timer) + else { - ecore_timer_del(widget_data->bar_hide_timer); - widget_data->bar_hide_timer = NULL; + // + _eext_circle_object_item_color_set(widget_data->item, + widget_data->color.r, + widget_data->color.g, + widget_data->color.b, + widget_data->color.a); } +} - free(obj->widget_data); - obj->widget_data = NULL; +static void +_eext_circle_object_genlist_change_color_signal_cb(void *data, + Evas_Object *widget_obj, + const char *emission, + const char *source) +{ + Eext_Circle_Object *circle_obj = data; + EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return; + if (!source) return; - eext_rotary_object_event_callback_del(obj->widget_object, _rotary_changed_cb); + //ONEUI1.5(04July2019): Support different color with bezel + if (widget_data->bezel_scrollbar_color_class && !strcmp(source, widget_data->bezel_scrollbar_color_class)) + { + edje_object_color_class_get(elm_layout_edje_get(circle_obj->widget_object), + widget_data->bezel_scrollbar_color_class, + &widget_data->bezel_color.r, + &widget_data->bezel_color.g, + &widget_data->bezel_color.b, + &widget_data->bezel_color.a, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); + } + // + else if (widget_data->scrollbar_bg_color_class && !strcmp(source, widget_data->scrollbar_bg_color_class)) + _eext_circle_object_genlist_bg_color_set(circle_obj); + else if (widget_data->scrollbar_color_class && !strcmp(source, widget_data->scrollbar_color_class)) + _eext_circle_object_genlist_line_color_set(circle_obj); } static void -_eext_circle_object_genlist_disabled_cb(Eext_Circle_Object *obj) +//ONEUI1.5(13Aug2019): Update circle scrollbar size on item processing +//_eext_circle_object_genlist_scrollbar_update(Eext_Circle_Object *circle_obj) +_eext_circle_object_genlist_scrollbar_update(Eext_Circle_Object *circle_obj, Eina_Bool anim) +// { - Eext_Circle_Object_Item *item; + Evas_Coord ch = 0, py = 0, vh = 0; /* content h postion y, viewport h */ + double ratio = 0.0; + double bar_pos_y; + double vertical_bar_angle_range = VERTICAL_BAR_ANGLE_RANGE; + + if (!circle_obj) return; + EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return; + + if (widget_data->handler && circle_obj->surface->is_mirrored) + bar_pos_y = VERTICAL_BAR_ANGLE_START + VERTICAL_BAR_ANGLE_MAX_SIZE; + else + bar_pos_y = VERTICAL_BAR_ANGLE_START; + elm_scroller_child_size_get(circle_obj->widget_object, NULL, &ch); + elm_scroller_region_get(circle_obj->widget_object, NULL, &py, NULL, &vh); - EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(obj, data) return; + if (ch < vh + elm_config_finger_size_get()) + { + widget_data->bar_size_y = 0; + _eext_circle_object_item_color_set(widget_data->item, 0, 0, 0, 0); + _eext_circle_object_item_color_set(widget_data->bg_item, 0, 0, 0, 0); + return; + } + ratio = (double)ch / (double)vh; - if (obj->disabled) + if (ch > vh) { - item = _eext_circle_object_item_get(obj, GENLIST_ITEM_NAME); - _eext_circle_object_item_color_set(item, - data->disabled_color.r, - data->disabled_color.g, - data->disabled_color.b, - data->disabled_color.a); + if (widget_data->handler) + { + widget_data->bar_size_y = VERTICAL_BAR_ANGLE_HANDLER_SIZE; + } + else + { + widget_data->bar_size_y = vertical_bar_angle_range / ratio; - item = _eext_circle_object_item_get(obj, GENLIST_BG_ITEM_NAME); - _eext_circle_object_item_color_set(item, - data->disabled_bg_color.r, - data->disabled_bg_color.g, - data->disabled_bg_color.b, - data->disabled_bg_color.a); + if (widget_data->bar_size_y > VERTICAL_BAR_ANGLE_MAX_SIZE) + widget_data->bar_size_y = VERTICAL_BAR_ANGLE_MAX_SIZE; + if (widget_data->bar_size_y < VERTICAL_BAR_ANGLE_MIN_SIZE) + widget_data->bar_size_y = VERTICAL_BAR_ANGLE_MIN_SIZE; + } - eext_rotary_object_event_callback_del(obj->widget_object, _rotary_changed_cb); - eext_rotary_object_event_callback_del(obj->main_obj, _rotary_changed_cb); + if (widget_data->handler && circle_obj->surface->is_mirrored) + bar_pos_y -= ((VERTICAL_BAR_ANGLE_MAX_SIZE - widget_data->bar_size_y) * py / (ch - vh)); + else + bar_pos_y += (VERTICAL_BAR_ANGLE_MAX_SIZE - widget_data->bar_size_y) * py / (ch - vh); } - else + if (widget_data->handler) { - item = _eext_circle_object_item_get(obj, GENLIST_ITEM_NAME); - _eext_circle_object_item_color_set(item, - data->color.r, - data->color.g, - data->color.b, - data->color.a); - - item = _eext_circle_object_item_get(obj, GENLIST_BG_ITEM_NAME); - _eext_circle_object_item_color_set(item, - data->bg_color.r, - data->bg_color.g, - data->bg_color.b, - data->bg_color.a); - - 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); - } -} - -static void -_eext_circle_object_genlist_init(Eext_Circle_Object *obj, Evas_Object *genlist) -{ - Eext_Circle_Object_Genlist_Data *data; - Eext_Circle_Object_Item *item; - - obj->widget_type = EEXT_CIRCLE_OBJECT_GENLIST_TYPE; - obj->del_func = _eext_circle_object_genlist_del_cb; - obj->disabled_func = _eext_circle_object_genlist_disabled_cb; - obj->color_changed_func = _eext_circle_object_genlist_color_changed_cb; - obj->mirrored_state = EEXT_CIRCLE_MIRRORED_CONFIG; - - data = (Eext_Circle_Object_Genlist_Data *)calloc(1, sizeof(Eext_Circle_Object_Genlist_Data)); - data->policy_v = ELM_SCROLLER_POLICY_AUTO; - data->color.r = SCROLL_BAR_COLOR_R; - data->color.g = SCROLL_BAR_COLOR_G; - data->color.b = SCROLL_BAR_COLOR_B; - data->color.a = SCROLL_BAR_COLOR_A; - data->bg_color.r = SCROLL_BAR_BG_COLOR_R; - data->bg_color.g = SCROLL_BAR_BG_COLOR_G; - data->bg_color.b = SCROLL_BAR_BG_COLOR_B; - data->bg_color.a = SCROLL_BAR_BG_COLOR_A; - data->disabled_color.r = SCROLL_BAR_COLOR_DISABLED_R; - data->disabled_color.g = SCROLL_BAR_COLOR_DISABLED_G; - data->disabled_color.b = SCROLL_BAR_COLOR_DISABLED_B; - data->disabled_color.a = SCROLL_BAR_COLOR_DISABLED_A; - data->disabled_bg_color.r = SCROLL_BAR_BG_COLOR_DISABLED_R; - data->disabled_bg_color.g = SCROLL_BAR_BG_COLOR_DISABLED_G; - data->disabled_bg_color.b = SCROLL_BAR_BG_COLOR_DISABLED_B; - data->disabled_bg_color.a = SCROLL_BAR_BG_COLOR_DISABLED_A; - obj->widget_data = (void *)data; - - item = _eext_circle_object_item_new(); - _eext_circle_object_item_name_set(item, GENLIST_BG_ITEM_NAME); - _eext_circle_object_item_color_set(item, - data->bg_color.r, - data->bg_color.g, - data->bg_color.b, - data->bg_color.a); - _eext_circle_object_item_line_width_set(item, VERTICAL_BAR_WIDTH_SIZE); - _eext_circle_object_item_radius_set(item, VERTICAL_BAR_RADIUS_SIZE); - _eext_circle_object_item_angle_set(item, VERTICAL_BAR_ANGLE_RANGE); - _eext_circle_object_item_angle_offset_set(item, VERTICAL_BAR_ANGLE_START); - _eext_circle_object_item_round_cap_enable_set(item, EINA_TRUE); - _eext_circle_object_item_append(obj, item); - - item = _eext_circle_object_item_new(); - _eext_circle_object_item_name_set(item, GENLIST_ITEM_NAME); - _eext_circle_object_item_color_set(item, - data->color.r, - data->color.g, - data->color.b, - data->color.a); - _eext_circle_object_item_line_width_set(item, VERTICAL_BAR_WIDTH_SIZE); - _eext_circle_object_item_radius_set(item, VERTICAL_BAR_RADIUS_SIZE); - _eext_circle_object_item_angle_offset_set(item, VERTICAL_BAR_ANGLE_START); - _eext_circle_object_item_round_cap_enable_set(item, EINA_TRUE); - _eext_circle_object_item_append(obj, item); - - if (efl_isa(obj->widget_object, EFL_UI_LEGACY_INTERFACE)) - { - elm_scroller_policy_set(obj->widget_object, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); - evas_object_event_callback_add(obj->widget_object, EVAS_CALLBACK_SHOW, _eext_circle_object_genlist_show_cb, obj); - evas_object_smart_callback_add(obj->widget_object, "scroll", _eext_circle_object_genlist_scroll_cb, obj); + Evas_Map *m = evas_map_new(4); + evas_map_util_points_populate_from_object(m, widget_data->handler_layout); + // layout is 90 degrees ahead so 90 needs to be subtracted here + if (widget_data->handler && circle_obj->surface->is_mirrored) + widget_data->handler_angle = bar_pos_y - 90 - VERTICAL_BAR_ANGLE_HANDLER_SIZE / 2; + else + widget_data->handler_angle = bar_pos_y - 90 + VERTICAL_BAR_ANGLE_HANDLER_SIZE / 2; + evas_map_util_rotate(m, widget_data->handler_angle, SURFACE_WIDTH / 2, SURFACE_WIDTH / 2); + evas_object_map_set(widget_data->handler_layout, m); + evas_object_map_enable_set(widget_data->handler_layout, EINA_TRUE); + evas_map_free(m); + evas_object_show(widget_data->handler_layout); } + + //ONEUI1.5(13Aug2019): Update circle scrollbar size on item processing + if (anim) + _eext_circle_object_item_angle_transit_set(widget_data->item, 0.2, + widget_data->bar_size_y, bar_pos_y, EINA_TRUE, + 0.0, 0.0, 1.0, 1.0); else { - efl_ui_scrollbar_bar_mode_set(obj->widget_object, EFL_UI_SCROLLBAR_MODE_OFF, EFL_UI_SCROLLBAR_MODE_OFF); - efl_event_callback_add(genlist, EFL_UI_EVENT_SCROLL_CHANGED, _scroll_cb, obj); + _eext_circle_object_item_angle_set(widget_data->item, widget_data->bar_size_y); + _eext_circle_object_item_angle_offset_set(widget_data->item, bar_pos_y); } - - 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); + // } -EAPI Evas_Object * -eext_circle_object_genlist_add(Evas_Object *genlist, Eext_Circle_Surface *surface) +static void +_eext_circle_object_genlist_color_changed_cb(Eext_Circle_Object *circle_obj, + const char *item_name) { - Evas_Object *obj; + Eext_Circle_Object_Item *item = NULL; + int r = 0, g = 0, b = 0, a = 0; + EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return; + + item = _eext_circle_object_item_get(circle_obj, item_name); + if (!item) return; + + _eext_circle_object_item_color_get(item, &r, &g, &b, &a); + + if (!strcmp(item_name, GENLIST_ITEM_NAME)) + { + widget_data->color.r = r; + widget_data->color.g = g; + widget_data->color.b = b; + widget_data->color.a = a; + + return; + } + + if (!strcmp(item_name, GENLIST_BG_ITEM_NAME)) + { + widget_data->bg_color.r = r; + widget_data->bg_color.g = g; + widget_data->bg_color.b = b; + widget_data->bg_color.a = a; + + return; + } +} + +static Eina_Bool +_eext_circle_object_genlist_scrollbar_policy_hide_cb(void *data) +{ + Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data; + + EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return ECORE_CALLBACK_CANCEL; + + if (widget_data->handler) + { + elm_layout_signal_emit(widget_data->handler_layout, "elm,state,handler,hidden", "elm"); + } + else if (!widget_data->scrollbar_initializing) + { + if (widget_data->bar_size_y > 0.0) + { + //ONEUI1.5(31July2019): Fix VI effect logic about hide + if (widget_data->bezel_on) + { + _eext_circle_object_item_color_transit_set(widget_data->item, VERTICAL_BAR_TRANSIT_TIME, + widget_data->bezel_color.r, + widget_data->bezel_color.g, + widget_data->bezel_color.b, + 0, + EINA_TRUE, + 0.0, 0.0, 1.0, 1.0); + } + else + { + _eext_circle_object_item_color_transit_set(widget_data->item, VERTICAL_BAR_TRANSIT_TIME, + widget_data->color.r, + widget_data->color.g, + widget_data->color.b, + 0, + EINA_TRUE, + 0.0, 0.0, 1.0, 1.0); + } + _eext_circle_object_item_color_transit_set(widget_data->bg_item, VERTICAL_BAR_TRANSIT_TIME, + widget_data->bg_color.r, + widget_data->bg_color.g, + widget_data->bg_color.b, + 0, + EINA_TRUE, + 0.0, 0.0, 1.0, 1.0); + // + } + } + + if (widget_data->bar_hide_timer) + { + ecore_timer_del(widget_data->bar_hide_timer); + widget_data->bar_hide_timer = NULL; + } + + return ECORE_CALLBACK_CANCEL; +} + +static void +_eext_circle_object_genlist_scrollbar_showing(Eext_Circle_Object *circle_obj, + double hide_waiting_time) +{ + EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return; + + if (widget_data->bar_size_y <= 0) return; + widget_data->scrollbar_shown = EINA_TRUE; + + if (widget_data->handler) + { + elm_layout_signal_emit(widget_data->handler_layout, "elm,state,handler,visible", "elm"); + } + else + { + //ONEUI1.5(04July2019): Support different color with bezel + if (widget_data->bezel_on) + { + _eext_circle_object_item_color_transit_set(widget_data->item, SCROLL_BAR_TRANSIT_TIME, + widget_data->bezel_color.r, + widget_data->bezel_color.g, + widget_data->bezel_color.b, + widget_data->bezel_color.a, + EINA_TRUE, + 0.0, 0.0, 1.0, 1.0); + } + else + { + _eext_circle_object_item_color_transit_set(widget_data->item, SCROLL_BAR_TRANSIT_TIME, + widget_data->color.r, + widget_data->color.g, + widget_data->color.b, + widget_data->color.a, + EINA_TRUE, + 0.0, 0.0, 1.0, 1.0); + } + /* + _eext_circle_object_item_color_set(widget_data->item, + widget_data->color.r, + widget_data->color.g, + widget_data->color.b, + widget_data->color.a); + */ + // + _eext_circle_object_item_color_set(widget_data->bg_item, + widget_data->bg_color.r, + widget_data->bg_color.g, + widget_data->bg_color.b, + widget_data->bg_color.a); + } + + if (widget_data->bar_hide_timer) + { + ecore_timer_del(widget_data->bar_hide_timer); + widget_data->bar_hide_timer = NULL; + } + + if (!widget_data->handler_drag && widget_data->policy_v == ELM_SCROLLER_POLICY_AUTO) + { + widget_data->bar_hide_timer = ecore_timer_add(hide_waiting_time, + _eext_circle_object_genlist_scrollbar_policy_hide_cb, + circle_obj); + } +} + +static Eina_Bool +_eext_circle_object_genlist_scrollbar_first_show_cb(void *data) +{ + Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data; + Evas_Coord x = 0, y = 0, w = 0, h = 0; + + EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return EINA_FALSE; + + if (widget_data->bar_first_show_timer) + { + ecore_timer_del(widget_data->bar_first_show_timer); + widget_data->bar_first_show_timer = NULL; + } + + //ONEUI1.5(13Aug2019): Update circle scrollbar size on item processing + _eext_circle_object_genlist_scrollbar_update(circle_obj, EINA_FALSE); + // + _eext_circle_object_genlist_scrollbar_showing(circle_obj, VERTICAL_BAR_HIDE_WAITTING_TIME_ON_INITIALIZING); + + if (!elm_object_scroll_item_align_enabled_get(circle_obj->widget_object)) + { + elm_scroller_region_get(circle_obj->widget_object, &x, &y, &w, &h); + widget_data->dest_y = y; + } + + widget_data->scrollbar_first_shown = EINA_TRUE; + return ECORE_CALLBACK_CANCEL; +} + +static Eina_Bool +_eext_circle_object_genlist_change_flag_cb(void *data) +{ + Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data; + EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return EINA_FALSE; + + widget_data->scrollbar_initializing = EINA_FALSE; + + if (widget_data->change_flag_timer) + { + ecore_timer_del(widget_data->change_flag_timer); + widget_data->change_flag_timer = NULL; + } + + if (widget_data->policy_v == ELM_SCROLLER_POLICY_AUTO) + { + if (widget_data->bar_hide_timer) + { + ecore_timer_del(widget_data->bar_hide_timer); + widget_data->bar_hide_timer = NULL; + } + + widget_data->bar_hide_timer = ecore_timer_add(0.5, + _eext_circle_object_genlist_scrollbar_policy_hide_cb, + circle_obj); + } + + return ECORE_CALLBACK_CANCEL; +} + +static void +_eext_circle_object_genlist_scrollbar_show(Eext_Circle_Object *circle_obj) +{ + EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return; + + if (!widget_data->scrollbar_first_shown) + { + widget_data->scrollbar_initializing = EINA_TRUE; + widget_data->scrollbar_first_shown = EINA_FALSE; + + if (!widget_data->change_flag_timer) + widget_data->change_flag_timer = ecore_timer_add(1.5, _eext_circle_object_genlist_change_flag_cb, circle_obj); + if (!widget_data->bar_first_show_timer) + widget_data->bar_first_show_timer = ecore_timer_add(0.5, _eext_circle_object_genlist_scrollbar_first_show_cb, circle_obj); + } + else + { + //ONEUI1.5(13Aug2019): Update circle scrollbar size on item processing + _eext_circle_object_genlist_scrollbar_update(circle_obj, EINA_FALSE); + // + _eext_circle_object_genlist_scrollbar_showing(circle_obj, VERTICAL_BAR_HIDE_WAITTING_TIME); + } +} + +void +_eext_circle_object_genlist_init_scroller_info(Eext_Circle_Object *circle_obj) +{ + EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return; + + if (widget_data->bar_first_show_timer) + { + ecore_timer_del(widget_data->bar_first_show_timer); + widget_data->bar_first_show_timer = NULL; + } + if (widget_data->change_flag_timer) + { + ecore_timer_del(widget_data->change_flag_timer); + widget_data->change_flag_timer = NULL; + } + if (widget_data->bar_hide_timer) + { + ecore_timer_del(widget_data->bar_hide_timer); + widget_data->bar_hide_timer = NULL; + } + widget_data->scrollbar_initializing = EINA_FALSE; + + _eext_circle_object_item_color_set(widget_data->item, 0, 0, 0, 0); + _eext_circle_object_item_color_set(widget_data->bg_item, 0, 0, 0, 0); +} + +//ONEUI1.5(18FEB2019): Genlist resume/pause signal for scrollbar show +static void +_eext_circle_object_genlist_resume_cb(void *data, + Evas_Object *obj, + void *event_info) +{ +// + Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data; + + EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return; + + if (widget_data->scrollbar_initializing) return; + if (widget_data->scrollbar_first_shown) return; + widget_data->scrollbar_shown = EINA_FALSE; + + _eext_circle_object_genlist_init_scroller_info(circle_obj); + + if (widget_data->policy_v == ELM_SCROLLER_POLICY_OFF) return; + + _eext_circle_object_genlist_scrollbar_show(circle_obj); +} + +//ONEUI1.5(18FEB2019): Genlist resume/pause signal for scrollbar show +static void +_eext_circle_object_genlist_pause_cb(void *data, + Evas_Object *obj, + void *event_info) +{ +// + Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data; + + EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return; + widget_data->scrollbar_first_shown = EINA_FALSE; + + _eext_circle_object_genlist_init_scroller_info(circle_obj); +} + +static void +_eext_circle_object_genlist_scroll_cb(void *data, + Evas_Object *obj, + void *event_info) +{ + Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data; + + EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return; + + if (widget_data->policy_v == ELM_SCROLLER_POLICY_OFF) return; + + if (widget_data->scrollbar_first_shown) + _eext_circle_object_genlist_scrollbar_show(circle_obj); + //ONEUI1.5(19Jun2019): Enable sw/hw bezel + if (!eext_rotary_event_is_enabled()) + { + if (widget_data->index_shown_anim) + _eext_circle_object_genlist_index_show(circle_obj); + } +} + +static void +_eext_circle_object_genlist_scroll_anim_stop_cb(void *data, + Evas_Object *obj, + void *event_info) +{ + Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data; + Evas_Coord x = 0, y = 0, w = 0, h = 0; + + EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return; + //ONEUI1.5(19Jun2019): Enable sw/hw bezel + if (!eext_rotary_event_is_enabled()) + { + if (widget_data->index_shown_anim) + widget_data->index_shown_anim = EINA_FALSE; + } + if (widget_data->policy_v == ELM_SCROLLER_POLICY_OFF) return; + + if (!elm_object_scroll_item_align_enabled_get(circle_obj->widget_object)) + { + elm_scroller_region_get(circle_obj->widget_object, &x, &y, &w, &h); + widget_data->dest_y = y; + } +} + +static void +_eext_circle_object_genlist_loaded_cb(void *data, + Evas_Object *widget_obj, + void *event_info) +{ + Eext_Circle_Object *circle_obj = data; + EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return; + + if (widget_data->policy_v == ELM_SCROLLER_POLICY_OFF) + { + if (widget_data->bar_hide_timer) + { + ecore_timer_del(widget_data->bar_hide_timer); + widget_data->bar_hide_timer = NULL; + } + _eext_circle_object_genlist_scrollbar_policy_hide_cb(circle_obj); + } + else if (widget_data->policy_v == ELM_SCROLLER_POLICY_ON) + { + //ONEUI1.5(13Aug2019): Update circle scrollbar size on item processing + _eext_circle_object_genlist_scrollbar_update(circle_obj, EINA_TRUE); + // + _eext_circle_object_genlist_scrollbar_show(circle_obj); + } + //ONEUI1.5(13Aug2019): Update circle scrollbar size on item processing + else if (widget_data->policy_v == ELM_SCROLLER_POLICY_AUTO && widget_data->bar_hide_timer) + _eext_circle_object_genlist_scrollbar_update(circle_obj, EINA_TRUE); + else + _eext_circle_object_genlist_scrollbar_update(circle_obj, EINA_FALSE); + // +} + +static void +_eext_circle_object_genlist_item_deleted_cb(void *data, + Evas_Object *widget_obj, + void *event_info) +{ + Eext_Circle_Object *circle_obj = data; + EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return; + + Elm_Object_Item* deleted_item = (Elm_Object_Item*)event_info; + + if(widget_data->current_item == deleted_item) + { + widget_data->current_item = NULL; + } + + if(widget_data->aligned_item == deleted_item) + { + widget_data->aligned_item = NULL; + } +} + +static Eina_Bool +_circle_path_check(Eext_Circle_Object *circle_obj, Evas_Coord x, Evas_Coord y, double handler_angle) +{ + Evas_Coord r, c; + double angle; + evas_object_geometry_get(circle_obj->widget_object, NULL, NULL, &r, NULL); + c = r / 2; + + if (circle_obj->surface->is_mirrored) + angle = -(atan2((double)(y - c), (double)(c - x))); + else + angle = atan2((double)(y - c), (double)(x - c)); + angle *= 180 / M_PI; // convert from radians to degrees + + if (fabs(handler_angle - angle) > VERTICAL_BAR_ANGLE_HANDLER_SIZE) return EINA_FALSE; + r /= 2; + r -= 2 * HANDLER_BAR_WIDTH_SIZE; + if (((circle_obj->surface->is_mirrored && x < c) || + (!circle_obj->surface->is_mirrored && x > c)) && + ((pow (x - c, 2) + pow(y - c, 2) >= pow(r, 2)))) + return EINA_TRUE; + else return EINA_FALSE; +} + +static void +_handler_hide_cb(void *data, Evas_Object *obj, const char *emission, const char *source) +{ + Eext_Circle_Object_Genlist_Data *widget_data = (Eext_Circle_Object_Genlist_Data *) data; + widget_data->scrollbar_shown = EINA_FALSE; +} + +static void +_eext_circle_object_genlist_handler_drag_start_cb(void *data, + Evas *evas, + Evas_Object *widget_obj, + void *event_info) +{ + Eext_Circle_Object *circle_obj = data; + EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return; + EEXT_CIRCLE_OBJECT_GENLIST_SCROLL_IFACE_DATA_GET(circle_obj->widget_object, sid); + Evas_Event_Mouse_Down *ev = (Evas_Event_Mouse_Down*) event_info; + if (!widget_data->handler) return; + if (!widget_data->scrollbar_shown) return; + if (!_circle_path_check(circle_obj, ev->canvas.x, ev->canvas.y, widget_data->handler_angle)) return; + + if (widget_data->bar_hide_timer) + { + ecore_timer_del(widget_data->bar_hide_timer); + widget_data->bar_hide_timer = NULL; + } + + widget_data->handler_drag = EINA_TRUE; +/* if (elm_object_scroll_item_align_enabled_get(circle_obj->widget_object)) + sid->is_unset_cb_called = EINA_FALSE;*/ + elm_object_scroll_freeze_push(circle_obj->widget_object); +} + +static void +_eext_circle_object_genlist_handler_drag_end_cb(void *data, + Evas *evas, + Evas_Object *widget_obj, + void *event_info) +{ + Evas_Coord px, py, vw, vh, yy = 0; + Eext_Circle_Object *circle_obj = data; + EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return; + + if (!widget_data->handler_drag) return; + elm_object_scroll_freeze_pop(circle_obj->widget_object); + widget_data->handler_drag = EINA_FALSE; + + if (elm_object_scroll_item_align_enabled_get(circle_obj->widget_object)) + { + EEXT_CIRCLE_OBJECT_GENLIST_SCROLL_IFACE_DATA_GET(circle_obj->widget_object, sid); + elm_scroller_region_get(circle_obj->widget_object, &px, &py, &vw, &vh); + elm_pan_pos_adjust(sid->pan_obj, NULL, &yy); + elm_scroller_region_bring_in(circle_obj->widget_object, px, py - yy, vw, vh); + } + + if (widget_data->bar_hide_timer) + { + ecore_timer_del(widget_data->bar_hide_timer); + widget_data->bar_hide_timer = NULL; + } + widget_data->bar_hide_timer = ecore_timer_add(VERTICAL_BAR_HIDE_WAITTING_TIME, + _eext_circle_object_genlist_scrollbar_policy_hide_cb, + circle_obj); + _eext_circle_object_genlist_index_hide(circle_obj); +} + +static void +_eext_circle_object_genlist_drag_cb(void *data, + Evas *evas, + Evas_Object *widget_obj, + void *event_info) +{ + Eext_Circle_Object *circle_obj = data; + EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return; + Evas_Coord region; + Evas_Event_Mouse_Move *ev = event_info; + Evas_Coord ch, px, py, vw, vh; + Evas_Coord x, y; + double angle; + + x = ev->cur.canvas.x; + y = ev->cur.canvas.y; + + //ONEUI1.5(04July2019): Support different color with bezel + if (__elm_product_theme_is_loaded()) + widget_data->bezel_on = EINA_FALSE; + // + if (!widget_data->handler_drag) return; + + elm_scroller_child_size_get(circle_obj->widget_object, NULL, &ch); + elm_scroller_region_get(circle_obj->widget_object, &px, &py, &vw, &vh); + + Evas_Coord c = vw / 2; + if (circle_obj->surface->is_mirrored) + angle = atan((double)(c - y) / (double)(c - x)); + else + angle = atan((double)(c - y) / (double)(x - c)); + double ratio = ((M_PI / 6.0) - angle) / (M_PI / 3.0); + + ratio = ratio > 1.0 ? 1.0 : ratio; + ratio = ratio < 0.0 ? 0.0 : ratio; + + if ((!circle_obj->surface->is_mirrored && x < c) || + (circle_obj->surface->is_mirrored && x > c)) + ratio = 1.0 - ratio; + + region = (int) (ch * ratio); + elm_scroller_region_show(circle_obj->widget_object, px, region, vw, vh); +} + +//ONEUI1.5(06MAR2019): Genlist scrollbar init on genlist show/hide +static void +_eext_circle_object_genlist_show_cb(void *data, + Evas *evas, + Evas_Object *widget_obj, + void *event_info) +{ + Eext_Circle_Object *circle_obj = data; + EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return; + + _eext_circle_object_genlist_resume_cb(circle_obj, widget_obj, NULL); +} + +static void +_eext_circle_object_genlist_hide_cb(void *data, + Evas *evas, + Evas_Object *widget_obj, + void *event_info) +{ + Eext_Circle_Object *circle_obj = data; + EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return; + + _eext_circle_object_genlist_pause_cb(circle_obj, widget_obj, NULL); +} +// + +static Eina_Bool +_eext_circle_object_genlist_index_next(Eext_Circle_Object *circle_obj) +{ + EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return EINA_FALSE; + + if(widget_data->index_item_list && + _eext_circle_object_genlist_index_selected_item_update(widget_data, EINA_TRUE)) + { + _eext_circle_object_genlist_index_show(circle_obj); + _eext_circle_object_genlist_index_selected_item_region_show(circle_obj); + return EINA_TRUE; + } + else if (widget_data->index_item_list) + { + _eext_circle_object_genlist_index_hide(circle_obj); + _remove_gesture_layer(circle_obj); + return EINA_FALSE; + } + return EINA_FALSE; +} + +static Eina_Bool +_eext_circle_object_genlist_index_prev(Eext_Circle_Object *circle_obj) +{ + EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return EINA_FALSE; + + if(widget_data->index_item_list && + _eext_circle_object_genlist_index_selected_item_update(widget_data, EINA_FALSE)) + { + _eext_circle_object_genlist_index_show(circle_obj); + _eext_circle_object_genlist_index_selected_item_region_show(circle_obj); + return EINA_TRUE; + } + else if (widget_data->index_item_list) + { + _eext_circle_object_genlist_index_hide(circle_obj); + _remove_gesture_layer(circle_obj); + return EINA_FALSE; + } + return EINA_FALSE; +} + +static void +_eext_circle_object_genlist_index_update_cb(void *data, + Evas_Object *widget_obj, + void *event_info) +{ + if (elm_atspi_bridge_utils_is_screen_reader_enabled() + && eext_rotary_event_type_get() != EEXT_ROTARY_EVENT_TYPE_HW_BEZEL) return; + Eext_Circle_Object *circle_obj = data; + Elm_Object_Item *it = (Elm_Object_Item *)event_info; + Eext_Circle_Object_Genlist_Index_Item *index_item; + Eina_List *l; + + if (!it) return; + EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return; + if (!widget_data->index_item_list) return; + + EINA_LIST_FOREACH(widget_data->index_item_list, l, index_item) + if (index_item->item == it) + widget_data->index_selected_item = index_item; +} + +static void +_remove_gesture_layer(Eext_Circle_Object *circle_obj) +{ + EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return; + elm_gesture_layer_cb_del(widget_data->g_layer, ELM_GESTURE_N_LINES, + ELM_GESTURE_STATE_END, _index_layout_lines_end, circle_obj); + elm_gesture_layer_cb_del(widget_data->g_layer, ELM_GESTURE_N_TAPS, + ELM_GESTURE_STATE_END, _index_layout_tap_end, circle_obj); + evas_object_repeat_events_set(widget_data->g_rect, EINA_TRUE); + widget_data->index_shown_anim = EINA_FALSE; +} + +static Evas_Event_Flags +_index_layout_lines_end(void *data, void *event_info) +{ + Elm_Gesture_Line_Info *p = (Elm_Gesture_Line_Info *) event_info; + Eext_Circle_Object *circle_obj = data; + if ((p->momentum.y2 - p->momentum.y1) >=0) + _eext_circle_object_genlist_index_prev(circle_obj); + else + _eext_circle_object_genlist_index_next(circle_obj); + return EVAS_EVENT_FLAG_ON_HOLD; +} + +static Evas_Event_Flags +_index_layout_tap_end(void *data, void *event_info) +{ + Eext_Circle_Object *circle_obj = data; + EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return EVAS_EVENT_FLAG_NONE; + _eext_circle_object_genlist_index_hide(circle_obj); + elm_gesture_layer_cb_del(widget_data->g_layer, ELM_GESTURE_N_LINES, + ELM_GESTURE_STATE_END, _index_layout_lines_end, circle_obj); + elm_gesture_layer_cb_del(widget_data->g_layer, ELM_GESTURE_N_TAPS, + ELM_GESTURE_STATE_END, _index_layout_tap_end, circle_obj); + evas_object_repeat_events_set(widget_data->g_rect, EINA_TRUE); + widget_data->index_shown_anim = EINA_FALSE; + return EVAS_EVENT_FLAG_ON_HOLD; +} + +static void +_eext_circle_object_genlist_index_show_cb(void *data, + Evas_Object *widget_obj, + void *event_info) +{ + if (elm_atspi_bridge_utils_is_screen_reader_enabled() + && eext_rotary_event_type_get() != EEXT_ROTARY_EVENT_TYPE_HW_BEZEL) return; + Eext_Circle_Object *circle_obj = data; + Eina_Bool dir = (int)event_info; + Eina_Bool ret = EINA_FALSE; + EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return; + if (dir) + ret = _eext_circle_object_genlist_index_prev(circle_obj); + else + ret = _eext_circle_object_genlist_index_next(circle_obj); + if (!ret) return; + widget_data->index_shown_anim = EINA_TRUE; + elm_gesture_layer_cb_set(widget_data->g_layer, ELM_GESTURE_N_LINES, + ELM_GESTURE_STATE_END, _index_layout_lines_end, circle_obj); + elm_gesture_layer_cb_set(widget_data->g_layer, ELM_GESTURE_N_TAPS, + ELM_GESTURE_STATE_END, _index_layout_tap_end, circle_obj); + evas_object_repeat_events_set(widget_data->g_rect, EINA_FALSE); +} + +static void +_on_obj_resize(void * data, + Evas *e EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + Eext_Circle_Object_Genlist_Data *widget_data = data; + Evas_Coord w, h; + evas_object_geometry_get(obj, NULL, NULL, &w, &h); + evas_object_resize(widget_data->g_rect, w, h); +} + +static void +_eext_circle_object_genlist_aligned_item_cb(void *data, + Evas_Object *widget_obj, + void *event_info) +{ + Eext_Circle_Object *circle_obj = data; + EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return; + + widget_data->aligned_item = (Elm_Object_Item*)event_info; + widget_data->current_item = (Elm_Object_Item*)event_info; + widget_data->detent_count = 0; +} + +//ONEUI1.5(03JUN2019): Update circle genlist on theme change +static void +_eext_circle_object_genlist_theme_changed_cb(void *data, + Evas_Object *widget_obj, + void *event_info) +{ + Eext_Circle_Object *circle_obj = data; + EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return; + Evas_Object *genlist = circle_obj->widget_object; + const char *style = elm_object_style_get(genlist); + if (style && !strcmp(style, HANDLER_STYLE)) + widget_data->handler = EINA_TRUE; + else + { + widget_data->handler = EINA_FALSE; + evas_object_smart_member_del(widget_data->handler_layout); + evas_object_del(widget_data->handler_layout); + widget_data->handler_layout = NULL; + evas_object_event_callback_del(genlist, EVAS_CALLBACK_MOUSE_DOWN, _eext_circle_object_genlist_handler_drag_start_cb); + evas_object_event_callback_del(genlist, EVAS_CALLBACK_MOUSE_UP, _eext_circle_object_genlist_handler_drag_end_cb); + } + + if (widget_data->handler && !widget_data->handler_layout) + { + widget_data->handler_layout = elm_layout_add(genlist); + elm_layout_theme_set(widget_data->handler_layout, "scroller", "base", "prod/handler/indicator"); + evas_object_resize(widget_data->handler_layout, SURFACE_WIDTH, SURFACE_WIDTH); + evas_object_show(widget_data->handler_layout); + evas_object_smart_member_add(widget_data->handler_layout, genlist); + elm_layout_signal_callback_add(widget_data->handler_layout, "elm,state,hide,finished", "elm", _handler_hide_cb, widget_data); + evas_object_event_callback_add(genlist, EVAS_CALLBACK_MOUSE_DOWN, _eext_circle_object_genlist_handler_drag_start_cb, circle_obj); + evas_object_event_callback_add(genlist, EVAS_CALLBACK_MOUSE_UP, _eext_circle_object_genlist_handler_drag_end_cb, circle_obj); + } +} +// + +static void +_eext_circle_object_genlist_bring_in_item_adjusted_cb(void *data, + Evas_Object *widget_obj, + void *event_info) +{ + Eext_Circle_Object *circle_obj = data; + EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return; + + widget_data->current_item = (Elm_Object_Item*)event_info; +} + +static Eina_Bool +_index_gesture_cb(void *data, Elm_Atspi_Gesture_Info gesture_info, Evas_Object *obj) +{ + Eext_Circle_Object *circle_obj = data; + LOGI("Gesture_type = %d x_beg = %d, x_end=%d y_beg=%d y_end=%d",gesture_info.type, + gesture_info.x_beg, gesture_info.x_end, gesture_info.y_beg, gesture_info.y_end); + if (gesture_info.type != ELM_ATSPI_GESTURE_ONE_FINGER_FLICK_UP && + gesture_info.type != ELM_ATSPI_GESTURE_ONE_FINGER_FLICK_DOWN) + return EINA_FALSE; + if (gesture_info.type == ELM_ATSPI_GESTURE_ONE_FINGER_FLICK_UP) + { + _eext_circle_object_genlist_index_next(circle_obj); + } + else + { + _eext_circle_object_genlist_index_prev(circle_obj); + } + return EINA_TRUE; +} + +//ONEUI1.5(20181009):Register access object when screen-reader is dynamically switched on +static void +_eext_circle_object_genlist_screen_reader_changed(void *data, Evas_Object *obj, void *event_info) +{ + Eext_Circle_Object *circle_obj = data; + EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return; + if (!widget_data->index_layout) return; + if (elm_atspi_bridge_utils_is_screen_reader_enabled()) + { + Evas_Object *text_object = (Evas_Object *)edje_object_part_object_get(elm_layout_edje_get(widget_data->index_layout), "elm.text"); + widget_data->access_object = elm_access_object_register(text_object, circle_obj->widget_object); + elm_atspi_accessible_role_set(widget_data->access_object, ELM_ATSPI_ROLE_RADIO_MENU_ITEM); + elm_atspi_accessible_reading_info_type_set(widget_data->access_object, ELM_ACCESSIBLE_READING_INFO_TYPE_NAME| + ELM_ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION); + //ONEUI1.5(19Jun2019): Enable sw/hw bezel + if (!eext_rotary_event_is_enabled()) + elm_atspi_accessible_gesture_cb_set(widget_data->access_object, _index_gesture_cb, circle_obj); + } + else + { + if (widget_data->access_object) + { + elm_access_object_unregister(widget_data->access_object); + widget_data->access_object = NULL; + } + } +} +// + +static void +_eext_circle_object_genlist_del_cb(Eext_Circle_Object *circle_obj) +{ + EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return; + Eext_Circle_Object_Genlist_Rotary_Time *rotary_time; + + //ONEUI1.5(18FEB2019): Genlist resume/pause signal for scrollbar show + evas_object_smart_callback_del_full(circle_obj->widget_object, SIG_GENLIST_RESUME, _eext_circle_object_genlist_resume_cb, circle_obj); + evas_object_smart_callback_del_full(circle_obj->main_obj, SIG_GENLIST_RESUME, _eext_circle_object_genlist_resume_cb, circle_obj); + evas_object_smart_callback_del_full(circle_obj->widget_object, SIG_GENLIST_PAUSE, _eext_circle_object_genlist_pause_cb, circle_obj); + evas_object_smart_callback_del_full(circle_obj->main_obj, SIG_GENLIST_PAUSE, _eext_circle_object_genlist_pause_cb, circle_obj); + // + evas_object_smart_callback_del_full(circle_obj->widget_object, SIGNAL_SCROLL, _eext_circle_object_genlist_scroll_cb, circle_obj); + evas_object_smart_callback_del_full(circle_obj->widget_object, SIGNAL_SCROLL_ANIM_STOP, _eext_circle_object_genlist_scroll_anim_stop_cb, circle_obj); + evas_object_smart_callback_del_full(circle_obj->widget_object, SIGNAL_LOADED, _eext_circle_object_genlist_loaded_cb, circle_obj); + evas_object_smart_callback_del_full(circle_obj->widget_object, SIGNAL_ITEM_DELETED, _eext_circle_object_genlist_item_deleted_cb, circle_obj); + evas_object_smart_callback_del_full(circle_obj->widget_object, SIG_BRING_IN_ITEM_ADJUSTED, _eext_circle_object_genlist_bring_in_item_adjusted_cb, circle_obj); + evas_object_smart_callback_del_full(circle_obj->widget_object, SIG_ALIGNED_ITEM_DETECTED, _eext_circle_object_genlist_aligned_item_cb, circle_obj); + //ONEUI1.5(20181009):Register access object when screen-reader is dynamically switched on + evas_object_smart_callback_del(circle_obj->widget_object, "atspi,screen,reader,changed", _eext_circle_object_genlist_screen_reader_changed); + // + //ONEUI1.5(03JUN2019): Update circle genlist on theme change + evas_object_smart_callback_del_full(circle_obj->widget_object, SIG_THEME_CHANGED, _eext_circle_object_genlist_theme_changed_cb, circle_obj); + // + //ONEUI1.5(06MAR2019): Genlist scrollbar init on genlist show/hide + evas_object_event_callback_del(circle_obj->widget_object, EVAS_CALLBACK_SHOW, _eext_circle_object_genlist_show_cb); + evas_object_event_callback_del(circle_obj->widget_object, EVAS_CALLBACK_HIDE, _eext_circle_object_genlist_hide_cb); + // + if (widget_data->handler) + { + evas_object_event_callback_del(circle_obj->widget_object, EVAS_CALLBACK_MOUSE_DOWN, _eext_circle_object_genlist_handler_drag_start_cb); + evas_object_event_callback_del(circle_obj->widget_object, EVAS_CALLBACK_MOUSE_UP, _eext_circle_object_genlist_handler_drag_end_cb); + } + //ONEUI1.5(04July2019): Support different color with bezel + evas_object_event_callback_del(circle_obj->widget_object, EVAS_CALLBACK_MOUSE_MOVE, _eext_circle_object_genlist_drag_cb); + // + //ONEUI1.5(19Jun2019): Enable sw/hw bezel + if (!eext_rotary_event_is_enabled()) + { + if (__elm_product_theme_is_loaded()) + { + evas_object_smart_callback_del_full(circle_obj->widget_object, SIG_REALIZED, _eext_circle_object_genlist_index_update_cb, circle_obj); + evas_object_smart_callback_del_full(circle_obj->widget_object, SIG_INDEX_SHOW, _eext_circle_object_genlist_index_show_cb, circle_obj); + } + } + + edje_object_signal_callback_del(elm_layout_edje_get(circle_obj->widget_object), "color_class,set", widget_data->scrollbar_color_class, _eext_circle_object_genlist_change_color_signal_cb); + edje_object_signal_callback_del(elm_layout_edje_get(circle_obj->widget_object), "color_class,set", widget_data->scrollbar_bg_color_class, _eext_circle_object_genlist_change_color_signal_cb); + if (widget_data->scrollbar_color_class) eina_stringshare_del(widget_data->scrollbar_color_class); + if (widget_data->scrollbar_bg_color_class) eina_stringshare_del(widget_data->scrollbar_bg_color_class); + + //ONEUI1.5(04July2019): Support different color with bezel + edje_object_signal_callback_del(elm_layout_edje_get(circle_obj->widget_object), "color_class,set", + widget_data->bezel_scrollbar_color_class, + _eext_circle_object_genlist_change_color_signal_cb); + if (widget_data->bezel_scrollbar_color_class) eina_stringshare_del(widget_data->bezel_scrollbar_color_class); + // + + if (widget_data->bar_hide_timer) + { + ecore_timer_del(widget_data->bar_hide_timer); + widget_data->bar_hide_timer = NULL; + } + if (widget_data->index_layout) + { + evas_object_del(widget_data->index_layout); + widget_data->index_layout = NULL; + } + if (widget_data->index_hide_timer) + { + ecore_timer_del(widget_data->index_hide_timer); + widget_data->index_hide_timer = NULL; + } + if (widget_data->bar_first_show_timer) + { + ecore_timer_del(widget_data->bar_first_show_timer); + widget_data->bar_first_show_timer = NULL; + } + if (widget_data->change_flag_timer) + { + ecore_timer_del(widget_data->change_flag_timer); + widget_data->change_flag_timer = NULL; + } + + _eext_circle_object_genlist_items_index_clear_internal(circle_obj); + + EINA_LIST_FREE(widget_data->rotary_times, rotary_time) + free(rotary_time); + + free(circle_obj->widget_data); + circle_obj->widget_data = NULL; + + eext_rotary_object_event_callback_del(circle_obj->widget_object, _rotary_changed_cb); +} + +static void +_eext_circle_object_genlist_init(Eext_Circle_Object *circle_obj, + Evas_Object *genlist) +{ + Eext_Circle_Object_Genlist_Data *widget_data = NULL; + + circle_obj->widget_type = EEXT_CIRCLE_OBJECT_GENLIST_TYPE; + circle_obj->del_func = _eext_circle_object_genlist_del_cb; + circle_obj->color_changed_func = _eext_circle_object_genlist_color_changed_cb; + circle_obj->mirrored_state = EEXT_CIRCLE_MIRRORED_CONFIG; + + widget_data = (Eext_Circle_Object_Genlist_Data *)calloc(1, sizeof(Eext_Circle_Object_Genlist_Data)); + if (!widget_data) + { + LOGE("Could not allocate memory for Eext_Circle_Object_Genlist_Data!"); + return; + } + + const char *style = elm_object_style_get(genlist); + if (style && !strcmp(style, HANDLER_STYLE)) + widget_data->handler = EINA_TRUE; + else + widget_data->handler = EINA_FALSE; + + widget_data->policy_v = ELM_SCROLLER_POLICY_AUTO; + widget_data->scrollbar_initializing = EINA_FALSE; + widget_data->scrollbar_first_shown = EINA_FALSE; + + widget_data->bezel_scrollbar_color_class = STR_DUP(edje_object_data_get(elm_layout_edje_get(genlist), "bezel_bar_color_class")); + widget_data->scrollbar_color_class = STR_DUP(edje_object_data_get(elm_layout_edje_get(genlist), "bar_color_class")); + widget_data->scrollbar_bg_color_class = STR_DUP(edje_object_data_get(elm_layout_edje_get(genlist), "bar_bg_color_class")); + + widget_data->handler_layout = NULL; + widget_data->handler_angle = 0; + widget_data->handler_drag = EINA_FALSE; + widget_data->aligned_item = NULL; + //ONEUI1.5(19Jun2019): Enable sw/hw bezel + if (!eext_rotary_event_is_enabled()) + widget_data->index_shown_anim = EINA_FALSE; + + if (widget_data->handler) + { + widget_data->handler_layout = elm_layout_add(genlist); + elm_layout_theme_set(widget_data->handler_layout, "scroller", "base", "prod/handler/indicator"); + evas_object_resize(widget_data->handler_layout, SURFACE_WIDTH, SURFACE_WIDTH); + evas_object_show(widget_data->handler_layout); + evas_object_smart_member_add(widget_data->handler_layout, genlist); + elm_layout_signal_callback_add(widget_data->handler_layout, "elm,state,hide,finished", "elm", _handler_hide_cb, widget_data); + evas_object_event_callback_add(genlist, EVAS_CALLBACK_MOUSE_DOWN, _eext_circle_object_genlist_handler_drag_start_cb, circle_obj); + evas_object_event_callback_add(genlist, EVAS_CALLBACK_MOUSE_UP, _eext_circle_object_genlist_handler_drag_end_cb, circle_obj); + } + //ONEUI1.5(04July2019): Support different color with bezel + evas_object_event_callback_priority_add(genlist, EVAS_CALLBACK_MOUSE_MOVE, EVAS_CALLBACK_PRIORITY_BEFORE, + _eext_circle_object_genlist_drag_cb, circle_obj); + // + circle_obj->widget_data = (void *)widget_data; + _update_color_info(circle_obj); + + widget_data->bg_item = _eext_circle_object_item_new(); + + _eext_circle_object_item_color_set(widget_data->bg_item, + widget_data->bg_color.r, + widget_data->bg_color.g, + widget_data->bg_color.b, + 0); + _eext_circle_object_item_name_set(widget_data->bg_item, GENLIST_BG_ITEM_NAME); + _eext_circle_object_item_angle_set(widget_data->bg_item, VERTICAL_BAR_ANGLE_MAX_SIZE); + _eext_circle_object_item_line_width_set(widget_data->bg_item, VERTICAL_BAR_WIDTH_SIZE); + _eext_circle_object_item_radius_set(widget_data->bg_item, VERTICAL_BAR_RADIUS_SIZE); + + _eext_circle_object_item_angle_offset_set(widget_data->bg_item, VERTICAL_BAR_ANGLE_START); + _eext_circle_object_item_append(circle_obj, widget_data->bg_item); + + widget_data->item = _eext_circle_object_item_new(); + _eext_circle_object_item_color_set(widget_data->item, + widget_data->color.r, + widget_data->color.g, + widget_data->color.b, + 0); + _eext_circle_object_item_name_set(widget_data->item, GENLIST_ITEM_NAME); + _eext_circle_object_item_angle_set(widget_data->item, VERTICAL_BAR_ANGLE_MAX_SIZE); + _eext_circle_object_item_line_width_set(widget_data->item, VERTICAL_BAR_WIDTH_SIZE); + _eext_circle_object_item_radius_set(widget_data->item, VERTICAL_BAR_RADIUS_SIZE); + + _eext_circle_object_item_angle_offset_set(widget_data->item, VERTICAL_BAR_ANGLE_START); + _eext_circle_object_item_append(circle_obj, widget_data->item); + + + elm_scroller_policy_set(circle_obj->widget_object, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); + + //ONEUI1.5(18FEB2019): Genlist resume/pause signal for scrollbar show + evas_object_smart_callback_add(circle_obj->widget_object, SIG_GENLIST_RESUME, _eext_circle_object_genlist_resume_cb, circle_obj); + evas_object_smart_callback_add(circle_obj->main_obj, SIG_GENLIST_RESUME, _eext_circle_object_genlist_resume_cb, circle_obj); + evas_object_smart_callback_add(circle_obj->widget_object, SIG_GENLIST_PAUSE, _eext_circle_object_genlist_pause_cb, circle_obj); + evas_object_smart_callback_add(circle_obj->main_obj, SIG_GENLIST_PAUSE, _eext_circle_object_genlist_pause_cb, circle_obj); + // + evas_object_smart_callback_add(circle_obj->widget_object, SIGNAL_SCROLL, _eext_circle_object_genlist_scroll_cb, circle_obj); + evas_object_smart_callback_add(circle_obj->widget_object, SIGNAL_SCROLL_ANIM_STOP, _eext_circle_object_genlist_scroll_anim_stop_cb, circle_obj); + evas_object_smart_callback_add(circle_obj->widget_object, SIGNAL_LOADED, _eext_circle_object_genlist_loaded_cb, circle_obj); + evas_object_smart_callback_add(circle_obj->widget_object, SIGNAL_ITEM_DELETED, _eext_circle_object_genlist_item_deleted_cb, circle_obj); + evas_object_smart_callback_add(circle_obj->widget_object, SIG_BRING_IN_ITEM_ADJUSTED, _eext_circle_object_genlist_bring_in_item_adjusted_cb, circle_obj); + evas_object_smart_callback_add(circle_obj->widget_object, SIG_ALIGNED_ITEM_DETECTED, _eext_circle_object_genlist_aligned_item_cb, circle_obj); + //ONEUI1.5(20181009):Register access object when screen-reader is dynamically switched on + evas_object_smart_callback_add(circle_obj->widget_object, "atspi,screen,reader,changed", _eext_circle_object_genlist_screen_reader_changed, circle_obj); + // + //ONEUI1.5(03JUN2019): Update circle genlist on theme change + evas_object_smart_callback_add(circle_obj->widget_object, SIG_THEME_CHANGED, _eext_circle_object_genlist_theme_changed_cb, circle_obj); + // + //ONEUI1.5(19Jun2019): Enable sw/hw bezel + if (!eext_rotary_event_is_enabled()) + { + if (__elm_product_theme_is_loaded()) + { + evas_object_smart_callback_add(circle_obj->widget_object, SIG_REALIZED, _eext_circle_object_genlist_index_update_cb, circle_obj); + evas_object_smart_callback_add(circle_obj->widget_object, SIG_INDEX_SHOW, _eext_circle_object_genlist_index_show_cb, circle_obj); + } + } + + edje_object_signal_callback_add(elm_layout_edje_get(circle_obj->widget_object), "color_class,set", widget_data->scrollbar_color_class, _eext_circle_object_genlist_change_color_signal_cb, circle_obj); + edje_object_signal_callback_add(elm_layout_edje_get(circle_obj->widget_object), "color_class,set", widget_data->scrollbar_bg_color_class, _eext_circle_object_genlist_change_color_signal_cb, circle_obj); + //ONEUI1.5(04July2019): Support different color with bezel + edje_object_signal_callback_add(elm_layout_edje_get(circle_obj->widget_object), "color_class,set", + widget_data->bezel_scrollbar_color_class, + _eext_circle_object_genlist_change_color_signal_cb, + circle_obj); + // + + eext_rotary_object_event_callback_add(circle_obj->widget_object, _rotary_changed_cb, circle_obj); +} + +EAPI Evas_Object * +eext_circle_object_genlist_add(Evas_Object *genlist, + Eext_Circle_Surface *surface) +{ if (!genlist) return NULL; - obj = _eext_circle_object_add(genlist, genlist, surface); + Evas_Object *obj = _eext_circle_object_add(genlist, genlist, surface); EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return NULL; @@ -573,9 +1944,9 @@ eext_circle_object_genlist_scroller_policy_set(Evas_Object *obj, Elm_Scroller_Policy policy_v) { EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return; - EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, data) + EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) { - ERR("Eext_Circle_Object type mismatch: expected type [%s], given type [%s]", + LOGE("Eext_Circle_Object type mismatch: expected type [%s], given type [%s]", EEXT_CIRCLE_OBJECT_GENLIST_TYPE, circle_obj->widget_type); return; } @@ -584,21 +1955,20 @@ eext_circle_object_genlist_scroller_policy_set(Evas_Object *obj, (policy_v >= ELM_SCROLLER_POLICY_LAST)) return; - data->policy_h = policy_h; - data->policy_v = policy_v; + widget_data->policy_h = policy_h; + widget_data->policy_v = policy_v; - if (data->policy_v == ELM_SCROLLER_POLICY_ON) + if (widget_data->policy_v == ELM_SCROLLER_POLICY_ON || + widget_data->policy_v == ELM_SCROLLER_POLICY_AUTO) { - _eext_circle_object_genlist_scrollbar_update(circle_obj); - _eext_circle_object_genlist_scrollbar_show(circle_obj, - VERTICAL_BAR_HIDE_WAITTING_TIME_ON_INITIALIZING); + _eext_circle_object_genlist_scrollbar_show(circle_obj); } else { - if (data->bar_hide_timer) + if (widget_data->bar_hide_timer) { - ecore_timer_del(data->bar_hide_timer); - data->bar_hide_timer = NULL; + ecore_timer_del(widget_data->bar_hide_timer); + widget_data->bar_hide_timer = NULL; } _eext_circle_object_genlist_scrollbar_policy_hide_cb(circle_obj); } @@ -616,15 +1986,149 @@ eext_circle_object_genlist_scroller_policy_get(const Evas_Object *obj, return; } - EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, data) + EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) { - ERR("Eext_Circle_Object type mismatch: expected type [%s], given type [%s]", + LOGE("Eext_Circle_Object type mismatch: expected type [%s], given type [%s]", EEXT_CIRCLE_OBJECT_GENLIST_TYPE, circle_obj->widget_type); if (policy_h) *policy_h = ELM_SCROLLER_POLICY_AUTO; if (policy_v) *policy_v = ELM_SCROLLER_POLICY_AUTO; return; } - if (policy_h) *policy_h = data->policy_h; - if (policy_v) *policy_v = data->policy_v; + if (policy_h) *policy_h = widget_data->policy_h; + if (policy_v) *policy_v = widget_data->policy_v; +} + +EAPI void +eext_circle_object_genlist_item_index_set(Evas_Object *obj, + Elm_Object_Item *item, + const char *text) +{ + Eext_Circle_Object_Genlist_Index_Item *index_item = NULL, *iit = NULL; + Elm_Object_Item *genlist_item = NULL; + Eina_List *l = NULL; + + if (!item || !text) return; + EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return; + EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return; + + if (!widget_data->index_layout) + { + widget_data->index_layout = elm_layout_add(circle_obj->widget_object); + elm_layout_theme_set(widget_data->index_layout, "layout", "rotary_index", "indicator"); + elm_object_part_content_set(circle_obj->widget_object, "elm.swallow.index", widget_data->index_layout); + //ONEUI1.5(19Jun2019): Enable sw/hw bezel + if (!eext_rotary_event_is_enabled()) + { + widget_data->g_rect = evas_object_rectangle_add(evas_object_evas_get(circle_obj->widget_object)); + evas_object_smart_member_add(widget_data->g_rect, circle_obj->widget_object); + evas_object_color_set(widget_data->g_rect, 0, 0, 0, 0); + evas_object_resize(widget_data->g_rect, SURFACE_WIDTH, SURFACE_WIDTH); + evas_object_show(widget_data->g_rect); + evas_object_repeat_events_set(widget_data->g_rect, EINA_TRUE); + evas_object_raise(widget_data->g_rect); + + evas_object_event_callback_add(circle_obj->widget_object, EVAS_CALLBACK_RESIZE, _on_obj_resize, widget_data); + + widget_data->g_layer = elm_gesture_layer_add(circle_obj->widget_object); + elm_gesture_layer_attach(widget_data->g_layer, widget_data->g_rect); + } +#ifdef PRODUCT_FEATURE_SCREEN_READER_MODE + if (__elm_access_screen_reader_enabled_get()) + { + Evas_Object *text_object = (Evas_Object *)edje_object_part_object_get(elm_layout_edje_get(widget_data->index_layout), "elm.text"); + widget_data->access_object = elm_access_object_register(text_object, circle_obj->widget_object); + elm_atspi_accessible_role_set(widget_data->access_object, ELM_ATSPI_ROLE_RADIO_MENU_ITEM); + elm_atspi_accessible_reading_info_type_set(widget_data->access_object, ELM_ACCESSIBLE_READING_INFO_TYPE_NAME| + ELM_ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION); + //ONEUI1.5(19Jun2019): Enable sw/hw bezel + if (!eext_rotary_event_is_enabled()) + elm_atspi_accessible_gesture_cb_set(widget_data->access_object, _index_gesture_cb, circle_obj); + } +#endif + } + + genlist_item = elm_genlist_first_item_get(circle_obj->widget_object); + + EINA_LIST_FOREACH(widget_data->index_item_list, l, iit) + { + if (iit->item == item) + { + eina_stringshare_replace(&(iit->letter), text); + return; + } + + while (genlist_item) + { + if (item == genlist_item) + { + index_item = _eext_circle_object_genlist_index_item_new(circle_obj, item, text); + widget_data->index_item_list = eina_list_prepend_relative_list(widget_data->index_item_list, index_item, l); + return; + } + + if (iit->item == genlist_item) + break; + + genlist_item = elm_genlist_item_next_get(genlist_item); + } + } + + index_item = _eext_circle_object_genlist_index_item_new(circle_obj, item, text); + widget_data->index_item_list = eina_list_append(widget_data->index_item_list, index_item); +} + +EAPI const char * +eext_circle_object_genlist_item_index_get(Evas_Object *obj, + Elm_Object_Item *item) +{ + Eext_Circle_Object_Genlist_Index_Item *index_item = NULL; + Eina_List *l = NULL; + + if (!item) return NULL; + EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return NULL; + EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return NULL; + + EINA_LIST_FOREACH(widget_data->index_item_list, l, index_item) + { + if (index_item->item == item) + return index_item->letter; + } + + return NULL; +} + +EAPI void +eext_circle_object_genlist_item_index_unset(Evas_Object *obj, + Elm_Object_Item *item) +{ + Eext_Circle_Object_Genlist_Index_Item *index_item = NULL; + Eina_List *l = NULL; + + if (!item) return; + EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return; + EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return; + + if (widget_data->index_selected_item->item == item) + widget_data->index_selected_item = NULL; + + EINA_LIST_FOREACH(widget_data->index_item_list, l, index_item) + { + if (index_item->item == item) + { + widget_data->index_item_list = eina_list_remove_list(widget_data->index_item_list, l); + + if (index_item->letter) eina_stringshare_del(index_item->letter); + free(index_item); + break; + } + } +} + +EAPI void +eext_circle_object_genlist_items_index_clear(Evas_Object *obj) +{ + EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return; + + _eext_circle_object_genlist_items_index_clear_internal(circle_obj); } diff --git a/src/wearable/circle/efl_extension_circle_object_item.c b/src/wearable/circle/efl_extension_circle_object_item.c index ca3fda2..e30bfae 100644 --- a/src/wearable/circle/efl_extension_circle_object_item.c +++ b/src/wearable/circle/efl_extension_circle_object_item.c @@ -18,8 +18,6 @@ #include "efl_extension_private.h" #include "wearable/circle/efl_extension_circle_private.h" -static const char SIG_VALUE_CHANGED[] = "value,changed"; -static Eina_Bool _eext_circle_object_item_value_set_internal(Eext_Circle_Object_Item *item, double value, Eina_Bool angle_update); static void _eext_circle_object_item_color_transit_animator_del(Eext_Circle_Object_Item *item); static void _eext_circle_object_item_angle_transit_animator_del(Eext_Circle_Object_Item *item); @@ -99,7 +97,7 @@ _eext_circle_object_item_angle_transit_animator_cb(void *data, double pos) static Eina_Bool _eext_circle_object_item_angle_set_internal(Eext_Circle_Object_Item *item, double angle) { - double temp_angle, value; + double temp_angle; if (item->angle == angle) return EINA_FALSE; @@ -111,8 +109,7 @@ _eext_circle_object_item_angle_set_internal(Eext_Circle_Object_Item *item, doubl if (item->angle == temp_angle) return EINA_FALSE; item->angle = temp_angle; - value = _eext_circle_object_item_angle_value_get(item, item->angle); - _eext_circle_object_item_value_set_internal(item, value, EINA_TRUE); + item->value = _eext_circle_object_item_angle_value_get(item, item->angle); return EINA_TRUE; } @@ -120,7 +117,7 @@ _eext_circle_object_item_angle_set_internal(Eext_Circle_Object_Item *item, doubl static Eina_Bool _eext_circle_object_item_angle_set_round_internal(Eext_Circle_Object_Item *item, double angle) { - double temp_angle, value; + double temp_angle; if (item->angle == angle) return EINA_FALSE; @@ -132,8 +129,7 @@ _eext_circle_object_item_angle_set_round_internal(Eext_Circle_Object_Item *item, if (item->angle == temp_angle) return EINA_FALSE; item->angle = temp_angle; - value = _eext_circle_object_item_angle_value_get_round(item, item->angle); - _eext_circle_object_item_value_set_internal(item, value, EINA_FALSE); + item->value = _eext_circle_object_item_angle_value_get_round(item, item->angle); return EINA_TRUE; } @@ -149,9 +145,8 @@ _eext_circle_object_item_angle_offset_set_internal(Eext_Circle_Object_Item *item } static Eina_Bool -_eext_circle_object_item_value_set_internal(Eext_Circle_Object_Item *item, double value, Eina_Bool angle_update) +_eext_circle_object_item_value_set_internal(Eext_Circle_Object_Item *item, double value) { - Eext_Circle_Object *obj = item->obj; double angle; if (item->value == value) return EINA_FALSE; @@ -161,11 +156,6 @@ _eext_circle_object_item_value_set_internal(Eext_Circle_Object_Item *item, doubl if (item->value < item->min_value) item->value = item->min_value; if (item->value > item->max_value) item->value = item->max_value; - if (obj) - evas_object_smart_callback_call(obj->main_obj, SIG_VALUE_CHANGED, NULL); - - if (!angle_update) return EINA_TRUE; - angle = _eext_circle_object_item_value_angle_get(item, item->value); if (item->angle == angle) return EINA_FALSE; @@ -320,10 +310,8 @@ _eext_circle_object_item_angle_value_get_round(const Eext_Circle_Object_Item *it value = item->min_value; if (item->max_angle != item->min_angle) value += (angle - item->min_angle) * (item->max_value - item->min_value) / (item->max_angle - item->min_angle); - value += 0.5; value = (int)value; - if (value < item->min_value) value = item->min_value; if (value > item->max_value) value = item->max_value; @@ -367,7 +355,7 @@ _eext_circle_text_font_get(const char *text, const char *font_family) if (set == NULL) { - ERR("Fail to sort the fonts"); + LOGE("Fail to sort the fonts"); return NULL; } @@ -376,7 +364,7 @@ _eext_circle_text_font_get(const char *text, const char *font_family) if (result == FcResultNoMatch) { - ERR("Fail to Load Family Name to draw %s [%X]", text, (unsigned int)u_str); + LOGE("Fail to Load Family Name to draw %s [%X]", text, (unsigned int)u_str); return NULL; } @@ -394,6 +382,8 @@ _eext_circle_object_item_new(void) item->name = eina_stringshare_add("default"); item->angle = item->draw.angle = 0.0; item->angle_offset = item->draw.angle_offset = 0.0; + item->round_cap = EINA_TRUE; + item->color_changed = EINA_FALSE; item->min_angle = 0; item->max_angle = 360; item->min_value = 0; @@ -434,24 +424,22 @@ _eext_circle_object_item_append(Eext_Circle_Object *obj, Eext_Circle_Object_Item if (obj == item->obj) { - ERR("You are trying to append the item that is already appended"); + LOGE("You are trying to append the item that is already appended"); return; } if (item->obj) { - ERR("You are trying to append the item that is already appended to the other object!"); + LOGE("You are trying to append the item that is already appended to the other object!"); return; } obj->items = eina_list_append(obj->items, item); item->obj = obj; - if (obj->vg_container) { item->vg = evas_vg_shape_add(obj->vg_container); } - _eext_circle_object_changed(item->obj); } @@ -462,24 +450,22 @@ _eext_circle_object_item_prepend(Eext_Circle_Object *obj, Eext_Circle_Object_Ite if (obj == item->obj) { - ERR("You are trying to append the item that is already appended"); + LOGE("You are trying to append the item that is already appended"); return; } if (item->obj) { - ERR("You are trying to append the item that is already appended to the other object!"); + LOGE("You are trying to append the item that is already appended to the other object!"); return; } obj->items = eina_list_prepend(obj->items, item); item->obj = obj; - if (obj->vg_container) { item->vg = evas_vg_shape_add(obj->vg_container); } - _eext_circle_object_changed(item->obj); } @@ -490,13 +476,13 @@ _eext_circle_object_item_insert_before(Eext_Circle_Object *obj, Eext_Circle_Obje if (obj == item->obj) { - ERR("You are trying to append the item that is already appended"); + LOGE("You are trying to append the item that is already appended"); return; } if (item->obj) { - ERR("You are trying to append the item that is already appended to the other object!"); + LOGE("You are trying to append the item that is already appended to the other object!"); return; } @@ -504,12 +490,10 @@ _eext_circle_object_item_insert_before(Eext_Circle_Object *obj, Eext_Circle_Obje obj->items = eina_list_prepend_relative(obj->items, item, before); item->obj = obj; - if (obj->vg_container) { item->vg = evas_vg_shape_add(obj->vg_container); } - _eext_circle_object_changed(item->obj); } @@ -520,13 +504,13 @@ _eext_circle_object_item_insert_after(Eext_Circle_Object *obj, Eext_Circle_Objec if (obj == item->obj) { - ERR("You are trying to append the item that is already appended"); + LOGE("You are trying to append the item that is already appended"); return; } if (item->obj) { - ERR("You are trying to append the item that is already appended to the other object!"); + LOGE("You are trying to append the item that is already appended to the other object!"); return; } @@ -534,12 +518,10 @@ _eext_circle_object_item_insert_after(Eext_Circle_Object *obj, Eext_Circle_Objec obj->items = eina_list_append_relative(obj->items, item, after); item->obj = obj; - if (obj->vg_container) { item->vg = evas_vg_shape_add(obj->vg_container); } - _eext_circle_object_changed(item->obj); } @@ -646,6 +628,14 @@ _eext_circle_object_item_angle_get(const Eext_Circle_Object_Item *item) return item->angle; } +double +_eext_circle_object_item_draw_angle_offset_get(const Eext_Circle_Object_Item *item) +{ + if (!item) return -1.0; + + return item->draw.angle_offset; +} + void _eext_circle_object_item_angle_offset_set(Eext_Circle_Object_Item *item, double angle_offset) { @@ -669,7 +659,7 @@ _eext_circle_object_item_angle_offset_get(const Eext_Circle_Object_Item *item) void _eext_circle_object_item_angle_min_max_set(Eext_Circle_Object_Item *item, double min_angle, double max_angle) { - double angle = 0.0, value; + double angle = 0.0; if (!item) return; @@ -691,8 +681,7 @@ _eext_circle_object_item_angle_min_max_set(Eext_Circle_Object_Item *item, double if (item->angle == angle) return; item->angle = angle; - value = _eext_circle_object_item_angle_value_get(item, item->angle); - _eext_circle_object_item_value_set_internal(item, value, EINA_TRUE); + item->value = _eext_circle_object_item_angle_value_get(item, item->angle); item->draw.angle = item->angle; _eext_circle_object_changed(item->obj); @@ -732,10 +721,8 @@ _eext_circle_object_item_value_min_max_set(Eext_Circle_Object_Item *item, double item->min_value = min_value; item->max_value = max_value; - if (item->value < item->min_value) - _eext_circle_object_item_value_set_internal(item, item->min_value, EINA_TRUE); - if (item->value > item->max_value) - _eext_circle_object_item_value_set_internal(item, item->max_value, EINA_TRUE); + if (item->value < item->min_value) item->value = item->min_value; + if (item->value > item->max_value) item->value = item->max_value; angle = _eext_circle_object_item_value_angle_get(item, item->value); @@ -774,7 +761,7 @@ _eext_circle_object_item_value_set(Eext_Circle_Object_Item *item, double value) _eext_circle_object_changed(item->obj); } - if (_eext_circle_object_item_value_set_internal(item, value, EINA_TRUE)) + if (_eext_circle_object_item_value_set_internal(item, value)) { item->draw.angle = item->angle; _eext_circle_object_changed(item->obj); @@ -795,6 +782,7 @@ _eext_circle_object_item_color_set(Eext_Circle_Object_Item *item, { if (!item) return; + item->color_changed = EINA_TRUE; if (item->color_transit.animator_cb) { _eext_circle_object_item_color_transit_animator_del(item); @@ -880,7 +868,7 @@ _eext_circle_object_item_text_set(Eext_Circle_Object_Item *item, if (!selected_font) { - ERR("There is no font for the text: %s", text); + LOGE("There is no font for the text: %s", text); } eina_stringshare_replace(&item->selected_font, selected_font); @@ -991,7 +979,6 @@ _eext_circle_object_item_angle_transit_set(Eext_Circle_Object_Item *item, double double cubic_bezier_p2_x, double cubic_bezier_p2_y) { Eina_Bool ret; - double value; if (!item) return; @@ -1002,10 +989,7 @@ _eext_circle_object_item_angle_transit_set(Eext_Circle_Object_Item *item, double cubic_bezier_p2_x, cubic_bezier_p2_y); if (ret) - { - value = _eext_circle_object_item_angle_value_get(item, item->angle); - _eext_circle_object_item_value_set_internal(item, value, EINA_TRUE); - } + item->value = _eext_circle_object_item_angle_value_get(item, item->angle); } void @@ -1030,7 +1014,11 @@ _eext_circle_object_item_value_transit_set(Eext_Circle_Object_Item *item, double cubic_bezier_p2_x, cubic_bezier_p2_y); if (ret) - _eext_circle_object_item_value_set_internal(item, to_value, EINA_TRUE); + { + if (to_value < item->min_value) to_value = item->min_value; + if (to_value > item->max_value) to_value = item->max_value; + item->value = to_value; + } } void diff --git a/src/wearable/circle/efl_extension_circle_object_progressbar.c b/src/wearable/circle/efl_extension_circle_object_progressbar.c index 704c379..8b2ca5d 100644 --- a/src/wearable/circle/efl_extension_circle_object_progressbar.c +++ b/src/wearable/circle/efl_extension_circle_object_progressbar.c @@ -53,9 +53,105 @@ #define PROGRESSBAR_WIDTH_SIZE 6 #define PROGRESSBAR_RADIUS_SIZE 177 +static void +_update_color_info(Eext_Circle_Object *obj) +{ + EEXT_CIRCLE_OBJECT_PROGRESSBAR_DATA_GET(obj, data) return; + + Eext_Circle_Color ext_color; + //default color + if (!edje_object_color_class_get(elm_layout_edje_get(data->parent), "B065L2", &ext_color.r, &ext_color.g, &ext_color.b, &ext_color.a, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)) + if (!edje_color_class_get("B065L2", &ext_color.r, &ext_color.g, &ext_color.b, &ext_color.a, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)) + { + ext_color.r = PROGRESSBAR_COLOR_R; + ext_color.g = PROGRESSBAR_COLOR_G; + ext_color.b = PROGRESSBAR_COLOR_B; + ext_color.a = PROGRESSBAR_COLOR_A; + } + data->color.r = ext_color.r; + data->color.g = ext_color.g; + data->color.b = ext_color.b; + data->color.a = ext_color.a; + + //disabled color + if (!edje_object_color_class_get(elm_layout_edje_get(data->parent), "B104L2D", &ext_color.r, &ext_color.g, &ext_color.b, &ext_color.a, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)) + if (!edje_color_class_get("B104L2D", &ext_color.r, &ext_color.g, &ext_color.b, &ext_color.a, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)) + { + ext_color.r = PROGRESSBAR_COLOR_DISABLED_R; + ext_color.g = PROGRESSBAR_COLOR_DISABLED_G; + ext_color.b = PROGRESSBAR_COLOR_DISABLED_B; + ext_color.a = PROGRESSBAR_COLOR_DISABLED_A; + } + data->disabled_color.r = ext_color.r; + data->disabled_color.g = ext_color.g; + data->disabled_color.b = ext_color.b; + data->disabled_color.a = ext_color.a; + + //BG color + if (!edje_object_color_class_get(elm_layout_edje_get(data->parent), "B065L3", &ext_color.r, &ext_color.g, &ext_color.b, &ext_color.a, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)) + if (!edje_color_class_get("B065L3", &ext_color.r, &ext_color.g, &ext_color.b, &ext_color.a, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)) + { + ext_color.r = PROGRESSBAR_BG_COLOR_R; + ext_color.g = PROGRESSBAR_BG_COLOR_G; + ext_color.b = PROGRESSBAR_BG_COLOR_B; + ext_color.a = PROGRESSBAR_BG_COLOR_A; + } + data->bg_color.r = ext_color.r; + data->bg_color.g = ext_color.g; + data->bg_color.b = ext_color.b; + data->bg_color.a = ext_color.a; + + //disabled BG color + if (!edje_object_color_class_get(elm_layout_edje_get(data->parent), "B104L1D", &ext_color.r, &ext_color.g, &ext_color.b, &ext_color.a, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)) + if (!edje_color_class_get("B104L1D", &ext_color.r, &ext_color.g, &ext_color.b, &ext_color.a, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)) + { + ext_color.r = PROGRESSBAR_BG_COLOR_DISABLED_R; + ext_color.g = PROGRESSBAR_BG_COLOR_DISABLED_G; + ext_color.b = PROGRESSBAR_BG_COLOR_DISABLED_B; + ext_color.a = PROGRESSBAR_BG_COLOR_DISABLED_A; + } + data->disabled_bg_color.r = ext_color.r; + data->disabled_bg_color.g = ext_color.g; + data->disabled_bg_color.b = ext_color.b; + data->disabled_bg_color.a = ext_color.a; +} + +static void +_eext_circle_object_progressbar_change_color_signal_cb(void *data, Evas_Object *obj, const char *emission, const char *source) +{ + LOGI("theme is changed"); + + Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data; + + EEXT_CIRCLE_OBJECT_PROGRESSBAR_DATA_GET(circle_obj, progressbar_data) return; + + _update_color_info(circle_obj); + + Eext_Circle_Object_Item *item = NULL; + + item = _eext_circle_object_item_get(circle_obj, PROGRESSBAR_BG_ITEM_NAME); + if (item) + { + _eext_circle_object_item_color_set(item, progressbar_data->bg_color.r, progressbar_data->bg_color.g, progressbar_data->bg_color.b, progressbar_data->bg_color.a); + } + item = _eext_circle_object_item_get(circle_obj, PROGRESSBAR_ITEM_NAME); + if (item) + { + _eext_circle_object_item_color_set(item, progressbar_data->color.r, progressbar_data->color.g, progressbar_data->color.b, progressbar_data->color.a); + } +} + + static void _eext_circle_object_progressbar_del_cb(Eext_Circle_Object *obj) { + EEXT_CIRCLE_OBJECT_PROGRESSBAR_DATA_GET(obj, data) return; + + edje_object_signal_callback_del(elm_layout_edje_get(data->parent), "color_class,set", "B065L2", _eext_circle_object_progressbar_change_color_signal_cb); + edje_object_signal_callback_del(elm_layout_edje_get(data->parent), "color_class,set", "B104L2D", _eext_circle_object_progressbar_change_color_signal_cb); + edje_object_signal_callback_del(elm_layout_edje_get(data->parent), "color_class,set", "B065L3", _eext_circle_object_progressbar_change_color_signal_cb); + edje_object_signal_callback_del(elm_layout_edje_get(data->parent), "color_class,set", "B104L1D", _eext_circle_object_progressbar_change_color_signal_cb); + if (obj->widget_data) { free(obj->widget_data); @@ -140,7 +236,7 @@ _eext_circle_object_progressbar_disabled_cb(Eext_Circle_Object *obj) } static void -_eext_circle_object_progressbar_init(Eext_Circle_Object *obj) +_eext_circle_object_progressbar_init(Evas_Object *parent, Eext_Circle_Object *obj) { Eext_Circle_Object_Item *item; Eext_Circle_Object_Progressbar_Data *data; @@ -152,23 +248,10 @@ _eext_circle_object_progressbar_init(Eext_Circle_Object *obj) obj->color_changed_func = _eext_circle_object_progressbar_color_changed_cb; data = (Eext_Circle_Object_Progressbar_Data *)calloc(1, sizeof(Eext_Circle_Object_Progressbar_Data)); - data->color.r = PROGRESSBAR_COLOR_R; - data->color.g = PROGRESSBAR_COLOR_G; - data->color.b = PROGRESSBAR_COLOR_B; - data->color.a = PROGRESSBAR_COLOR_A; - data->bg_color.r = PROGRESSBAR_BG_COLOR_R; - data->bg_color.g = PROGRESSBAR_BG_COLOR_G; - data->bg_color.b = PROGRESSBAR_BG_COLOR_B; - data->bg_color.a = PROGRESSBAR_BG_COLOR_A; - data->disabled_color.r = PROGRESSBAR_COLOR_DISABLED_R; - data->disabled_color.g = PROGRESSBAR_COLOR_DISABLED_G; - data->disabled_color.b = PROGRESSBAR_COLOR_DISABLED_B; - data->disabled_color.a = PROGRESSBAR_COLOR_DISABLED_A; - data->disabled_bg_color.r = PROGRESSBAR_BG_COLOR_DISABLED_R; - data->disabled_bg_color.g = PROGRESSBAR_BG_COLOR_DISABLED_G; - data->disabled_bg_color.b = PROGRESSBAR_BG_COLOR_DISABLED_B; - data->disabled_bg_color.a = PROGRESSBAR_BG_COLOR_DISABLED_A; + data->parent = parent; + obj->widget_data = (void *)data; + _update_color_info(obj); item = _eext_circle_object_item_new(); _eext_circle_object_item_name_set(item, PROGRESSBAR_BG_ITEM_NAME); @@ -211,7 +294,12 @@ eext_circle_object_progressbar_add(Evas_Object *parent, Eext_Circle_Surface *sur EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return NULL; - _eext_circle_object_progressbar_init(circle_obj); + _eext_circle_object_progressbar_init(parent, circle_obj); + + edje_object_signal_callback_add(elm_layout_edje_get(parent), "color_class,set", "B065L2", _eext_circle_object_progressbar_change_color_signal_cb, circle_obj); + edje_object_signal_callback_add(elm_layout_edje_get(parent), "color_class,set", "B104L2D", _eext_circle_object_progressbar_change_color_signal_cb, circle_obj); + edje_object_signal_callback_add(elm_layout_edje_get(parent), "color_class,set", "B065L3", _eext_circle_object_progressbar_change_color_signal_cb, circle_obj); + edje_object_signal_callback_add(elm_layout_edje_get(parent), "color_class,set", "B104L1D", _eext_circle_object_progressbar_change_color_signal_cb, circle_obj); /* Accessibility */ if (!surface) diff --git a/src/wearable/circle/efl_extension_circle_object_scroller.c b/src/wearable/circle/efl_extension_circle_object_scroller.c index b5637b6..c8190ac 100644 --- a/src/wearable/circle/efl_extension_circle_object_scroller.c +++ b/src/wearable/circle/efl_extension_circle_object_scroller.c @@ -26,6 +26,7 @@ #define VERTICAL_BAR_ANGLE_RANGE 60.0 #define VERTICAL_BAR_ANGLE_MAX_SIZE 60.0 #define VERTICAL_BAR_ANGLE_MIN_SIZE 6.0 +#define VERTICAL_BAR_ANGLE_HANDLER_SIZE 15.3 #define HORIZONTAL_BAR_NAME "horizontal,scroll,bar" #define HORIZONTAL_BAR_BG_NAME "horizontal,scroll,bg" @@ -38,6 +39,7 @@ #define SCROLL_BAR_HIDE_WAITTING_TIME 0.2 #define SCROLL_BAR_HIDE_WAITTING_TIME_ON_INITIALIZING 1.0 #define SCROLL_BAR_WIDTH_SIZE 10 +#define SCROLL_BAR_HANDLER_WIDTH_SIZE 32 #define SCROLL_BAR_RADIUS_SIZE 174 // (180 - (BAR_WIDTH / 2) - 1) #define SCROLL_BAR_COLOR_R 14 @@ -60,13 +62,64 @@ #define SCROLL_BAR_BG_COLOR_DISABLED_B 45 #define SCROLL_BAR_BG_COLOR_DISABLED_A 63 +#define SURFACE_WIDTH 360 +#define SIG_SCROLLER_RESUME "scroller,resume" +//ONEUI1.5(04JUL2019) : Change dot's color on bezel rotation +#define BEZEL_SCROLL "bezel_scroll" +static const char SIGNAL_DEACTIVATED[] = "rotary,deactivated"; +// +static const char HANDLER_STYLE[] = "prod/handler"; + +static const int LEFT = 0; +static const int RIGHT = 1; +static const int UP = 2; +static const int DOWN = 3; + +extern Elm_Scrollable_Smart_Interface_Data* __elm_scrollable_smart_interface_data_get(Eo *obj); + #define EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(circle_obj, data) \ Eext_Circle_Object_Scroller_Data *data = NULL; \ if (circle_obj && circle_obj->widget_data && \ circle_obj->widget_type && !strcmp(circle_obj->widget_type, EEXT_CIRCLE_OBJECT_SCROLLER_TYPE)) \ data = (Eext_Circle_Object_Scroller_Data *)circle_obj->widget_data; \ + if (!data) \ + { \ + LOGE("No widget data for circle object %p (%s)", circle_obj, circle_obj->widget_type); \ + } \ if (!data) +#define EEXT_CIRCLE_OBJECT_SCROLLER_SCROLL_IFACE_DATA_GET(o, ptr) \ + Elm_Scrollable_Smart_Interface_Data *ptr = \ + (Elm_Scrollable_Smart_Interface_Data *)(__elm_scrollable_smart_interface_data_get((Eo *)o)); \ + if (!ptr) \ + { \ + LOGE("No interface data for object %p (%s)", o, evas_object_type_get(o)); \ + } + +#define STR_DUP(x) x ? (char *)eina_stringshare_add(x) : NULL + +Eina_Bool +__elm_product_theme_is_loaded(void) +{ + return EINA_FALSE; +} + +static Eina_Bool +_eext_circle_object_scroller_mirror_mode_get(Eext_Circle_Object *obj) +{ + Eina_Bool is_mirrored = EINA_FALSE; + + if (obj->mirrored_state == EEXT_CIRCLE_MIRRORED_CONFIG) + is_mirrored = elm_config_mirrored_get(); + else if (obj->mirrored_state == EEXT_CIRCLE_MIRRORED_ON) + is_mirrored = EINA_TRUE; + + if(obj->widget_object) + is_mirrored = elm_object_mirrored_get(obj->widget_object); + + return is_mirrored; +} + static void _eext_circle_object_scroller_color_changed_cb(Eext_Circle_Object *obj, const char *item_name) { @@ -129,19 +182,52 @@ _eext_circle_object_scroller_scrollbar_policy_hide_cb(void *data) EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(obj, widget_data) return ECORE_CALLBACK_CANCEL; + if (widget_data->bar_hide_timer) + { + ecore_timer_del(widget_data->bar_hide_timer); + widget_data->bar_hide_timer = NULL; + } + + if (widget_data->handler) + { + elm_layout_signal_emit(widget_data->handler_layout, "elm,state,handler,hidden", "elm"); + return ECORE_CALLBACK_CANCEL; + } + if (widget_data->policy_v == ELM_SCROLLER_POLICY_AUTO) { item = _eext_circle_object_item_get(obj, VERTICAL_BAR_NAME); bg_item = _eext_circle_object_item_get(obj, VERTICAL_BAR_BG_NAME); - _eext_circle_object_item_color_transit_set(item, SCROLL_BAR_TRANSIT_TIME, - 0, 0, 0, 0, + //ONEUI1.5(31July2019): Fix VI effect logic about hide + if (widget_data->bezel_on) + { + _eext_circle_object_item_color_transit_set(item, SCROLL_BAR_TRANSIT_TIME, + widget_data->bezel_vertical_color.r, + widget_data->bezel_vertical_color.g, + widget_data->bezel_vertical_color.b, + 0, EINA_TRUE, - 0.25, 0.46, 0.45, 1.0); + 0.0, 0.0, 1.0, 1.0); + } + else + // + { + _eext_circle_object_item_color_transit_set(item, SCROLL_BAR_TRANSIT_TIME, + widget_data->vertical_color.r, + widget_data->vertical_color.g, + widget_data->vertical_color.b, + 0, + EINA_TRUE, + 0.0, 0.0, 1.0, 1.0); + } _eext_circle_object_item_color_transit_set(bg_item, SCROLL_BAR_TRANSIT_TIME, - 0, 0, 0, 0, + widget_data->vertical_bg_color.r, + widget_data->vertical_bg_color.g, + widget_data->vertical_bg_color.b, + 0, EINA_TRUE, - 0.25, 0.46, 0.45, 1.0); + 0.0, 0.0, 1.0, 1.0); } if (widget_data->policy_h == ELM_SCROLLER_POLICY_AUTO) @@ -149,20 +235,35 @@ _eext_circle_object_scroller_scrollbar_policy_hide_cb(void *data) item = _eext_circle_object_item_get(obj, HORIZONTAL_BAR_NAME); bg_item = _eext_circle_object_item_get(obj, HORIZONTAL_BAR_BG_NAME); - _eext_circle_object_item_color_transit_set(item, SCROLL_BAR_TRANSIT_TIME, - 0, 0, 0, 0, + //ONEUI1.5(31July2019): Fix VI effect logic about hide + if (widget_data->bezel_on) + { + _eext_circle_object_item_color_transit_set(item, SCROLL_BAR_TRANSIT_TIME, + widget_data->bezel_horizontal_color.r, + widget_data->bezel_horizontal_color.g, + widget_data->bezel_horizontal_color.b, + 0, + EINA_TRUE, + 0.0, 0.0, 1.0, 1.0); + } + else + { + _eext_circle_object_item_color_transit_set(item, SCROLL_BAR_TRANSIT_TIME, + widget_data->horizontal_color.r, + widget_data->horizontal_color.g, + widget_data->horizontal_color.b, + 0, EINA_TRUE, - 0.25, 0.46, 0.45, 1.0); + 0.0, 0.0, 1.0, 1.0); + } _eext_circle_object_item_color_transit_set(bg_item, SCROLL_BAR_TRANSIT_TIME, - 0, 0, 0, 0, + widget_data->horizontal_bg_color.r, + widget_data->horizontal_bg_color.g, + widget_data->horizontal_bg_color.b, + 0, EINA_TRUE, - 0.25, 0.46, 0.45, 1.0); - } - - if (widget_data->bar_hide_timer) - { - ecore_timer_del(widget_data->bar_hide_timer); - widget_data->bar_hide_timer = NULL; + 0.0, 0.0, 1.0, 1.0); + // } return ECORE_CALLBACK_CANCEL; @@ -183,89 +284,127 @@ _eext_circle_object_scroller_scrollbar_update(Eext_Circle_Object *obj, EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(obj, data) return; - Eina_Size2D size; - Eina_Rect rect; - Eina_Position2D pos; - - //C# FIXME: Optimize the code - if (efl_isa(obj->widget_object, EFL_UI_LEGACY_INTERFACE)) - { - elm_scroller_child_size_get(scroller, &content_w, &content_h); - elm_scroller_region_get(scroller, &position_x, &position_y, &viewport_w, &viewport_h); - } - else - { - size = efl_ui_scrollable_content_size_get(obj->widget_object); - rect = efl_ui_scrollable_viewport_geometry_get(obj->widget_object); - pos = efl_ui_scrollable_content_pos_get(obj->widget_object); - - content_w = size.w; - content_h = size.h; - - viewport_w = rect.w; - viewport_h = rect.h; - - position_x = pos.x; - position_y = pos.y; - } + is_mirrored = _eext_circle_object_scroller_mirror_mode_get(obj); + elm_scroller_child_size_get(scroller, &content_w, &content_h); + elm_scroller_region_get(scroller, &position_x, &position_y, &viewport_w, &viewport_h); item = _eext_circle_object_item_get(obj, VERTICAL_BAR_NAME); bg_item = _eext_circle_object_item_get(obj, VERTICAL_BAR_BG_NAME); if ((content_h > 0.0) && (viewport_h > 0.0) && - (data->policy_v != ELM_SCROLLER_POLICY_OFF)) + (data->policy_v != ELM_SCROLLER_POLICY_OFF) && (viewport_h < content_h)) { if (content_h > viewport_h) { - bar_size_v = VERTICAL_BAR_ANGLE_RANGE / ((double)content_h / (double)viewport_h); + if (data->handler) + { + bar_size_v = VERTICAL_BAR_ANGLE_HANDLER_SIZE; + } + else + { + bar_size_v = VERTICAL_BAR_ANGLE_RANGE / ((double)content_h / (double)viewport_h); + + if (bar_size_v > VERTICAL_BAR_ANGLE_MAX_SIZE) + bar_size_v = VERTICAL_BAR_ANGLE_MAX_SIZE; + if (bar_size_v < VERTICAL_BAR_ANGLE_MIN_SIZE) + bar_size_v = VERTICAL_BAR_ANGLE_MIN_SIZE; + } - if (bar_size_v > VERTICAL_BAR_ANGLE_MAX_SIZE) - bar_size_v = VERTICAL_BAR_ANGLE_MAX_SIZE; - if (bar_size_v < VERTICAL_BAR_ANGLE_MIN_SIZE) - bar_size_v = VERTICAL_BAR_ANGLE_MIN_SIZE; + bar_pos_v = (VERTICAL_BAR_ANGLE_RANGE - bar_size_v) * position_y / (content_h - viewport_h); } else - bar_size_v = VERTICAL_BAR_ANGLE_MAX_SIZE; + { + bar_size_v = VERTICAL_BAR_ANGLE_MAX_SIZE; + bar_pos_v = (VERTICAL_BAR_ANGLE_RANGE / (double)content_h) * (double)position_y; + } - bar_pos_v = (VERTICAL_BAR_ANGLE_RANGE / (double)content_h) * (double)position_y; + if (is_mirrored) + { + bar_pos_v = -bar_pos_v; + bar_pos_v += VERTICAL_BAR_ANGLE_RANGE; + } bar_pos_v += VERTICAL_BAR_ANGLE_START; _eext_circle_object_item_angle_offset_set(item, bar_pos_v); _eext_circle_object_item_angle_set(item, bar_size_v); - if (obj->disabled) + if (data->handler) { - _eext_circle_object_item_color_transit_set(item, SCROLL_BAR_TRANSIT_TIME, - data->disabled_color.r, - data->disabled_color.g, - data->disabled_color.b, - data->disabled_color.a, - EINA_TRUE, - 0.25, 0.46, 0.45, 1.0); - _eext_circle_object_item_color_transit_set(bg_item, SCROLL_BAR_TRANSIT_TIME, - data->disabled_bg_color.r, - data->disabled_bg_color.g, - data->disabled_bg_color.b, - data->disabled_bg_color.a, - EINA_TRUE, - 0.25, 0.46, 0.45, 1.0); + Evas_Map *m = evas_map_new(4); + evas_map_util_points_populate_from_object(m, data->handler_layout); + // layout is 90 degrees ahead so 90 needs to be subtracted here + if (is_mirrored) + data->handler_angle = bar_pos_v - 90 - VERTICAL_BAR_ANGLE_HANDLER_SIZE / 2; + else + data->handler_angle = bar_pos_v - 90 + VERTICAL_BAR_ANGLE_HANDLER_SIZE / 2; + evas_map_util_rotate(m, data->handler_angle, SURFACE_WIDTH / 2, SURFACE_WIDTH / 2); + evas_object_map_set(data->handler_layout, m); + evas_object_map_enable_set(data->handler_layout, EINA_TRUE); + evas_map_free(m); + evas_object_show(data->handler_layout); } + + if (bar_pos_v > 0) + _eext_circle_object_item_angle_set(bg_item, VERTICAL_BAR_ANGLE_MAX_SIZE); else + _eext_circle_object_item_angle_set(bg_item, 0.0); + + if (data->handler) { - _eext_circle_object_item_color_transit_set(item, SCROLL_BAR_TRANSIT_TIME, - data->vertical_color.r, - data->vertical_color.g, - data->vertical_color.b, - data->vertical_color.a, - EINA_TRUE, - 0.25, 0.46, 0.45, 1.0); - _eext_circle_object_item_color_transit_set(bg_item, SCROLL_BAR_TRANSIT_TIME, + data->handler_shown = EINA_TRUE; + elm_layout_signal_emit(data->handler_layout, "elm,state,handler,visible", "elm"); + } + else + { + if (obj->disabled) + { + _eext_circle_object_item_color_transit_set(item, SCROLL_BAR_TRANSIT_TIME, + data->disabled_color.r, + data->disabled_color.g, + data->disabled_color.b, + data->disabled_color.a, + EINA_TRUE, + 0.0, 0.0, 1.0, 1.0); + _eext_circle_object_item_color_transit_set(bg_item, SCROLL_BAR_TRANSIT_TIME, + data->disabled_bg_color.r, + data->disabled_bg_color.g, + data->disabled_bg_color.b, + data->disabled_bg_color.a, + EINA_TRUE, + 0.0, 0.0, 1.0, 1.0); + } + else + { + //ONEUI1.5(04July2019): Support different color with bezel + if (data->bezel_on) + { + _eext_circle_object_item_color_transit_set(item, SCROLL_BAR_TRANSIT_TIME, + data->bezel_vertical_color.r, + data->bezel_vertical_color.g, + data->bezel_vertical_color.b, + data->bezel_vertical_color.a, + EINA_TRUE, + 0.0, 0.0, 1.0, 1.0); + } + else + // + { + _eext_circle_object_item_color_transit_set(item, SCROLL_BAR_TRANSIT_TIME, + data->vertical_color.r, + data->vertical_color.g, + data->vertical_color.b, + data->vertical_color.a, + EINA_TRUE, + 0.0, 0.0, 1.0, 1.0); + } + _eext_circle_object_item_color_transit_set(bg_item, SCROLL_BAR_TRANSIT_TIME, data->vertical_bg_color.r, data->vertical_bg_color.g, data->vertical_bg_color.b, data->vertical_bg_color.a, EINA_TRUE, - 0.25, 0.46, 0.45, 1.0); + 0.0, 0.0, 1.0, 1.0); + } } } else @@ -278,7 +417,7 @@ _eext_circle_object_scroller_scrollbar_update(Eext_Circle_Object *obj, bg_item = _eext_circle_object_item_get(obj, HORIZONTAL_BAR_BG_NAME); if ((content_w > 0.0) && (viewport_w > 0.0) && - (data->policy_h != ELM_SCROLLER_POLICY_OFF)) + (data->policy_h != ELM_SCROLLER_POLICY_OFF) && (viewport_w < content_w)) { if (content_w > viewport_w) { @@ -288,15 +427,12 @@ _eext_circle_object_scroller_scrollbar_update(Eext_Circle_Object *obj, bar_size_h = HORIZONTAL_BAR_ANGLE_MAX_SIZE; if (bar_size_h < HORIZONTAL_BAR_ANGLE_MIN_SIZE) bar_size_h = HORIZONTAL_BAR_ANGLE_MIN_SIZE; + + bar_pos_h = (HORIZONTAL_BAR_ANGLE_RANGE - bar_size_h) * position_x / (content_w - viewport_w); } else bar_size_h = HORIZONTAL_BAR_ANGLE_MAX_SIZE; - if (obj->mirrored_state == EEXT_CIRCLE_MIRRORED_CONFIG) - is_mirrored = elm_config_mirrored_get(); - else if (obj->mirrored_state == EEXT_CIRCLE_MIRRORED_ON) - is_mirrored = EINA_TRUE; - if (is_mirrored) bar_pos_h = (HORIZONTAL_BAR_ANGLE_RANGE / (double)content_w) * ((double)content_w - ((double)position_x + (double)viewport_w)); else @@ -306,6 +442,11 @@ _eext_circle_object_scroller_scrollbar_update(Eext_Circle_Object *obj, _eext_circle_object_item_angle_offset_set(item, bar_pos_h); _eext_circle_object_item_angle_set(item, bar_size_h); + if (bar_size_h > 0) + _eext_circle_object_item_angle_set(bg_item, HORIZONTAL_BAR_ANGLE_MAX_SIZE); + else + _eext_circle_object_item_angle_set(bg_item, 0.0); + if (obj->disabled) { _eext_circle_object_item_color_transit_set(item, SCROLL_BAR_TRANSIT_TIME, @@ -314,31 +455,46 @@ _eext_circle_object_scroller_scrollbar_update(Eext_Circle_Object *obj, data->disabled_color.b, data->disabled_color.a, EINA_TRUE, - 0.25, 0.46, 0.45, 1.0); + 0.0, 0.0, 1.0, 1.0); _eext_circle_object_item_color_transit_set(bg_item, SCROLL_BAR_TRANSIT_TIME, data->disabled_bg_color.r, data->disabled_bg_color.g, data->disabled_bg_color.b, data->disabled_bg_color.a, EINA_TRUE, - 0.25, 0.46, 0.45, 1.0); + 0.0, 0.0, 1.0, 1.0); } else { - _eext_circle_object_item_color_transit_set(item, SCROLL_BAR_TRANSIT_TIME, + //ONEUI1.5(04July2019): Support different color with bezel + if (data->bezel_on) + { + _eext_circle_object_item_color_transit_set(item, SCROLL_BAR_TRANSIT_TIME, + data->bezel_horizontal_color.r, + data->bezel_horizontal_color.g, + data->bezel_horizontal_color.b, + data->bezel_horizontal_color.a, + EINA_TRUE, + 0.0, 0.0, 1.0, 1.0); + } + // + else + { + _eext_circle_object_item_color_transit_set(item, SCROLL_BAR_TRANSIT_TIME, data->horizontal_color.r, data->horizontal_color.g, data->horizontal_color.b, data->horizontal_color.a, EINA_TRUE, - 0.25, 0.46, 0.45, 1.0); + 0.0, 0.0, 1.0, 1.0); + } _eext_circle_object_item_color_transit_set(bg_item, SCROLL_BAR_TRANSIT_TIME, data->horizontal_bg_color.r, data->horizontal_bg_color.g, data->horizontal_bg_color.b, data->horizontal_bg_color.a, EINA_TRUE, - 0.25, 0.46, 0.45, 1.0); + 0.0, 0.0, 1.0, 1.0); } } else @@ -348,6 +504,7 @@ _eext_circle_object_scroller_scrollbar_update(Eext_Circle_Object *obj, } if ((hide_waiting_time > 0.0) && + (!data->handler_drag) && ((data->policy_v == ELM_SCROLLER_POLICY_AUTO) || (data->policy_h == ELM_SCROLLER_POLICY_AUTO))) { @@ -360,12 +517,9 @@ _eext_circle_object_scroller_scrollbar_update(Eext_Circle_Object *obj, } } -//C# FIXME: Optimize the code static void -_scroll_cb(void *data EINA_UNUSED, const Efl_Event *ev) +_update_scrollbar(Eext_Circle_Object *circle_obj, double hide_waiting_time) { - Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data; - EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(circle_obj, widget_data) return; if ((widget_data->policy_v == ELM_SCROLLER_POLICY_OFF) && @@ -373,7 +527,7 @@ _scroll_cb(void *data EINA_UNUSED, const Efl_Event *ev) return; _eext_circle_object_scroller_scrollbar_update(circle_obj, - 0.3); + hide_waiting_time); } static void @@ -383,33 +537,30 @@ _eext_circle_object_scroller_scroll_cb(void *data, { Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data; - EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(circle_obj, widget_data) return; - - if ((widget_data->policy_v == ELM_SCROLLER_POLICY_OFF) && - (widget_data->policy_h == ELM_SCROLLER_POLICY_OFF)) - return; - - _eext_circle_object_scroller_scrollbar_update(circle_obj, - SCROLL_BAR_HIDE_WAITTING_TIME); + _update_scrollbar(circle_obj, SCROLL_BAR_HIDE_WAITTING_TIME); } static void -_eext_circle_object_scroller_show_cb(void *data, - Evas *e, +_eext_circle_object_scroller_resume_cb(void *data, Evas_Object *obj, void *event_info) { Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data; - EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(circle_obj, widget_data) return; + _update_scrollbar(circle_obj, SCROLL_BAR_HIDE_WAITTING_TIME_ON_INITIALIZING); +} - if ((widget_data->policy_v == ELM_SCROLLER_POLICY_OFF) && - (widget_data->policy_h == ELM_SCROLLER_POLICY_OFF)) - return; +//ONEUI1.5(11JUN2019): Update scrollbar size on viewport resize +static void +_eext_circle_object_scroller_viewport_resize_cb(void *data, + Evas_Object *obj, + void *event_info) +{ + Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data; - _eext_circle_object_scroller_scrollbar_update(circle_obj, - SCROLL_BAR_HIDE_WAITTING_TIME_ON_INITIALIZING); + _update_scrollbar(circle_obj, SCROLL_BAR_HIDE_WAITTING_TIME_ON_INITIALIZING); } +// static void _eext_circle_object_scroller_content_resize_cb(void *data, @@ -418,14 +569,445 @@ _eext_circle_object_scroller_content_resize_cb(void *data, { Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data; + _update_scrollbar(circle_obj, SCROLL_BAR_HIDE_WAITTING_TIME_ON_INITIALIZING); +} + +static Eina_Bool +_eext_circle_object_scroller_can_scroll(Elm_Scrollable_Smart_Interface_Data *sid, int dir) +{ + Evas_Coord mx = 0, my = 0, px = 0, py = 0, minx = 0, miny = 0; + + if (!sid->pan_obj) return EINA_FALSE; + + elm_obj_pan_pos_max_get(sid->pan_obj, &mx, &my); + elm_obj_pan_pos_min_get(sid->pan_obj, &minx, &miny); + elm_obj_pan_pos_get(sid->pan_obj, &px, &py); + + LOGE("[%p] mx(%d), my(%d), minx(%d), miny(%d), px(%d), py(%d)", sid->obj, mx, my, minx, miny, px, py); + switch (dir) + { + case 0: + if (px > minx) return EINA_TRUE; + break; + + case 1: + if ((px - minx) < mx) return EINA_TRUE; + break; + + case 2: + if (py > miny) return EINA_TRUE; + break; + + case 3: + if ((py - miny) < my) return EINA_TRUE; + break; + + default: + break; + } + return EINA_FALSE; +} + +static void +_eext_circle_object_scroller_scroll_animatioin_stop_cb(void *data, + Evas_Object *obj, + void *event_info) +{ + Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data; + EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(circle_obj, widget_data) return; - if ((widget_data->policy_v == ELM_SCROLLER_POLICY_OFF) && - (widget_data->policy_h == ELM_SCROLLER_POLICY_OFF)) + Evas_Object *scroller = circle_obj->widget_object; + + EEXT_CIRCLE_OBJECT_SCROLLER_SCROLL_IFACE_DATA_GET(scroller, sid); + if (sid == NULL) return ; + + int pagenumber_h = 0, pagenumber_v = 0; + int last_pagenumber_v = 0, last_pagenumber_h = 0; + //ONEUI1.5(04JUL2019) : Change dot's color on bezel rotation + Evas_Object *top_widget = NULL; + if (__elm_product_theme_is_loaded()) + top_widget = elm_object_top_widget_get(scroller); + // + + elm_scroller_last_page_get(scroller, &last_pagenumber_h, &last_pagenumber_v); + elm_scroller_current_page_get(scroller, &pagenumber_h, &pagenumber_v); + + LOGE("[%p] detent_count(%d) pagenumber_v(%d), pagenumber_h(%d)", scroller, sid->rotary_animation_info.detent_count, pagenumber_v, pagenumber_h); + + if (sid->pagesize_h > 0) + { + if (sid->rotary_animation_info.current_page != pagenumber_h) + { + if (sid->rotary_animation_info.detent_count != 0) + { + if ((sid->rotary_animation_info.current_page == 0) && (sid->rotary_animation_info.detent_count < 0)) + sid->rotary_animation_info.detent_count = 0; + else if((sid->rotary_animation_info.current_page == last_pagenumber_h) && (sid->rotary_animation_info.detent_count > 0)) + sid->rotary_animation_info.detent_count = 0; + else + { + if ((sid->rotary_animation_info.detent_count > 0 && (sid->rotary_animation_info.current_page - pagenumber_h) > 0) || + (sid->rotary_animation_info.detent_count < 0 && (sid->rotary_animation_info.current_page - pagenumber_h) < 0)) + sid->rotary_animation_info.detent_count = 0; + else + sid->rotary_animation_info.detent_count += (sid->rotary_animation_info.current_page - pagenumber_h); + + if (pagenumber_h + sid->rotary_animation_info.detent_count < 0) + sid->rotary_animation_info.detent_count++; + else if(pagenumber_h + sid->rotary_animation_info.detent_count > last_pagenumber_h) + sid->rotary_animation_info.detent_count--; + } + } + sid->rotary_animation_info.current_page = pagenumber_h; + LOGE("[%p] CurrentPage(%d)", scroller, sid->rotary_animation_info.current_page); + } + else + { + sid->rotary_animation_info.detent_count = 0; + } + //ONEUI1.5(04JUL2019) : Change dot's color on bezel rotation + if (top_widget) + evas_object_data_set(top_widget, BEZEL_SCROLL, (void*)1); + // + } + else if (sid->pagesize_v > 0) + { + if (sid->rotary_animation_info.current_page != pagenumber_v) + { + if (sid->rotary_animation_info.detent_count != 0) + { + if ((sid->rotary_animation_info.current_page == 0) && (sid->rotary_animation_info.detent_count < 0)) + sid->rotary_animation_info.detent_count = 0; + else if ((sid->rotary_animation_info.current_page == last_pagenumber_v) && (sid->rotary_animation_info.detent_count > 0)) + sid->rotary_animation_info.detent_count = 0; + else + { + if ((sid->rotary_animation_info.detent_count > 0 && (sid->rotary_animation_info.current_page - pagenumber_v) > 0) || + (sid->rotary_animation_info.detent_count < 0 && (sid->rotary_animation_info.current_page - pagenumber_v) < 0)) + sid->rotary_animation_info.detent_count = 0; + else + sid->rotary_animation_info.detent_count += (sid->rotary_animation_info.current_page - pagenumber_v); + + if (pagenumber_v + sid->rotary_animation_info.detent_count < 0) + sid->rotary_animation_info.detent_count++; + else if(pagenumber_v + sid->rotary_animation_info.detent_count > last_pagenumber_v) + sid->rotary_animation_info.detent_count--; + } + } + sid->rotary_animation_info.current_page = pagenumber_v; + LOGE("[%p] CurrentPage(%d)", scroller, sid->rotary_animation_info.current_page); + } + else + { + sid->rotary_animation_info.detent_count = 0; + } + //ONEUI1.5(04JUL2019) : Change dot's color on bezel rotation + if (top_widget) + evas_object_data_set(top_widget, BEZEL_SCROLL, (void*)1); + // + } + else + { + if (sid->rotary_animation_info.detent_count != 0) + sid->rotary_animation_info.detent_count = 0; + } +} + +static void +_update_color_info(Eext_Circle_Object *obj) +{ + EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(obj, data) return; + int r, g, b, a; + + if (!edje_object_color_class_get(elm_layout_edje_get(obj->widget_object), data->scrollbar_color_class, &r, &g, &b, &a, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)) + { + r = SCROLL_BAR_COLOR_R; + g = SCROLL_BAR_COLOR_G; + b = SCROLL_BAR_COLOR_B; + a = SCROLL_BAR_COLOR_A; + } + data->vertical_color.r = data->horizontal_color.r = r; + data->vertical_color.g = data->horizontal_color.g = g; + data->vertical_color.b = data->horizontal_color.b = b; + data->vertical_color.a = data->horizontal_color.a = a; + + if (!edje_object_color_class_get(elm_layout_edje_get(obj->widget_object), data->scrollbar_bg_color_class, &r, &g, &b, &a, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)) + { + r = SCROLL_BAR_BG_COLOR_R; + g = SCROLL_BAR_BG_COLOR_G; + b = SCROLL_BAR_BG_COLOR_B; + a = SCROLL_BAR_BG_COLOR_A; + } + data->vertical_bg_color.r = data->horizontal_bg_color.r = r; + data->vertical_bg_color.g = data->horizontal_bg_color.g = g; + data->vertical_bg_color.b = data->horizontal_bg_color.b = b; + data->vertical_bg_color.a = data->horizontal_bg_color.a = a; + + if (!edje_object_color_class_get(elm_layout_edje_get(obj->widget_object), data->bezel_scrollbar_color_class, &r, &g, &b, &a, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)) + { + r = SCROLL_BAR_COLOR_R; + g = SCROLL_BAR_COLOR_G; + b = SCROLL_BAR_COLOR_B; + a = SCROLL_BAR_COLOR_A; + } + data->bezel_vertical_color.r = data->bezel_horizontal_color.r = r; + data->bezel_vertical_color.g = data->bezel_horizontal_color.g = g; + data->bezel_vertical_color.b = data->bezel_horizontal_color.b = b; + data->bezel_vertical_color.a = data->bezel_horizontal_color.a = a; + + data->disabled_color.r = SCROLL_BAR_COLOR_DISABLED_R; + data->disabled_color.g = SCROLL_BAR_COLOR_DISABLED_G; + data->disabled_color.b = SCROLL_BAR_COLOR_DISABLED_B; + data->disabled_color.a = SCROLL_BAR_COLOR_DISABLED_A; + data->disabled_bg_color.r = SCROLL_BAR_BG_COLOR_DISABLED_R; + data->disabled_bg_color.g = SCROLL_BAR_BG_COLOR_DISABLED_G; + data->disabled_bg_color.b = SCROLL_BAR_BG_COLOR_DISABLED_B; + data->disabled_bg_color.a = SCROLL_BAR_BG_COLOR_DISABLED_A; +} + +static void +_eext_circle_object_scroller_change_color_signal_cb(void *data, Evas_Object *obj, const char *emission, const char *source) +{ + Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data; + Evas_Object *scroller = circle_obj->widget_object; + Eext_Circle_Object_Item *item = NULL; + if (!source) return; + int a; + + EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(circle_obj, widget_data) return; + //ONEUI1.5(04July2019): Support different color with bezel + if (widget_data->bezel_scrollbar_color_class && !strcmp(source, widget_data->bezel_scrollbar_color_class)) + { + edje_object_color_class_get(elm_layout_edje_get(scroller), widget_data->bezel_scrollbar_color_class, + &widget_data->bezel_vertical_color.r, + &widget_data->bezel_vertical_color.g, + &widget_data->bezel_vertical_color.b, + &widget_data->bezel_vertical_color.a, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); + widget_data->bezel_horizontal_color.r = widget_data->bezel_vertical_color.r; + widget_data->bezel_horizontal_color.g = widget_data->bezel_vertical_color.g; + widget_data->bezel_horizontal_color.b = widget_data->bezel_vertical_color.b; + widget_data->bezel_horizontal_color.a = widget_data->bezel_vertical_color.a; + } + // + else if (widget_data->scrollbar_color_class && !strcmp(source, widget_data->scrollbar_color_class)) + { + edje_object_color_class_get(elm_layout_edje_get(scroller), widget_data->scrollbar_color_class, &widget_data->vertical_color.r, &widget_data->vertical_color.g, &widget_data->vertical_color.b, &widget_data->vertical_color.a, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); + widget_data->horizontal_color.r = widget_data->vertical_color.r; + widget_data->horizontal_color.g = widget_data->vertical_color.g; + widget_data->horizontal_color.b = widget_data->vertical_color.b; + widget_data->horizontal_color.a = widget_data->vertical_color.a; + + if (widget_data->policy_v != ELM_SCROLLER_POLICY_OFF) + { + item = _eext_circle_object_item_get(circle_obj, VERTICAL_BAR_NAME); + //ONEUI1.5(31July2019): Fix VI effect logic about hide + _eext_circle_object_item_color_get(item, NULL, NULL, NULL, &a); + if (!a) + _eext_circle_object_item_color_set(item, widget_data->vertical_color.r, widget_data->vertical_color.g, widget_data->vertical_color.b, 0); + else + // + _eext_circle_object_item_color_set(item, widget_data->vertical_color.r, widget_data->vertical_color.g, widget_data->vertical_color.b, widget_data->vertical_color.a); + } + if (widget_data->policy_h != ELM_SCROLLER_POLICY_OFF) + { + item = _eext_circle_object_item_get(circle_obj, HORIZONTAL_BAR_NAME); + //ONEUI1.5(31July2019): Fix VI effect logic about hide + _eext_circle_object_item_color_get(item, NULL, NULL, NULL, &a); + if (!a) + _eext_circle_object_item_color_set(item, widget_data->horizontal_color.r, widget_data->horizontal_color.g, widget_data->horizontal_color.b, 0); + else + // + _eext_circle_object_item_color_set(item, widget_data->horizontal_color.r, widget_data->horizontal_color.g, widget_data->horizontal_color.b, widget_data->horizontal_color.a); + } + } + else if (widget_data->scrollbar_bg_color_class && !strcmp(source, widget_data->scrollbar_bg_color_class)) + { + edje_object_color_class_get(elm_layout_edje_get(scroller), widget_data->scrollbar_bg_color_class, &widget_data->vertical_bg_color.r, &widget_data->vertical_bg_color.g, &widget_data->vertical_bg_color.b, &widget_data->vertical_bg_color.a, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); + widget_data->horizontal_bg_color.r = widget_data->vertical_bg_color.r; + widget_data->horizontal_bg_color.g = widget_data->vertical_bg_color.g; + widget_data->horizontal_bg_color.b = widget_data->vertical_bg_color.b; + widget_data->horizontal_bg_color.a = widget_data->vertical_bg_color.a; + + if (widget_data->policy_v != ELM_SCROLLER_POLICY_OFF) + { + item = _eext_circle_object_item_get(circle_obj, VERTICAL_BAR_BG_NAME); + //ONEUI1.5(31July2019): Fix VI effect logic about hide + _eext_circle_object_item_color_get(item, NULL, NULL, NULL, &a); + if (!a) + _eext_circle_object_item_color_set(item, widget_data->vertical_bg_color.r, widget_data->vertical_bg_color.g, widget_data->vertical_bg_color.b, 0); + else + // + _eext_circle_object_item_color_set(item, widget_data->vertical_bg_color.r, widget_data->vertical_bg_color.g, widget_data->vertical_bg_color.b, widget_data->vertical_bg_color.a); + } + + if (widget_data->policy_h != ELM_SCROLLER_POLICY_OFF) + { + item = _eext_circle_object_item_get(circle_obj, HORIZONTAL_BAR_BG_NAME); + //ONEUI1.5(31July2019): Fix VI effect logic about hide + _eext_circle_object_item_color_get(item, NULL, NULL, NULL, &a); + if (!a) + _eext_circle_object_item_color_set(item, widget_data->horizontal_bg_color.r, widget_data->horizontal_bg_color.g, widget_data->horizontal_bg_color.b, 0); + else + // + _eext_circle_object_item_color_set(item, widget_data->horizontal_bg_color.r , widget_data->horizontal_bg_color.g, widget_data->horizontal_bg_color.b, widget_data->horizontal_bg_color.a); + } + } +} + +static void +_eext_circle_object_scroller_deactivated_cb(void *data, + Evas_Object *obj, + void *event_info) +{ + if (__elm_product_theme_is_loaded()) + { + Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data; + if(!circle_obj) return; + + Evas_Object *scroller = circle_obj->widget_object; + if(!scroller) return; + + Evas_Object *top_widget = elm_object_top_widget_get(scroller); + if (top_widget) + evas_object_data_del(top_widget, BEZEL_SCROLL); + } +} + +static void +_handler_hide_cb(void *data, Evas_Object *obj, const char *emission, const char *source) +{ + Eext_Circle_Object_Scroller_Data *widget_data = (Eext_Circle_Object_Scroller_Data *) data; + widget_data->handler_shown = EINA_FALSE; +} + +static void +_mouse_down_cb(void *data, + Evas *evas, + Evas_Object *scroller, + void *event_info) +{ + Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data; + Evas_Event_Mouse_Down *ev = event_info; + double angle; + + if (circle_obj->disabled) return; + + EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(circle_obj, widget_data) return; + + if (!widget_data->handler_shown) return; + + Eina_Bool is_mirrored = _eext_circle_object_scroller_mirror_mode_get(circle_obj); + Evas_Coord r = 0, c = 0; + evas_object_geometry_get(scroller, NULL, NULL, &r, NULL); + + r /= 2; + c = r; + r -= 2 * SCROLL_BAR_HANDLER_WIDTH_SIZE; + + if (is_mirrored) + angle = -atan2((double)(ev->canvas.y - c), (double)(c - ev->canvas.x)); + else + angle = atan2((double)(ev->canvas.y - c), (double)(ev->canvas.x - c)); + angle *= 180 / M_PI; // convert from radians to degrees + if (fabs(widget_data->handler_angle - angle) > VERTICAL_BAR_ANGLE_HANDLER_SIZE) return; + + int point = sqrt(pow(c - ev->canvas.x, 2) + pow(c - ev->canvas.y, 2)); + + if (point < r) return; + + if ((!is_mirrored && ev->canvas.x < c) || (is_mirrored && ev->canvas.x > c)) return; - _eext_circle_object_scroller_scrollbar_update(circle_obj, - SCROLL_BAR_HIDE_WAITTING_TIME_ON_INITIALIZING); + if (widget_data->bar_hide_timer) + { + ecore_timer_del(widget_data->bar_hide_timer); + widget_data->bar_hide_timer = NULL; + } + + widget_data->handler_drag = EINA_TRUE; + elm_object_scroll_freeze_push(circle_obj->widget_object); +} + +static void +_mouse_up_cb(void *data, + Evas *evas, + Evas_Object *scroller, + void *event_info) +{ + Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data; + EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(circle_obj, widget_data) return; + + if (circle_obj->disabled) return; + + elm_object_scroll_freeze_pop(circle_obj->widget_object); + widget_data->handler_drag = EINA_FALSE; + + if (widget_data->bar_hide_timer) + { + ecore_timer_del(widget_data->bar_hide_timer); + widget_data->bar_hide_timer = NULL; + } + + widget_data->bar_hide_timer = ecore_timer_add(SCROLL_BAR_HIDE_WAITTING_TIME, + _eext_circle_object_scroller_scrollbar_policy_hide_cb, + circle_obj); +} + +static void +_mouse_move_cb(void *data, + Evas *evas, + Evas_Object *scroller, + void *event_info) +{ + Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data; + Evas_Event_Mouse_Move *ev = event_info; + double angle; + Eina_Bool is_mirrored; + + EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(circle_obj, widget_data) return; + + if (circle_obj->disabled) return; + + //ONEUI1.5(04July2019): Support different color with bezel + if (__elm_product_theme_is_loaded()) + widget_data->bezel_on = EINA_FALSE; + // + + //ONEUI1.5(04JUL2019) : Change dot's color on bezel rotation + if (__elm_product_theme_is_loaded()) + { + Evas_Object *top_widget = elm_object_top_widget_get(scroller); + if (top_widget) + evas_object_data_set(top_widget, BEZEL_SCROLL, (void*)1); + } + // + if (!widget_data->handler_drag) return; + + is_mirrored = _eext_circle_object_scroller_mirror_mode_get(circle_obj); + Evas_Coord ch, px, py, vw, vh, region; + + elm_scroller_child_size_get(circle_obj->widget_object, NULL, &ch); + elm_scroller_region_get(circle_obj->widget_object, &px, &py, &vw, &vh); + + Evas_Coord c = vw / 2; + if (is_mirrored) + angle = atan((double)(c - ev->cur.canvas.y) / (double)(c - ev->cur.canvas.x)); + else + angle = atan((double)(c - ev->cur.canvas.y) / (double)(ev->cur.canvas.x - c)); + + double ratio = ((M_PI / 6.0) - angle) / (M_PI / 3.0); + + ratio = ratio > 1.0 ? 1.0 : ratio; + ratio = ratio < 0.0 ? 0.0 : ratio; + + if ((ev->cur.canvas.x < c && !is_mirrored) || + (ev->cur.canvas.x > c && is_mirrored)) + ratio = 1.0 - ratio; + + region = (int) (ch * ratio); + elm_scroller_region_show(circle_obj->widget_object, px, region, vw, vh); } static Eina_Bool @@ -441,10 +1023,21 @@ _eext_circle_object_scroller_rotary_changed_cb(void *data, int d = (info->direction == EEXT_ROTARY_DIRECTION_CLOCKWISE) ? 1 : -1; Elm_Scroller_Movement_Block scroller_block; Eina_Bool scroll_locked_x, scroll_locked_y; + Evas_Coord px = 0, py = 0; + Evas_Coord minx = 0, miny = 0, mx = 0, my = 0; Eina_Bool is_mirrored = EINA_FALSE; + if (scroller) + LOGE("[%p : %s] rotary callabck is called.", scroller, elm_object_widget_type_get(scroller)); + EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(circle_obj, widget_data) return EINA_TRUE; + EEXT_CIRCLE_OBJECT_SCROLLER_SCROLL_IFACE_DATA_GET(scroller, sid); + if (sid == NULL) + return EINA_TRUE; + + if (sid->obj) + if (elm_object_scroll_freeze_get(scroller)) return EINA_TRUE; @@ -456,6 +1049,20 @@ _eext_circle_object_scroller_rotary_changed_cb(void *data, } if (obj == circle_obj->main_obj) circle_obj->is_propagated = EINA_TRUE; + //ONEUI1.5(04July2019): Support different color with bezel + if (__elm_product_theme_is_loaded()) + widget_data->bezel_on = EINA_TRUE; + // + + if (circle_obj->mirrored_state == EEXT_CIRCLE_MIRRORED_CONFIG) + is_mirrored = elm_config_mirrored_get(); + else if (circle_obj->mirrored_state == EEXT_CIRCLE_MIRRORED_ON) + is_mirrored = EINA_TRUE; + + elm_obj_pan_pos_max_get(sid->pan_obj, &mx, &my); + elm_obj_pan_pos_min_get(sid->pan_obj, &minx, &miny); + + elm_interface_scrollable_content_pos_get(sid->obj, &px, &py); elm_scroller_page_size_get(scroller, &h_pagesize, &v_pagesize); elm_scroller_child_size_get(scroller, &cw, &ch); @@ -465,74 +1072,227 @@ _eext_circle_object_scroller_rotary_changed_cb(void *data, scroll_locked_x = elm_object_scroll_lock_x_get(scroller); scroll_locked_y = elm_object_scroll_lock_y_get(scroller); - //C# FIXME: Apply center alignment - if (efl_isa(scroller, EFL_UI_LEGACY_INTERFACE)) + LOGE("[%p] block(%d) scroll_locked_x(%d), scroll_locked_y(%d) content size(%d, %d) viewport size(%d, %d)", scroller, scroller_block, scroll_locked_x, scroll_locked_y, cw, ch, w, h); + + if ((h_pagesize > 0) || (v_pagesize > 0)) { - if ((h_pagesize > 0) || (v_pagesize > 0)) - { - int h_current_page, v_current_page; + int last_pagenumber_v = 0, last_pagenumber_h = 0; + int pagenumber_v = 0, pagenumber_h = 0; - // Handle scroll per page - elm_scroller_current_page_get(scroller, &h_current_page, &v_current_page); + elm_scroller_last_page_get(scroller, &last_pagenumber_h, &last_pagenumber_v); - if (!scroll_locked_y && - !(scroller_block & ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL) && - (ch > h) && (v_pagesize > 0)) - { - v_current_page += d; - } - else if (!scroll_locked_x && - !(scroller_block & ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL) && - (cw > w) && (h_pagesize > 0)) + // Handle scroll per page + if (!scroll_locked_y && + !(scroller_block & ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL) && + (ch > h) && (v_pagesize > 0)) + { + pagenumber_v = sid->rotary_animation_info.current_page + sid->rotary_animation_info.detent_count + d; + LOGE("[%p] CurrentPage(%d) DetentValue(%d) DetentCount(%d)", scroller, sid->rotary_animation_info.current_page, d, sid->rotary_animation_info.detent_count); + + if (pagenumber_v < 0) pagenumber_v = 0; + if (pagenumber_v > last_pagenumber_v) pagenumber_v = last_pagenumber_v; + if (_eext_circle_object_scroller_can_scroll(sid, UP) ||_eext_circle_object_scroller_can_scroll(sid, DOWN)) { - h_current_page += d; + //ONEUI1.5(04JUL2019) : Change dot's color on bezel rotation + Evas_Object *top_widget = NULL; + if (__elm_product_theme_is_loaded()) + top_widget = elm_object_top_widget_get(scroller); + // + if (!_eext_circle_object_scroller_can_scroll(sid, UP) && d < 0) + { + if(!sid->loop_v) + { + sid->rotary_animation_info.detent_count = 0; + edje_object_signal_emit(sid->edje_obj, "elm,edge,top,rotary,detented", "elm"); + LOGE("[%p] edge top", scroller); + } + else + { + //ONEUI1.5(04JUL2019) : Change dot's color on bezel rotation + if (top_widget) evas_object_data_set(top_widget, BEZEL_SCROLL, (void*)2); + // + elm_scroller_page_bring_in(scroller, 0, pagenumber_v); + } + } + else if (!_eext_circle_object_scroller_can_scroll(sid, DOWN) && d > 0) + { + if(!sid->loop_v) + { + sid->rotary_animation_info.detent_count = 0; + edje_object_signal_emit(sid->edje_obj, "elm,edge,bottom,rotary,detented", "elm"); + LOGE("[%p] edge bottom", scroller); + } + else + { + //ONEUI1.5(04JUL2019) : Change dot's color on bezel rotation + if (top_widget) evas_object_data_set(top_widget, BEZEL_SCROLL, (void*)2); + // + elm_scroller_page_bring_in(scroller, 0, pagenumber_v); + } + } + else if((pagenumber_v >= 0) && (pagenumber_v <= last_pagenumber_v)) + { + if(!sid->loop_v) + { + sid->rotary_animation_info.detent_count += d; + //ONEUI1.5(04JUL2019) : Change dot's color on bezel rotation + if (top_widget) evas_object_data_set(top_widget, BEZEL_SCROLL, (void*)2); + // + elm_scroller_page_bring_in(scroller, 0, pagenumber_v); + } + else + { + //ONEUI1.5(04JUL2019) : Change dot's color on bezel rotation + if (top_widget) evas_object_data_set(top_widget, BEZEL_SCROLL, (void*)2); + // + elm_scroller_page_bring_in(scroller, 0, pagenumber_v); + } + } } - - if (v_current_page < 0) v_current_page = 0; - if (h_current_page < 0) h_current_page = 0; - - elm_scroller_page_bring_in(scroller, h_current_page,v_current_page); } - else + else if (!scroll_locked_x && + !(scroller_block & ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL) && + (cw > w) && (h_pagesize > 0)) { - // Handle scroll - if (!scroll_locked_y && - !(scroller_block & ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL) && - (ch > h)) - { - y += d * widget_data->step_y; - } - else if (!scroll_locked_x && - !(scroller_block & ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL) && - (cw > w)) - { - if (circle_obj->mirrored_state == EEXT_CIRCLE_MIRRORED_CONFIG) - is_mirrored = elm_config_mirrored_get(); - else if (circle_obj->mirrored_state == EEXT_CIRCLE_MIRRORED_ON) - is_mirrored = EINA_TRUE; + if (circle_obj->mirrored_state == EEXT_CIRCLE_MIRRORED_CONFIG) + is_mirrored = elm_config_mirrored_get(); + else if (circle_obj->mirrored_state == EEXT_CIRCLE_MIRRORED_ON) + is_mirrored = EINA_TRUE; - if (is_mirrored) - d *= -1; + int mirroed_d = d; - x += d * widget_data->step_x; - } + if (is_mirrored) + mirroed_d *= -1; - if (y < 0) y = 0; - if (x < 0) x = 0; + if (is_mirrored == elm_object_mirrored_get(scroller)) + pagenumber_h = sid->rotary_animation_info.current_page + sid->rotary_animation_info.detent_count + d; + else + pagenumber_h = sid->rotary_animation_info.current_page + sid->rotary_animation_info.detent_count - d; + LOGE("[%p] CurrentPage(%d) DetentValue(%d) DetentCount(%d)", scroller, sid->rotary_animation_info.current_page, d, sid->rotary_animation_info.detent_count); - elm_scroller_region_bring_in(scroller, x, y, w, h); + if (pagenumber_h < 0) pagenumber_h = 0; + if (pagenumber_h > last_pagenumber_h) pagenumber_h = last_pagenumber_h; + if (_eext_circle_object_scroller_can_scroll(sid, LEFT) ||_eext_circle_object_scroller_can_scroll(sid, RIGHT)) + { + //ONEUI1.5(04JUL2019) : Change dot's color on bezel rotation + Evas_Object *top_widget = NULL; + if (__elm_product_theme_is_loaded()) + top_widget = elm_object_top_widget_get(scroller); + // + if (!_eext_circle_object_scroller_can_scroll(sid, LEFT) && mirroed_d < 0) + { + if(!sid->loop_h) + { + sid->rotary_animation_info.detent_count = 0; + edje_object_signal_emit(sid->edje_obj, "elm,edge,left,rotary,detented", "elm"); + LOGE("[%p] edge left", scroller); + } + else + { + //ONEUI1.5(04JUL2019) : Change dot's color on bezel rotation + if (top_widget) evas_object_data_set(top_widget, BEZEL_SCROLL, (void*)2); + // + elm_scroller_page_bring_in(scroller, pagenumber_h, 0); + } + } + else if (!_eext_circle_object_scroller_can_scroll(sid, RIGHT) && mirroed_d > 0) + { + if(!sid->loop_h) + { + sid->rotary_animation_info.detent_count = 0; + edje_object_signal_emit(sid->edje_obj, "elm,edge,right,rotary,detented", "elm"); + LOGE("[%p] edge right", scroller); + } + else + { + //ONEUI1.5(04JUL2019) : Change dot's color on bezel rotation + if (top_widget) evas_object_data_set(top_widget, BEZEL_SCROLL, (void*)2); + // + elm_scroller_page_bring_in(scroller, pagenumber_h, 0); + } + } + else if((pagenumber_h >= 0) && (pagenumber_h <= last_pagenumber_h)) + { + if (is_mirrored == elm_object_mirrored_get(scroller)) + sid->rotary_animation_info.detent_count += d; + else + sid->rotary_animation_info.detent_count -= d; + LOGE("[%p] bring in %d page", scroller, pagenumber_h); + + //ONEUI1.5(04JUL2019) : Change dot's color on bezel rotation + if (top_widget) evas_object_data_set(top_widget, BEZEL_SCROLL, (void*)2); + // + elm_scroller_page_bring_in(scroller, pagenumber_h, 0); + } + } } } else { - Eina_Position2D pos = efl_ui_scrollable_content_pos_get(scroller); - Eina_Rect rect = efl_ui_scrollable_viewport_geometry_get(scroller); - if (widget_data->policy_v == ELM_SCROLLER_POLICY_AUTO) - rect.y = pos.y + (d * widget_data->step_y); - else - rect.x = pos.x + (d * widget_data->step_x); + Evas_Coord screensize_w = 0, screensize_h = 0; + int move_distance_h = 0, move_distance_v = 0; + + Evas_Object *win = elm_object_top_widget_get(scroller); + elm_win_screen_size_get(win, NULL, NULL, &screensize_w, &screensize_h); - efl_ui_scrollable_scroll(scroller, rect, EINA_TRUE); + if ((sid->rotary_animation_info.detent_count < 0 && d > 0) || (sid->rotary_animation_info.detent_count > 0 && d < 0)) + sid->rotary_animation_info.detent_count = 0; + + sid->rotary_animation_info.detent_count += d; + + move_distance_h = screensize_w * sid->rotary_animation_info.detent_count * 2 /5; + move_distance_v = screensize_h * sid->rotary_animation_info.detent_count * 2 /5; + // Handle scroll + if (!scroll_locked_y && + !(scroller_block & ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL) && + (ch > h)) + { + if (_eext_circle_object_scroller_can_scroll(sid, UP) ||_eext_circle_object_scroller_can_scroll(sid, DOWN)) + { + if (!_eext_circle_object_scroller_can_scroll(sid, UP) && move_distance_v < 0) + { + sid->rotary_animation_info.detent_count = 0; + if (py == miny) + edje_object_signal_emit(sid->edje_obj, "elm,edge,top,rotary,detented", "elm"); + } + else if (!_eext_circle_object_scroller_can_scroll(sid, DOWN) && move_distance_v > 0) + { + sid->rotary_animation_info.detent_count = 0; + if (py == my) + edje_object_signal_emit(sid->edje_obj, "elm,edge,bottom,rotary,detented", "elm"); + } + else + { + elm_scroller_region_bring_in(scroller, px, py + move_distance_v, screensize_w, screensize_h); + } + } + } + else if (!scroll_locked_x && + !(scroller_block & ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL) && + (cw > w)) + { + if (_eext_circle_object_scroller_can_scroll(sid, LEFT) ||_eext_circle_object_scroller_can_scroll(sid, RIGHT)) + { + if (is_mirrored) + move_distance_h *= -1; + if (!_eext_circle_object_scroller_can_scroll(sid, LEFT) && move_distance_h < 0) + { + sid->rotary_animation_info.detent_count = 0; + if (px == minx) + edje_object_signal_emit(sid->edje_obj, "elm,edge,left,rotary,detented", "elm"); + } + else if (!_eext_circle_object_scroller_can_scroll(sid, RIGHT) && move_distance_h > 0) + { + sid->rotary_animation_info.detent_count = 0; + if (px == mx) + edje_object_signal_emit(sid->edje_obj, "elm,edge,right,rotary,detented", "elm"); + } + else + { + elm_scroller_region_bring_in(scroller, px + move_distance_h, py, screensize_w, screensize_h); + } + } + } } return EINA_TRUE; @@ -543,12 +1303,34 @@ _eext_circle_object_scroller_del_cb(Eext_Circle_Object *obj) { EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(obj, data) return; - evas_object_event_callback_del_full(obj->widget_object, EVAS_CALLBACK_SHOW, _eext_circle_object_scroller_show_cb, obj); evas_object_smart_callback_del_full(obj->widget_object, "scroll", _eext_circle_object_scroller_scroll_cb, obj); evas_object_smart_callback_del_full(obj->widget_object, "content,resize", _eext_circle_object_scroller_content_resize_cb, obj); + //ONEUI1.5(11JUN2019): Update scrollbar size on viewport resize + evas_object_smart_callback_del_full(obj->widget_object, "viewport,resize", _eext_circle_object_scroller_viewport_resize_cb, obj); + // eext_rotary_object_event_callback_del(obj->widget_object, _eext_circle_object_scroller_rotary_changed_cb); eext_rotary_object_event_callback_del(obj->main_obj, _eext_circle_object_scroller_rotary_changed_cb); - + LOGE("[%p] rotary callabck is deleted", obj->widget_object); + + evas_object_smart_callback_del_full(obj->widget_object, "scroll,anim,stop", _eext_circle_object_scroller_scroll_animatioin_stop_cb, obj); + evas_object_smart_callback_del_full(obj->widget_object, SIG_SCROLLER_RESUME, _eext_circle_object_scroller_resume_cb, obj); + edje_object_signal_callback_del(elm_layout_edje_get(obj->widget_object), "color_class,set", data->scrollbar_color_class, _eext_circle_object_scroller_change_color_signal_cb); + edje_object_signal_callback_del(elm_layout_edje_get(obj->widget_object), "color_class,set", data->scrollbar_bg_color_class, _eext_circle_object_scroller_change_color_signal_cb); + if (data->scrollbar_color_class) eina_stringshare_del(data->scrollbar_color_class); + if (data->scrollbar_bg_color_class) eina_stringshare_del(data->scrollbar_bg_color_class); + //ONEUI1.5(04July2019): Support different color with bezel + edje_object_signal_callback_del(elm_layout_edje_get(obj->widget_object), "color_class,set", + data->bezel_scrollbar_color_class, _eext_circle_object_scroller_change_color_signal_cb); + if (data->bezel_scrollbar_color_class) eina_stringshare_del(data->bezel_scrollbar_color_class); + evas_object_event_callback_del(obj->widget_object, EVAS_CALLBACK_MOUSE_MOVE, _mouse_move_cb); + evas_object_smart_callback_del_full(obj->widget_object, SIGNAL_DEACTIVATED, _eext_circle_object_scroller_deactivated_cb, obj); + evas_object_smart_callback_del_full(obj->main_obj, SIGNAL_DEACTIVATED, _eext_circle_object_scroller_deactivated_cb, obj); + // + if (data->handler) + { + evas_object_event_callback_del(obj->widget_object, EVAS_CALLBACK_MOUSE_DOWN, _mouse_down_cb); + evas_object_event_callback_del(obj->widget_object, EVAS_CALLBACK_MOUSE_UP, _mouse_up_cb); + } if (data->bar_hide_timer) { ecore_timer_del(data->bar_hide_timer); @@ -568,6 +1350,8 @@ _eext_circle_object_scroller_disabled_cb(Eext_Circle_Object *obj) if (obj->disabled) { + if (data->handler) + evas_object_hide(data->handler_layout); item = _eext_circle_object_item_get(obj, VERTICAL_BAR_NAME); _eext_circle_object_item_color_set(item, data->disabled_color.r, @@ -639,6 +1423,7 @@ _eext_circle_object_scroller_init(Eext_Circle_Object *obj, Evas_Object *scroller { Eext_Circle_Object_Scroller_Data *data; Eext_Circle_Object_Item *item; + const char *style = elm_object_style_get(scroller); obj->widget_type = EEXT_CIRCLE_OBJECT_SCROLLER_TYPE; obj->del_func = _eext_circle_object_scroller_del_cb; @@ -647,29 +1432,36 @@ _eext_circle_object_scroller_init(Eext_Circle_Object *obj, Evas_Object *scroller obj->mirrored_state = EEXT_CIRCLE_MIRRORED_CONFIG; data = (Eext_Circle_Object_Scroller_Data *)calloc(1, sizeof(Eext_Circle_Object_Scroller_Data)); + if (style && !strncmp(style, HANDLER_STYLE, strlen(HANDLER_STYLE) + 1)) + data->handler = EINA_TRUE; + else + data->handler = EINA_FALSE; + data->handler_drag = EINA_FALSE; + data->handler_layout = NULL; + data->handler_angle = 0; + data->handler_shown = EINA_FALSE; data->policy_v = ELM_SCROLLER_POLICY_AUTO; data->policy_h = ELM_SCROLLER_POLICY_AUTO; data->line_width = SCROLL_BAR_WIDTH_SIZE; data->radius = SCROLL_BAR_RADIUS_SIZE; data->step_x = data->step_y = 32; - data->vertical_color.r = data->horizontal_color.r = SCROLL_BAR_COLOR_R; - data->vertical_color.g = data->horizontal_color.g = SCROLL_BAR_COLOR_G; - data->vertical_color.b = data->horizontal_color.b = SCROLL_BAR_COLOR_B; - data->vertical_color.a = data->horizontal_color.a = SCROLL_BAR_COLOR_A; - data->vertical_bg_color.r = data->horizontal_bg_color.r = SCROLL_BAR_BG_COLOR_R; - data->vertical_bg_color.g = data->horizontal_bg_color.g = SCROLL_BAR_BG_COLOR_G; - data->vertical_bg_color.b = data->horizontal_bg_color.b = SCROLL_BAR_BG_COLOR_B; - data->vertical_bg_color.a = data->horizontal_bg_color.a = SCROLL_BAR_BG_COLOR_A; - data->disabled_color.r = SCROLL_BAR_COLOR_DISABLED_R; - data->disabled_color.g = SCROLL_BAR_COLOR_DISABLED_G; - data->disabled_color.b = SCROLL_BAR_COLOR_DISABLED_B; - data->disabled_color.a = SCROLL_BAR_COLOR_DISABLED_A; - data->disabled_bg_color.r = SCROLL_BAR_BG_COLOR_DISABLED_R; - data->disabled_bg_color.g = SCROLL_BAR_BG_COLOR_DISABLED_G; - data->disabled_bg_color.b = SCROLL_BAR_BG_COLOR_DISABLED_B; - data->disabled_bg_color.a = SCROLL_BAR_BG_COLOR_DISABLED_A; + + data->bezel_scrollbar_color_class = STR_DUP(edje_object_data_get(elm_layout_edje_get(obj->widget_object), "bezel_bar_color_class")); + data->scrollbar_color_class = STR_DUP(edje_object_data_get(elm_layout_edje_get(obj->widget_object), "bar_color_class")); + data->scrollbar_bg_color_class = STR_DUP(edje_object_data_get(elm_layout_edje_get(obj->widget_object), "bar_bg_color_class")); + + if (data->handler) + { + data->handler_layout = elm_layout_add(scroller); + elm_layout_theme_set(data->handler_layout, "scroller", "base", "prod/handler/indicator"); + evas_object_resize(data->handler_layout, SURFACE_WIDTH, SURFACE_WIDTH); + evas_object_show(data->handler_layout); + evas_object_smart_member_add(data->handler_layout, scroller); + elm_layout_signal_callback_add(data->handler_layout, "elm,state,hide,finished", "elm", _handler_hide_cb, data); + } obj->widget_data = (void *)data; + _update_color_info(obj); // We don't want to allow to change properties of these items. // There is no item with "default" as its name. // So, eext_circle_object_* APIs is meaningless in here. @@ -707,7 +1499,7 @@ _eext_circle_object_scroller_init(Eext_Circle_Object *obj, Evas_Object *scroller data->vertical_color.r, data->vertical_color.g, data->vertical_color.b, - data->vertical_color.a); + 0); _eext_circle_object_item_line_width_set(item, data->line_width); _eext_circle_object_item_radius_set(item, data->radius); _eext_circle_object_item_round_cap_enable_set(item, EINA_TRUE); @@ -719,29 +1511,33 @@ _eext_circle_object_scroller_init(Eext_Circle_Object *obj, Evas_Object *scroller data->horizontal_color.r, data->horizontal_color.g, data->horizontal_color.b, - data->horizontal_color.a); + 0); _eext_circle_object_item_line_width_set(item, data->line_width); _eext_circle_object_item_radius_set(item, data->radius); _eext_circle_object_item_round_cap_enable_set(item, EINA_TRUE); _eext_circle_object_item_append(obj, item); + elm_scroller_policy_set(scroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); - if (efl_isa(obj->widget_object, EFL_UI_LEGACY_INTERFACE)) - { - elm_scroller_policy_set(scroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); - evas_object_smart_callback_add(scroller, "scroll", _eext_circle_object_scroller_scroll_cb, obj); - } - else - { - efl_ui_scrollbar_bar_mode_set(obj->widget_object, EFL_UI_SCROLLBAR_MODE_OFF, EFL_UI_SCROLLBAR_MODE_OFF); - efl_event_callback_add(scroller, EFL_UI_EVENT_SCROLL_CHANGED, _scroll_cb, obj); - } - - evas_object_event_callback_add(scroller, EVAS_CALLBACK_SHOW, _eext_circle_object_scroller_show_cb, obj); - + evas_object_smart_callback_add(scroller, SIG_SCROLLER_RESUME, _eext_circle_object_scroller_resume_cb, obj); + evas_object_smart_callback_add(scroller, "scroll", _eext_circle_object_scroller_scroll_cb, obj); + evas_object_smart_callback_add(scroller, "scroll,anim,stop", _eext_circle_object_scroller_scroll_animatioin_stop_cb, obj); evas_object_smart_callback_add(scroller, "content,resize", _eext_circle_object_scroller_content_resize_cb, obj); + //ONEUI1.5(11JUN2019): Update scrollbar size on viewport resize + evas_object_smart_callback_add(scroller, "viewport,resize", _eext_circle_object_scroller_viewport_resize_cb, obj); + // + + edje_object_signal_callback_add(elm_layout_edje_get(obj->widget_object), "color_class,set", data->scrollbar_color_class, _eext_circle_object_scroller_change_color_signal_cb, obj); + edje_object_signal_callback_add(elm_layout_edje_get(obj->widget_object), "color_class,set", data->scrollbar_bg_color_class, _eext_circle_object_scroller_change_color_signal_cb, obj); + //ONEUI1.5(04July2019): Support different color with bezel + edje_object_signal_callback_add(elm_layout_edje_get(obj->widget_object), "color_class,set", data->bezel_scrollbar_color_class, _eext_circle_object_scroller_change_color_signal_cb, obj); + evas_object_smart_callback_add(obj->widget_object, SIGNAL_DEACTIVATED, _eext_circle_object_scroller_deactivated_cb, obj); + evas_object_smart_callback_add(obj->main_obj, SIGNAL_DEACTIVATED, _eext_circle_object_scroller_deactivated_cb, obj); + // eext_rotary_object_event_callback_add(scroller, _eext_circle_object_scroller_rotary_changed_cb, obj); eext_rotary_object_event_callback_add(obj->main_obj, _eext_circle_object_scroller_rotary_changed_cb, obj); + + LOGE("scroller(%p), obj->main_obj(%p)", scroller, obj->main_obj); } EAPI Evas_Object * @@ -757,6 +1553,15 @@ eext_circle_object_scroller_add(Evas_Object *scroller, Eext_Circle_Surface *surf _eext_circle_object_scroller_init(circle_obj, scroller); + const char *style = elm_object_style_get(scroller); + //ONEUI1.5(04July2019): Support different color with bezel + evas_object_event_callback_priority_add(scroller, EVAS_CALLBACK_MOUSE_MOVE, EVAS_CALLBACK_PRIORITY_BEFORE, _mouse_move_cb, circle_obj); + // + if (style && !strncmp(style, HANDLER_STYLE, strlen(HANDLER_STYLE) + 1)) + { + evas_object_event_callback_add(scroller, EVAS_CALLBACK_MOUSE_DOWN, _mouse_down_cb, circle_obj); + evas_object_event_callback_add(scroller, EVAS_CALLBACK_MOUSE_UP, _mouse_up_cb, circle_obj); + } return obj; } diff --git a/src/wearable/circle/efl_extension_circle_object_slider.c b/src/wearable/circle/efl_extension_circle_object_slider.c index 8034877..990c96b 100644 --- a/src/wearable/circle/efl_extension_circle_object_slider.c +++ b/src/wearable/circle/efl_extension_circle_object_slider.c @@ -23,16 +23,22 @@ #define SLIDER_ROTARY_EVENT_TIME_STAMP_THRESHOLD 500 #define SLIDER_ROTARY_EVENT_ACCELERATION_TIME_DIFF 100 -#define SLIDER_ROTARY_EVENT_VALUE_MULTIPLYER 1 +#define SLIDER_ROTARY_EVENT_VALUE_MULTIPLIER 1 #define SLIDER_TRANSIT_TIME 0.2 +#define SLIDER_CUE_SHOW_TRANSIT_TIME 0.2 +#define SLIDER_CUE_HIDE_TRANSIT_TIME 0.4 #define SLIDER_TOUCH_AREA_SIZE 50 #define SLIDER_WIDTH_SIZE 6 -#define SLIDER_RADIUS_SIZE 174 +#define SLIDER_RADIUS_SIZE 168 #define SLIDER_CUE_SIZE 0.1 #define SLIDER_CUE_OFFSET 0.05 #define SLIDER_CUE_SHOWN_WIDTH 56 -#define SLIDER_CUE_HIDDEN_WIDTH 14 +#define SLIDER_CUE_HIDDEN_WIDTH 19 + +//ONEUI1.5(25Jan2019): Slider access support, add read timer +#define HIGHLIGHT_UPDATE_READ_TIMEOUT 0.3 +// #define EEXT_CIRCLE_OBJECT_SLIDER_DATA_GET(circle_obj, data) \ Eext_Circle_Object_Slider_Data *data = NULL; \ @@ -77,10 +83,19 @@ #define SLIDER_CUE_EFFECT_COLOR_A 128 static const char SIG_VALUE_CHANGED[] = "value,changed"; -static const double durations[4] = {0.3, 0.4, 0.5, 0.6}; +static const double durations[4] = {0.2, 0.4, 0.6, 0.8}; static Eina_Bool _eext_circle_object_slider_value_transit_set_internal(Evas_Object *obj, double value); +//ONEUI1.5(11Jan2019): Slider access support +static void _grab_highlight_cb(void *data, Evas_Object *obj, void *event_info); +static void _win_focus_cb(void *data, Evas_Object *obj, void *event_info); +static void _slider_screen_reader_changed(void *data, Evas_Object *obj, void *event_info); +static char *_get_accessible_name(Evas_Object *slider); +static char *_get_accessible_description(Evas_Object *slider); +extern void __elm_atspi_bridge_highlighted_object_read(void); +// + static double _angle_calculate(Evas_Object *obj, Evas_Coord mouse_x, Evas_Coord mouse_y) { @@ -182,14 +197,14 @@ _angle_drag_set(Evas_Object *obj, double new_angle) } double new_value = eext_circle_object_value_get(obj); + if (new_value != current_value) + evas_object_smart_callback_call(obj, SIG_VALUE_CHANGED, NULL); widget_data->prev_angle = new_angle; } static void _angle_tap_set(Evas_Object *obj, double new_angle) { - EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return; - double min = 0.0, max = 0.0; eext_circle_object_value_min_max_get(obj, &min, &max); @@ -197,7 +212,12 @@ _angle_tap_set(Evas_Object *obj, double new_angle) double new_value = min + (new_angle * (max - min))/360.0; if (floor(new_value + 0.5) != floor(current_value + 0.5)) - _eext_circle_object_slider_value_transit_set_internal(obj, floor(new_value + 0.5)); + { + //eext_circle_object_value_set(obj, floor(new_value + 0.5)); + + _eext_circle_object_slider_value_transit_set_internal(obj, floor(new_value + 0.5)); + evas_object_smart_callback_call(obj, SIG_VALUE_CHANGED, NULL); + } } static Eina_Bool _cue_effect_animator_cb(void *data, double pos) @@ -218,6 +238,9 @@ static Eina_Bool _cue_effect_animator_cb(void *data, double pos) return ECORE_CALLBACK_CANCEL; } + double cubic_bezier_v[] = {0.25, 0.46, 0.45, 1}; + pos = ecore_animator_pos_map_n(pos, ECORE_POS_MAP_CUBIC_BEZIER, 4, cubic_bezier_v); + int to_width = SLIDER_CUE_HIDDEN_WIDTH; if (widget_data->cue_effect_transit.showing) to_width = SLIDER_CUE_SHOWN_WIDTH; @@ -256,7 +279,7 @@ static void _show_cue_effect(Evas_Object *obj) widget_data->cue_effect_transit.from_line_width = _eext_circle_object_item_line_width_get(item); widget_data->cue_effect_transit.showing = EINA_TRUE; - widget_data->cue_effect_transit.animator = ecore_animator_timeline_add(SLIDER_TRANSIT_TIME, _cue_effect_animator_cb, obj); + widget_data->cue_effect_transit.animator = ecore_animator_timeline_add(SLIDER_CUE_SHOW_TRANSIT_TIME, _cue_effect_animator_cb, obj); } static void _hide_cue_effect(Evas_Object *obj) @@ -279,24 +302,27 @@ static void _hide_cue_effect(Evas_Object *obj) widget_data->cue_effect_transit.from_line_width = _eext_circle_object_item_line_width_get(item); widget_data->cue_effect_transit.showing = EINA_FALSE; - widget_data->cue_effect_transit.animator = ecore_animator_timeline_add(SLIDER_TRANSIT_TIME, _cue_effect_animator_cb, obj); + widget_data->cue_effect_transit.animator = ecore_animator_timeline_add(SLIDER_CUE_HIDE_TRANSIT_TIME, _cue_effect_animator_cb, obj); } static void _mouse_down_cb(void *data, Evas *evas, - Evas_Object *obj, + // FIXME(23Jul2019): callbacks are not working on image object + Evas_Object *parent, + // void *event_info) { Evas_Event_Mouse_Down *ev = event_info; - Evas_Object *img_obj = data; - - EEXT_CIRCLE_OBJECT_GET(img_obj, circle_obj) return; + // FIXME(23Jul2019): callbacks are not working on image object + Evas_Object *obj = (Evas_Object *)data; + // + EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return; EEXT_CIRCLE_OBJECT_SLIDER_DATA_GET(circle_obj, widget_data) return; if (circle_obj->disabled) return; - int radius = eext_circle_object_radius_get(img_obj); + int radius = eext_circle_object_radius_get(obj); Evas_Coord_Point center = {0,0}; Evas_Coord x = 0, y = 0, w = 0, h = 0; evas_object_geometry_get(obj, &x, &y, &w, &h); @@ -309,18 +335,19 @@ _mouse_down_cb(void *data, if ((point <= radius) && (point >= (radius - SLIDER_TOUCH_AREA_SIZE))) { double new_angle = _angle_calculate(obj, ev->canvas.x, ev->canvas.y); - double current_angle = eext_circle_object_angle_get(img_obj); + double current_angle = eext_circle_object_angle_get(obj); double angle_difference = fabs(new_angle - current_angle); if (angle_difference <= 18.0) { - _show_cue_effect(img_obj); + _show_cue_effect(obj); widget_data->freeze = EINA_FALSE; widget_data->prev_angle = -1.0; - _angle_drag_set(img_obj, new_angle); + _angle_drag_set(obj, new_angle); + widget_data->drag = EINA_TRUE; - efl_ui_widget_scroll_freeze_push(img_obj); + efl_ui_widget_scroll_freeze_push(obj); } else { @@ -335,13 +362,17 @@ _mouse_down_cb(void *data, static void _mouse_move_cb(void *data, Evas *evas, - Evas_Object *obj, + // FIXME(23Jul2019): callbacks are not working on image object + Evas_Object *parent, + // void *event_info) { Evas_Event_Mouse_Move *ev = event_info; - Evas_Object *img_obj = data; + // FIXME(23Jul2019): callbacks are not working on image object + Evas_Object *obj = (Evas_Object *)data; + // - EEXT_CIRCLE_OBJECT_GET(img_obj, circle_obj) return; + EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return; EEXT_CIRCLE_OBJECT_SLIDER_DATA_GET(circle_obj, widget_data) return; if (circle_obj->disabled) return; @@ -351,7 +382,7 @@ _mouse_move_cb(void *data, int gap = sqrt(pow(widget_data->pressed_point.x - ev->cur.canvas.x, 2) + pow(widget_data->pressed_point.y - ev->cur.canvas.y, 2)); if (gap > elm_config_scroll_thumbscroll_threshold_get()) { - _show_cue_effect(img_obj); + _show_cue_effect(obj); widget_data->freeze = EINA_FALSE; widget_data->prev_angle = -1.0; @@ -362,37 +393,40 @@ _mouse_move_cb(void *data, } if (widget_data->drag) - _angle_drag_set(img_obj, _angle_calculate(obj, ev->cur.canvas.x, ev->cur.canvas.y)); + _angle_drag_set(obj, _angle_calculate(obj, ev->cur.canvas.x, ev->cur.canvas.y)); } static void _mouse_up_cb(void *data, Evas *evas, - Evas_Object *obj, + // FIXME(23Jul2019): callbacks are not working on image object + Evas_Object *parent, + // void *event_info) { Evas_Event_Mouse_Up *ev = event_info; - Evas_Object *img_obj = data; - - EEXT_CIRCLE_OBJECT_GET(img_obj, circle_obj) return; + // FIXME(23Jul2019): callbacks are not working on image object + Evas_Object *obj = (Evas_Object *)data; + // + EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return; EEXT_CIRCLE_OBJECT_SLIDER_DATA_GET(circle_obj, widget_data) return; if (circle_obj->disabled) return; if (widget_data->drag) { - _eext_circle_object_slider_value_transit_set_internal(img_obj, eext_circle_object_value_get(img_obj)); + _eext_circle_object_slider_value_transit_set_internal(obj, eext_circle_object_value_get(obj)); - _hide_cue_effect(img_obj); + _hide_cue_effect(obj); widget_data->drag = EINA_FALSE; - efl_ui_widget_scroll_freeze_pop(img_obj); + efl_ui_widget_scroll_freeze_pop(obj); } else if (widget_data->tap) { int gap = sqrt(pow(widget_data->pressed_point.x - ev->canvas.x, 2) + pow(widget_data->pressed_point.y - ev->canvas.y, 2)); if (gap < elm_config_scroll_thumbscroll_threshold_get()) - _angle_tap_set(img_obj, _angle_calculate(obj, ev->canvas.x, ev->canvas.y)); + _angle_tap_set(obj, _angle_calculate(obj, ev->canvas.x, ev->canvas.y)); widget_data->tap = EINA_FALSE; } @@ -404,12 +438,15 @@ _mouse_up_cb(void *data, static void _mouse_out_cb(void *data, Evas *evas, - Evas_Object *obj, + // FIXME(23Jul2019): callbacks are not working on image object + Evas_Object *parent, + // void *event_info) { - Evas_Object *img_obj = data; - - EEXT_CIRCLE_OBJECT_GET(img_obj, circle_obj) return; + // FIXME(23Jul2019): callbacks are not working on image object + Evas_Object *obj = (Evas_Object *)data; + // + EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return; EEXT_CIRCLE_OBJECT_SLIDER_DATA_GET(circle_obj, widget_data) return; if (circle_obj->disabled) return; @@ -419,53 +456,263 @@ _mouse_out_cb(void *data, } static void -_value_changed_cb(void *data, Evas_Object *obj, void *event_info) +_update_color_info(Eext_Circle_Object *obj) { - Eext_Circle_Object *circle_obj = data; - EEXT_CIRCLE_OBJECT_SLIDER_DATA_GET(circle_obj, widget_data) return; + EEXT_CIRCLE_OBJECT_SLIDER_DATA_GET(obj, data) return; - if (widget_data->drag) return; - if (widget_data->tap) return; - if (widget_data->rotary) return; + Eext_Circle_Color ext_color; + //default color + if (!edje_object_color_class_get(elm_layout_edje_get(data->parent), "B065L2", &ext_color.r, &ext_color.g, &ext_color.b, &ext_color.a, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)) + if (!edje_color_class_get("B065L2", &ext_color.r, &ext_color.g, &ext_color.b, &ext_color.a, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)) + { + ext_color.r = SLIDER_COLOR_R; + ext_color.g = SLIDER_COLOR_G; + ext_color.b = SLIDER_COLOR_B; + ext_color.a = SLIDER_COLOR_A; + } + data->color.r = ext_color.r; + data->color.g = ext_color.g; + data->color.b = ext_color.b; + data->color.a = ext_color.a; + + //disabled color + if (!edje_object_color_class_get(elm_layout_edje_get(data->parent), "B104L2D", &ext_color.r, &ext_color.g, &ext_color.b, &ext_color.a, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)) + if (!edje_color_class_get("B104L2D", &ext_color.r, &ext_color.g, &ext_color.b, &ext_color.a, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)) + { + ext_color.r = SLIDER_COLOR_DISABLED_R; + ext_color.g = SLIDER_COLOR_DISABLED_G; + ext_color.b = SLIDER_COLOR_DISABLED_B; + ext_color.a = SLIDER_COLOR_DISABLED_A; + } + data->disabled_color.r = ext_color.r; + data->disabled_color.g = ext_color.g; + data->disabled_color.b = ext_color.b; + data->disabled_color.a = ext_color.a; + + //BG color + if (!edje_object_color_class_get(elm_layout_edje_get(data->parent), "B065L3", &ext_color.r, &ext_color.g, &ext_color.b, &ext_color.a, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)) + if (!edje_color_class_get("B065L3", &ext_color.r, &ext_color.g, &ext_color.b, &ext_color.a, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)) + { + ext_color.r = SLIDER_BG_COLOR_R; + ext_color.g = SLIDER_BG_COLOR_G; + ext_color.b = SLIDER_BG_COLOR_B; + ext_color.a = SLIDER_BG_COLOR_A; + } + data->bg_color.r = ext_color.r; + data->bg_color.g = ext_color.g; + data->bg_color.b = ext_color.b; + data->bg_color.a = ext_color.a; + + //disabled BG color + if (!edje_object_color_class_get(elm_layout_edje_get(data->parent), "B104L1D", &ext_color.r, &ext_color.g, &ext_color.b, &ext_color.a, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)) + if (!edje_color_class_get("B104L1D", &ext_color.r, &ext_color.g, &ext_color.b, &ext_color.a, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)) + { + ext_color.r = SLIDER_BG_COLOR_DISABLED_R; + ext_color.g = SLIDER_BG_COLOR_DISABLED_G; + ext_color.b = SLIDER_BG_COLOR_DISABLED_B; + ext_color.a = SLIDER_BG_COLOR_DISABLED_A; + } + data->disabled_bg_color.r = ext_color.r; + data->disabled_bg_color.g = ext_color.g; + data->disabled_bg_color.b = ext_color.b; + data->disabled_bg_color.a = ext_color.a; + + //cue color + if (!edje_object_color_class_get(elm_layout_edje_get(data->parent), "B083", &ext_color.r, &ext_color.g, &ext_color.b, &ext_color.a, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)) + if (!edje_color_class_get("B083", &ext_color.r, &ext_color.g, &ext_color.b, &ext_color.a, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)) + { + ext_color.r = SLIDER_CUE_COLOR_R; + ext_color.g = SLIDER_CUE_COLOR_G; + ext_color.b = SLIDER_CUE_COLOR_B; + ext_color.a = SLIDER_CUE_COLOR_A; + } + data->cue_color.r = ext_color.r; + data->cue_color.g = ext_color.g; + data->cue_color.b = ext_color.b; + data->cue_color.a = ext_color.a; + + //cue press color + if (!edje_object_color_class_get(elm_layout_edje_get(data->parent), "B083P", &ext_color.r, &ext_color.g, &ext_color.b, &ext_color.a, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)) + if (!edje_color_class_get("B083P", &ext_color.r, &ext_color.g, &ext_color.b, &ext_color.a, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)) + { + ext_color.r = SLIDER_CUE_EFFECT_COLOR_R; + ext_color.g = SLIDER_CUE_EFFECT_COLOR_G; + ext_color.b = SLIDER_CUE_EFFECT_COLOR_B; + ext_color.a = SLIDER_CUE_EFFECT_COLOR_A; + } + data->cue_press_color.r = ext_color.r; + data->cue_press_color.g = ext_color.g; + data->cue_press_color.b = ext_color.b; + data->cue_press_color.a = ext_color.a; +} - Eext_Circle_Object_Item *item = NULL, *cue_item = NULL, *effect_item = NULL; +static void +_eext_circle_object_slider_change_color_signal_cb(void *data, Evas_Object *obj, const char *emission, const char *source) +{ + LOGI("theme is changed"); + + Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data; + + EEXT_CIRCLE_OBJECT_SLIDER_DATA_GET(circle_obj, slider_data) return; + + _update_color_info(circle_obj); + + Eext_Circle_Object_Item *item = NULL; + + item = _eext_circle_object_item_get(circle_obj, SLIDER_BG_ITEM_NAME); + if (item) + { + _eext_circle_object_item_color_set(item, slider_data->bg_color.r, slider_data->bg_color.g, slider_data->bg_color.b, slider_data->bg_color.a); + } item = _eext_circle_object_item_get(circle_obj, SLIDER_ITEM_NAME); + if (item) + { + _eext_circle_object_item_color_set(item, slider_data->color.r, slider_data->color.g, slider_data->color.b, slider_data->color.a); + } + item = _eext_circle_object_item_get(circle_obj, SLIDER_CUE_ITEM_NAME); + // ONEUI1.5(23Jul2019): s/w bezel support + if (item && slider_data->touch_enabled) + // + { + _eext_circle_object_item_color_set(item, slider_data->cue_color.r, slider_data->cue_color.g, slider_data->cue_color.b, slider_data->cue_color.a); + } + item = _eext_circle_object_item_get(circle_obj, SLIDER_CUE_EFFECT_ITEM_NAME); + // ONEUI1.5(23Jul2019): s/w bezel support + if (item && slider_data->touch_enabled) + // + { + _eext_circle_object_item_color_set(item, slider_data->cue_press_color.r, slider_data->cue_press_color.g, slider_data->cue_press_color.b, slider_data->cue_press_color.a); + } +} + +// ONEUI1.5(23Jul2019): s/w bezel support +static void +_slider_touch_enable(Evas_Object *obj) +{ + EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return; + EEXT_CIRCLE_OBJECT_SLIDER_DATA_GET(circle_obj, widget_data) return; + + if (widget_data->touch_enabled) return; + + evas_object_event_callback_add(widget_data->parent, EVAS_CALLBACK_MOUSE_DOWN, _mouse_down_cb, obj); + evas_object_event_callback_add(widget_data->parent, EVAS_CALLBACK_MOUSE_UP, _mouse_up_cb, obj); + evas_object_event_callback_add(widget_data->parent, EVAS_CALLBACK_MOUSE_OUT, _mouse_out_cb, obj); + evas_object_event_callback_add(widget_data->parent, EVAS_CALLBACK_MOUSE_MOVE, _mouse_move_cb, obj); + + widget_data->touch_enabled = EINA_TRUE; + + Eext_Circle_Object_Item *cue_item = NULL, *effect_item = NULL; cue_item = _eext_circle_object_item_get(circle_obj, SLIDER_CUE_ITEM_NAME); effect_item = _eext_circle_object_item_get(circle_obj, SLIDER_CUE_EFFECT_ITEM_NAME); - if (!item || !cue_item || !effect_item) return; + if (cue_item) + _eext_circle_object_item_color_set(cue_item, widget_data->cue_color.r, widget_data->cue_color.g, widget_data->cue_color.b, widget_data->cue_color.a); + if (effect_item) + _eext_circle_object_item_color_set(effect_item, widget_data->cue_press_color.r, widget_data->cue_press_color.g, widget_data->cue_press_color.b, widget_data->cue_press_color.a); +} - double value = item->value; - double angle = _eext_circle_object_item_value_angle_get(item, value); +static void +_slider_touch_disable(Evas_Object *obj) +{ + EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return; + EEXT_CIRCLE_OBJECT_SLIDER_DATA_GET(circle_obj, widget_data) return; + + if (!widget_data->touch_enabled) return; + + evas_object_event_callback_del(widget_data->parent, EVAS_CALLBACK_MOUSE_DOWN, _mouse_down_cb); + evas_object_event_callback_del(widget_data->parent, EVAS_CALLBACK_MOUSE_UP, _mouse_up_cb); + evas_object_event_callback_del(widget_data->parent, EVAS_CALLBACK_MOUSE_OUT, _mouse_out_cb); + evas_object_event_callback_del(widget_data->parent, EVAS_CALLBACK_MOUSE_MOVE, _mouse_move_cb); - _eext_circle_object_item_angle_offset_set(effect_item, angle - SLIDER_CUE_OFFSET); - _eext_circle_object_item_angle_set(effect_item, SLIDER_CUE_SIZE); - _eext_circle_object_item_angle_offset_set(cue_item, angle - SLIDER_CUE_OFFSET); - _eext_circle_object_item_angle_set(cue_item, SLIDER_CUE_SIZE); + widget_data->touch_enabled = EINA_FALSE; + + Eext_Circle_Object_Item *cue_item = NULL, *effect_item = NULL; + cue_item = _eext_circle_object_item_get(circle_obj, SLIDER_CUE_ITEM_NAME); + effect_item = _eext_circle_object_item_get(circle_obj, SLIDER_CUE_EFFECT_ITEM_NAME); + if (cue_item) + _eext_circle_object_item_color_set(cue_item, widget_data->cue_color.r, widget_data->cue_color.g, widget_data->cue_color.b, 0); + if (effect_item) + _eext_circle_object_item_color_set(effect_item, widget_data->cue_press_color.r, widget_data->cue_press_color.g, widget_data->cue_press_color.b, 0); } +static void +_bezel_changed_cb(int *node, void *data) +{ + Evas_Object *obj = (Evas_Object *)data; + + EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return; + EEXT_CIRCLE_OBJECT_SLIDER_DATA_GET(circle_obj, widget_data) return; + if (widget_data->user_touch_overwritten) return; + + Eina_Bool rotary = eext_rotary_event_is_enabled(); + if (!rotary) + _slider_touch_enable(obj); + else + _slider_touch_disable(obj); + +} +// + static void _eext_circle_object_slider_del_cb(Eext_Circle_Object *obj) { + EEXT_CIRCLE_OBJECT_SLIDER_DATA_GET(obj, data) return; + //ONEUI1.5(23Jul2019): sync with tizen4.0 + edje_object_signal_callback_del(elm_layout_edje_get(data->parent), "color_class,set", "B065L2", _eext_circle_object_slider_change_color_signal_cb); + edje_object_signal_callback_del(elm_layout_edje_get(data->parent), "color_class,set", "B104L2D", _eext_circle_object_slider_change_color_signal_cb); + edje_object_signal_callback_del(elm_layout_edje_get(data->parent), "color_class,set", "B065L3", _eext_circle_object_slider_change_color_signal_cb); + edje_object_signal_callback_del(elm_layout_edje_get(data->parent), "color_class,set", "B104L1D", _eext_circle_object_slider_change_color_signal_cb); + edje_object_signal_callback_del(elm_layout_edje_get(data->parent), "color_class,set", "B083", _eext_circle_object_slider_change_color_signal_cb); + edje_object_signal_callback_del(elm_layout_edje_get(data->parent), "color_class,set", "B083P", _eext_circle_object_slider_change_color_signal_cb); + // if (obj->widget_data) { Eext_Circle_Object_Slider_Data *slider_data = (Eext_Circle_Object_Slider_Data *)obj->widget_data; - if (slider_data) + if (slider_data && slider_data->touch_enabled) { - evas_object_event_callback_del(slider_data->hit_rect, EVAS_CALLBACK_MOUSE_DOWN, _mouse_down_cb); - evas_object_event_callback_del(slider_data->hit_rect, EVAS_CALLBACK_MOUSE_UP, _mouse_up_cb); - evas_object_event_callback_del(slider_data->hit_rect, EVAS_CALLBACK_MOUSE_OUT, _mouse_out_cb); - evas_object_event_callback_del(slider_data->hit_rect, EVAS_CALLBACK_MOUSE_MOVE, _mouse_move_cb); + // FIXME(23Jul2019): callbacks are not working on image object + evas_object_event_callback_del(data->parent, EVAS_CALLBACK_MOUSE_DOWN, _mouse_down_cb); + evas_object_event_callback_del(data->parent, EVAS_CALLBACK_MOUSE_UP, _mouse_up_cb); + evas_object_event_callback_del(data->parent, EVAS_CALLBACK_MOUSE_OUT, _mouse_out_cb); + evas_object_event_callback_del(data->parent, EVAS_CALLBACK_MOUSE_MOVE, _mouse_move_cb); + // } - - evas_object_smart_callback_del(obj->main_obj, SIG_VALUE_CHANGED, _value_changed_cb); - + //ONEUI1.5(02Jul2019): s/w bezel support + eext_rotary_event_changed_callback_del(_bezel_changed_cb); if (slider_data->cue_effect_transit.animator) ecore_animator_del(slider_data->cue_effect_transit.animator); + //ONEUI1.5(11Jan2019): Slider access support + Evas_Object *parent = elm_object_parent_widget_get(data->parent); + if (parent && !strcmp(evas_object_type_get(parent), "elm_naviframe")) + evas_object_smart_callback_del(parent, "item,activated", _grab_highlight_cb); + if (data->highlight_timer) + { + ecore_timer_del(data->highlight_timer); + data->highlight_timer = NULL; + } + if (data->read_timer) + { + ecore_timer_del(data->read_timer); + data->read_timer = NULL; + } + evas_object_smart_callback_del(elm_object_top_widget_get(data->parent), "focused", _win_focus_cb); + // free(obj->widget_data); obj->widget_data = NULL; } } +//ONEUI1.5(25Jan2019): Slider access support, add read timer +static Eina_Bool +_read_timer_cb(void *data) +{ + EEXT_CIRCLE_OBJECT_GET(data, circle_obj) return ECORE_CALLBACK_CANCEL; + EEXT_CIRCLE_OBJECT_SLIDER_DATA_GET(circle_obj, widget_data) return ECORE_CALLBACK_CANCEL; + __elm_atspi_bridge_highlighted_object_read(); + widget_data->read_timer = NULL; + return ECORE_CALLBACK_CANCEL; +} +// + static Eina_Bool _rotary_changed_cb(void *data, Evas_Object *obj, Eext_Rotary_Event_Info *info) { @@ -480,6 +727,8 @@ _rotary_changed_cb(void *data, Evas_Object *obj, Eext_Rotary_Event_Info *info) EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return EINA_FALSE; EEXT_CIRCLE_OBJECT_SLIDER_DATA_GET(circle_obj, widget_data) return EINA_FALSE; + LOGE("Slider_rotary_changed_callback call : time_stamp[%d], direction[%d]", info->time_stamp, info->direction); + Eext_Circle_Object_Item *item = NULL, *cue_item = NULL, *effect_item = NULL; item = _eext_circle_object_item_get(circle_obj, SLIDER_ITEM_NAME); cue_item = _eext_circle_object_item_get(circle_obj, SLIDER_CUE_ITEM_NAME); @@ -489,7 +738,7 @@ _rotary_changed_cb(void *data, Evas_Object *obj, Eext_Rotary_Event_Info *info) current_value = _eext_circle_object_item_value_get(item); _eext_circle_object_item_value_min_max_get(item, &min, &max); - multiplier = SLIDER_ROTARY_EVENT_VALUE_MULTIPLYER; + multiplier = SLIDER_ROTARY_EVENT_VALUE_MULTIPLIER; time_stamp_diff = info->time_stamp - widget_data->rotary_event_time_stamp; if (time_stamp_diff > SLIDER_ROTARY_EVENT_TIME_STAMP_THRESHOLD) @@ -507,21 +756,24 @@ _rotary_changed_cb(void *data, Evas_Object *obj, Eext_Rotary_Event_Info *info) { multiplier = value_count / (digit + 1) * pow(((threshold - time_stamp_diff) / threshold), digit + 1); - if (multiplier < SLIDER_ROTARY_EVENT_VALUE_MULTIPLYER) - multiplier = SLIDER_ROTARY_EVENT_VALUE_MULTIPLYER; + if (multiplier < SLIDER_ROTARY_EVENT_VALUE_MULTIPLIER) + multiplier = SLIDER_ROTARY_EVENT_VALUE_MULTIPLIER; } if (info->direction == EEXT_ROTARY_DIRECTION_CLOCKWISE) - next_value = current_value + widget_data->value_step * multiplier; + { + next_value = current_value + widget_data->value_step*multiplier; + } else - next_value = current_value - widget_data->value_step * multiplier; + { + next_value = current_value - widget_data->value_step*multiplier; + } if (next_value < min) next_value = min; else if (next_value > max) next_value = max; angle = _eext_circle_object_item_value_angle_get(item, next_value); - widget_data->rotary = EINA_TRUE; _eext_circle_object_item_angle_transit_set(effect_item, SLIDER_TRANSIT_TIME, SLIDER_CUE_SIZE, angle - SLIDER_CUE_OFFSET, EINA_TRUE, 0.25, 0.46, 0.45, 1.0); @@ -535,16 +787,16 @@ _rotary_changed_cb(void *data, Evas_Object *obj, Eext_Rotary_Event_Info *info) EINA_TRUE, 0.25, 0.46, 0.45, 1.0); - widget_data->rotary = EINA_FALSE; + evas_object_smart_callback_call(slider, SIG_VALUE_CHANGED, NULL); /* Accessibility */ + //ONEUI1.5(25Jan2019): Slider access support, add read timer if (elm_atspi_bridge_utils_is_screen_reader_enabled()) { - const char *slider_desc = NULL; - slider_desc = elm_atspi_accessible_description_get(slider); - if (slider_desc && strlen(slider_desc) > 0) - elm_atspi_bridge_utils_say(slider_desc, EINA_TRUE, NULL, NULL); + if (widget_data->read_timer) ecore_timer_del(widget_data->read_timer); + widget_data->read_timer = ecore_timer_add(HIGHLIGHT_UPDATE_READ_TIMEOUT, _read_timer_cb, slider); } + // return EINA_TRUE; } @@ -607,7 +859,7 @@ _eext_circle_object_slider_disabled_cb(Eext_Circle_Object *obj) data->disabled_bg_color.g, data->disabled_bg_color.b, data->disabled_bg_color.a); - + //ONEUI1.5(19Jun2019): Enable sw/hw bezel eext_rotary_object_event_callback_del(obj->main_obj, _rotary_changed_cb); } else @@ -624,7 +876,7 @@ _eext_circle_object_slider_disabled_cb(Eext_Circle_Object *obj) data->bg_color.g, data->bg_color.b, data->bg_color.a); - + //ONEUI1.5(19Jun2019): Enable sw/hw bezel eext_rotary_object_event_callback_add(obj->main_obj, _rotary_changed_cb, NULL); } } @@ -644,48 +896,24 @@ _eext_circle_object_slider_init(Evas_Object *parent, Eext_Circle_Object *obj) data = (Eext_Circle_Object_Slider_Data *)calloc(1, sizeof(Eext_Circle_Object_Slider_Data)); data->parent = parent; data->value_step = 1.0; - data->rotary_event_time_stamp = 0.0; + //ONEUI1.5(02Jul2019): s/w bezel support + data->user_touch_overwritten = EINA_FALSE; + // + //ONEUI1.5(19Jun2019): Enable sw/hw bezel + if (eext_rotary_event_is_enabled()) + { + data->rotary_event_time_stamp = 0.0; + data->touch_enabled = EINA_FALSE; + } + else + data->touch_enabled = EINA_TRUE; + // + data->tap = EINA_FALSE; data->drag = EINA_FALSE; - data->color.r = SLIDER_COLOR_R; - data->color.g = SLIDER_COLOR_G; - data->color.b = SLIDER_COLOR_B; - data->color.a = SLIDER_COLOR_A; - data->bg_color.r = SLIDER_BG_COLOR_R; - data->bg_color.g = SLIDER_BG_COLOR_G; - data->bg_color.b = SLIDER_BG_COLOR_B; - data->bg_color.a = SLIDER_BG_COLOR_A; - data->disabled_color.r = SLIDER_COLOR_DISABLED_R; - data->disabled_color.g = SLIDER_COLOR_DISABLED_G; - data->disabled_color.b = SLIDER_COLOR_DISABLED_B; - data->disabled_color.a = SLIDER_COLOR_DISABLED_A; - data->disabled_bg_color.r = SLIDER_BG_COLOR_DISABLED_R; - data->disabled_bg_color.g = SLIDER_BG_COLOR_DISABLED_G; - data->disabled_bg_color.b = SLIDER_BG_COLOR_DISABLED_B; - data->disabled_bg_color.a = SLIDER_BG_COLOR_DISABLED_A; - data->cue_color.r = SLIDER_CUE_COLOR_R; - data->cue_color.g = SLIDER_CUE_COLOR_G; - data->cue_color.b = SLIDER_CUE_COLOR_B; - data->cue_color.a = SLIDER_CUE_COLOR_A; - data->cue_press_color.r = SLIDER_CUE_EFFECT_COLOR_R; - data->cue_press_color.g = SLIDER_CUE_EFFECT_COLOR_G; - data->cue_press_color.b = SLIDER_CUE_EFFECT_COLOR_B; - data->cue_press_color.a = SLIDER_CUE_EFFECT_COLOR_A; - - data->hit_rect = evas_object_rectangle_add(evas_object_evas_get(parent)); - evas_object_smart_member_add(data->hit_rect, parent); - evas_object_color_set(data->hit_rect, 0, 0, 0, 0); - evas_object_resize(data->hit_rect, 360, 360); - evas_object_show(data->hit_rect); - evas_object_repeat_events_set(data->hit_rect, EINA_TRUE); - - evas_object_event_callback_add(data->hit_rect, EVAS_CALLBACK_MOUSE_DOWN, _mouse_down_cb, obj->main_obj); - evas_object_event_callback_add(data->hit_rect, EVAS_CALLBACK_MOUSE_UP, _mouse_up_cb, obj->main_obj); - evas_object_event_callback_add(data->hit_rect, EVAS_CALLBACK_MOUSE_OUT, _mouse_out_cb, obj->main_obj); - evas_object_event_callback_add(data->hit_rect, EVAS_CALLBACK_MOUSE_MOVE, _mouse_move_cb, obj->main_obj); - obj->widget_data = data; + _update_color_info(obj); //BG item = _eext_circle_object_item_new(); @@ -698,8 +926,13 @@ _eext_circle_object_slider_init(Evas_Object *parent, Eext_Circle_Object *obj) item = _eext_circle_object_item_new(); _eext_circle_object_item_name_set(item, SLIDER_CUE_EFFECT_ITEM_NAME); - _eext_circle_object_item_color_set(item, data->cue_press_color.r, data->cue_press_color.g, data->cue_press_color.b, data->cue_press_color.a); - _eext_circle_object_item_line_width_set(item, 14); + // ONEUI1.5(23Jul2019): s/w bezel support + if (data->touch_enabled) + _eext_circle_object_item_color_set(item, data->cue_press_color.r, data->cue_press_color.g, data->cue_press_color.b, data->cue_press_color.a); + else + _eext_circle_object_item_color_set(item, data->cue_press_color.r, data->cue_press_color.g, data->cue_press_color.b, 0); + // + _eext_circle_object_item_line_width_set(item, SLIDER_CUE_HIDDEN_WIDTH); _eext_circle_object_item_radius_set(item, SLIDER_RADIUS_SIZE); _eext_circle_object_item_round_cap_enable_set(item, EINA_TRUE); _eext_circle_object_item_angle_offset_set(item, item->angle_offset - SLIDER_CUE_OFFSET); @@ -708,8 +941,13 @@ _eext_circle_object_slider_init(Evas_Object *parent, Eext_Circle_Object *obj) item = _eext_circle_object_item_new(); _eext_circle_object_item_name_set(item, SLIDER_CUE_ITEM_NAME); - _eext_circle_object_item_color_set(item, data->cue_color.r, data->cue_color.g, data->cue_color.b, data->cue_color.a); - _eext_circle_object_item_line_width_set(item, 14); + // ONEUI1.5(23Jul2019): s/w bezel support + if (data->touch_enabled) + _eext_circle_object_item_color_set(item, data->cue_color.r, data->cue_color.g, data->cue_color.b, data->cue_color.a); + else + _eext_circle_object_item_color_set(item, data->cue_color.r, data->cue_color.g, data->cue_color.b, 0); + // + _eext_circle_object_item_line_width_set(item, SLIDER_CUE_HIDDEN_WIDTH); _eext_circle_object_item_radius_set(item, SLIDER_RADIUS_SIZE); _eext_circle_object_item_round_cap_enable_set(item, EINA_TRUE); _eext_circle_object_item_angle_offset_set(item, item->angle_offset - SLIDER_CUE_OFFSET); @@ -724,40 +962,225 @@ _eext_circle_object_slider_init(Evas_Object *parent, Eext_Circle_Object *obj) _eext_circle_object_item_value_min_max_set(item, 0, 10); _eext_circle_object_item_value_set(item, 0); _eext_circle_object_item_append(obj, item); - - evas_object_smart_callback_add(obj->main_obj, SIG_VALUE_CHANGED, _value_changed_cb, obj); eext_rotary_object_event_callback_add(obj->main_obj, _rotary_changed_cb, NULL); } +//ONEUI1.5(11Jan2019): Slider access support +static Eina_Bool +_slider_gesture_cb(void *data, Elm_Atspi_Gesture_Info gesture_info, Evas_Object *obj) +{ + LOGI("Gesture_type = %d x_beg = %d, x_end=%d y_beg=%d y_end=%d",gesture_info.type, + gesture_info.x_beg, gesture_info.x_end, gesture_info.y_beg, gesture_info.y_end); + + Evas_Object *slider = data; + int time_stamp_diff, multiplier; + double current_value; + double next_value; + double min, max; + double value_count, digit, threshold; + double angle; + + EEXT_CIRCLE_OBJECT_GET(slider, circle_obj) return EINA_FALSE; + EEXT_CIRCLE_OBJECT_SLIDER_DATA_GET(circle_obj, widget_data) return EINA_FALSE; + + if (gesture_info.type != ELM_ATSPI_GESTURE_ONE_FINGER_FLICK_UP && + gesture_info.type != ELM_ATSPI_GESTURE_ONE_FINGER_FLICK_DOWN) + return EINA_FALSE; + + Eext_Circle_Object_Item *item = NULL, *cue_item = NULL, *effect_item = NULL; + item = _eext_circle_object_item_get(circle_obj, SLIDER_ITEM_NAME); + cue_item = _eext_circle_object_item_get(circle_obj, SLIDER_CUE_ITEM_NAME); + effect_item = _eext_circle_object_item_get(circle_obj, SLIDER_CUE_EFFECT_ITEM_NAME); + if (!item || !cue_item || !effect_item) return EINA_FALSE; + + current_value = _eext_circle_object_item_value_get(item); + _eext_circle_object_item_value_min_max_get(item, &min, &max); + + multiplier = SLIDER_ROTARY_EVENT_VALUE_MULTIPLIER; + + time_stamp_diff = gesture_info.event_time - widget_data->rotary_event_time_stamp; + if (time_stamp_diff > SLIDER_ROTARY_EVENT_TIME_STAMP_THRESHOLD) + { + widget_data->rotary_event_time_stamp = gesture_info.event_time; + } + + _eext_circle_object_item_value_min_max_get(item, &min, &max); + value_count = (max - min) / widget_data->value_step; + + digit = log10(value_count); + + threshold = SLIDER_ROTARY_EVENT_ACCELERATION_TIME_DIFF + (digit * 10); + if (time_stamp_diff < threshold) + { + multiplier = value_count / (digit + 1) * pow(((threshold - time_stamp_diff) / threshold), digit + 1); + + if (multiplier < SLIDER_ROTARY_EVENT_VALUE_MULTIPLIER) + multiplier = SLIDER_ROTARY_EVENT_VALUE_MULTIPLIER; + } + + if (gesture_info.type == ELM_ATSPI_GESTURE_ONE_FINGER_FLICK_UP) + { + next_value = current_value + widget_data->value_step*multiplier; + } + else + { + next_value = current_value - widget_data->value_step*multiplier; + } + + if (next_value < min) next_value = min; + else if (next_value > max) next_value = max; + + angle = _eext_circle_object_item_value_angle_get(item, next_value); + + _eext_circle_object_item_angle_transit_set(effect_item, SLIDER_TRANSIT_TIME, + SLIDER_CUE_SIZE, angle - SLIDER_CUE_OFFSET, EINA_TRUE, + 0.25, 0.46, 0.45, 1.0); + + _eext_circle_object_item_angle_transit_set(cue_item, SLIDER_TRANSIT_TIME, + SLIDER_CUE_SIZE, angle - SLIDER_CUE_OFFSET, EINA_TRUE, + 0.25, 0.46, 0.45, 1.0); + + _eext_circle_object_item_value_transit_set(item, SLIDER_TRANSIT_TIME, + next_value, + EINA_TRUE, + 0.25, 0.46, 0.45, 1.0); + + evas_object_smart_callback_call(slider, SIG_VALUE_CHANGED, NULL); + + if (widget_data->read_timer) ecore_timer_del(widget_data->read_timer); + widget_data->read_timer = ecore_timer_add(HIGHLIGHT_UPDATE_READ_TIMEOUT, _read_timer_cb, slider); + return EINA_TRUE; +} + +static Eina_Bool _highlight_timer_cb(void *data) +{ + EEXT_CIRCLE_OBJECT_GET(data, circle_obj) return ECORE_CALLBACK_CANCEL; + EEXT_CIRCLE_OBJECT_SLIDER_DATA_GET(circle_obj, widget_data) return ECORE_CALLBACK_CANCEL; + //ONEUI1.5(09Jul2019): Check role before setting highlight + if (elm_atspi_accessible_role_get(widget_data->parent) != ELM_ATSPI_ROLE_REDUNDANT_OBJECT) + elm_atspi_component_highlight_grab(widget_data->parent); + // + widget_data->highlight_timer = NULL; + return ECORE_CALLBACK_CANCEL; +} + +static void +_grab_highlight_cb(void *data, Evas_Object *obj, void *event_info) +{ + EEXT_CIRCLE_OBJECT_GET(data, circle_obj) return; + EEXT_CIRCLE_OBJECT_SLIDER_DATA_GET(circle_obj, widget_data) return; + if (!evas_object_visible_get(widget_data->parent)) return; + if (widget_data->highlight_timer) ecore_timer_del(widget_data->highlight_timer); + widget_data->highlight_timer = ecore_timer_add(0.5, _highlight_timer_cb, data); + evas_object_smart_callback_del(obj, "item,activated", _grab_highlight_cb); +} + +static void +_show_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + //ONEUI1.5(09Jul2019): Check role before setting highlight + if (elm_atspi_accessible_role_get(obj) != ELM_ATSPI_ROLE_REDUNDANT_OBJECT) + elm_atspi_component_highlight_grab(obj); + // +} + +static void +_win_focus_cb(void *data, Evas_Object *obj, void *event_info) +{ + EEXT_CIRCLE_OBJECT_GET(data, circle_obj) return; + EEXT_CIRCLE_OBJECT_SLIDER_DATA_GET(circle_obj, widget_data) return; + if (!evas_object_visible_get(widget_data->parent)) return; + if (widget_data->highlight_timer) ecore_timer_del(widget_data->highlight_timer); + widget_data->highlight_timer = ecore_timer_add(0.5, _highlight_timer_cb, data); +} + +static void +_slider_screen_reader_changed(void *data, Evas_Object *obj, void *event_info) +{ + EEXT_CIRCLE_OBJECT_GET(data, circle_obj) return; + EEXT_CIRCLE_OBJECT_SLIDER_DATA_GET(circle_obj, widget_data) return; + + if (elm_atspi_bridge_utils_is_screen_reader_enabled()) + { + if (!strcmp(evas_object_type_get(elm_object_parent_widget_get(widget_data->parent)), "elm_naviframe")) + evas_object_smart_callback_add(elm_object_parent_widget_get(widget_data->parent), "item,activated", _grab_highlight_cb, obj); + evas_object_event_callback_add(widget_data->parent, EVAS_CALLBACK_SHOW, _show_cb, NULL); + evas_object_smart_callback_add(elm_object_top_widget_get(widget_data->parent), "focused", _win_focus_cb, obj); + } + else + { + if (!strcmp(evas_object_type_get(elm_object_parent_widget_get(widget_data->parent)), "elm_naviframe")) + evas_object_smart_callback_del(elm_object_parent_widget_get(widget_data->parent), "item,activated", _grab_highlight_cb); + if (widget_data->highlight_timer) + { + ecore_timer_del(widget_data->highlight_timer); + widget_data->highlight_timer = NULL; + } + evas_object_event_callback_del(widget_data->parent, EVAS_CALLBACK_SHOW, _show_cb); + evas_object_smart_callback_del(elm_object_top_widget_get(widget_data->parent), "focused", _win_focus_cb); + } +} + static char * -_accessible_description_cb(void *data, Evas_Object *obj) +_get_accessible_name(Evas_Object *slider) { char *ret; - char buf[255]; Eina_Strbuf *sbuf; + char buf[10]; const char *slider_name; - const char *format; - Evas_Object *slider; sbuf = eina_strbuf_new(); - slider = data; slider_name = elm_atspi_accessible_name_get(slider); bindtextdomain (PACKAGE, LOCALE_DIR); if (!slider_name) slider_name = "Slider"; + snprintf(buf, sizeof(buf), "%d", (int)eext_circle_object_value_get(slider)); - eina_strbuf_append(sbuf, slider_name); - eina_strbuf_append(sbuf, ", "); - - format = _("WDS_TTS_TBBODY_ROTATE_BEZEL_TO_ADJUST_PS"); - snprintf(buf, sizeof(buf), format, slider_name); eina_strbuf_append(sbuf, buf); + eina_strbuf_append(sbuf, ", "); + eina_strbuf_append(sbuf, slider_name); ret = eina_strbuf_string_steal(sbuf); eina_strbuf_free(sbuf); - return ret; + return strdup(ret); } +static char * +_get_accessible_description(Evas_Object *slider) +{ + char buf[255]; + const char *slider_name; + + slider_name = elm_atspi_accessible_name_get(slider); + + bindtextdomain (PACKAGE, LOCALE_DIR); + if (!slider_name) slider_name = "Slider"; + + //ONEUI1.5(19Jun2019): Enable sw/hw bezel + char *str = NULL; + if (eext_rotary_event_type_get() == EEXT_ROTARY_EVENT_TYPE_HW_BEZEL) + str = _("WDS_ACCS_TBBODY_TURN_BEZEL_TO_ADJUST_PS"); + else + str = _("WDS_ACCS_TBBODY_SWIPE_UP_OR_DOWN_TO_CHANGE_PS"); + // + + snprintf(buf, sizeof(buf), str, slider_name); + return strdup(buf); +} + +static char * +_accessible_name_cb(void *data, Evas_Object *obj) +{ + return _get_accessible_name((Evas_Object *)data); +} + +static char * +_accessible_description_cb(void *data, Evas_Object *obj) +{ + return _get_accessible_description((Evas_Object *)data); +} +// + EAPI Evas_Object * eext_circle_object_slider_add(Evas_Object *parent, Eext_Circle_Surface *surface) { @@ -770,12 +1193,44 @@ eext_circle_object_slider_add(Evas_Object *parent, Eext_Circle_Surface *surface) EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return NULL; _eext_circle_object_slider_init(parent, circle_obj); - - /* TODO: Reading information should be changed with UX team */ - /* ELM_ATSPI_ROLE_PUSH_BUTTON to make layout grab highlight */ - elm_atspi_accessible_role_set(parent, ELM_ATSPI_ROLE_PUSH_BUTTON); + //ONEUI1.5(02Jul2019): s/w bezel support + eext_rotary_event_changed_callback_add(_bezel_changed_cb, obj); + + //ONEUI1.5(23Jul2019): sync with tizen4.0 + edje_object_signal_callback_add(elm_layout_edje_get(parent), "color_class,set", "B065L2", _eext_circle_object_slider_change_color_signal_cb, circle_obj); + edje_object_signal_callback_add(elm_layout_edje_get(parent), "color_class,set", "B104L2D", _eext_circle_object_slider_change_color_signal_cb, circle_obj); + edje_object_signal_callback_add(elm_layout_edje_get(parent), "color_class,set", "B065L3", _eext_circle_object_slider_change_color_signal_cb, circle_obj); + edje_object_signal_callback_add(elm_layout_edje_get(parent), "color_class,set", "B104L1D", _eext_circle_object_slider_change_color_signal_cb, circle_obj); + edje_object_signal_callback_add(elm_layout_edje_get(parent), "color_class,set", "B083", _eext_circle_object_slider_change_color_signal_cb, circle_obj); + edje_object_signal_callback_add(elm_layout_edje_get(parent), "color_class,set", "B083P", _eext_circle_object_slider_change_color_signal_cb, circle_obj); + // + + //ONEUI1.5(24Jan2019): Slider access support + elm_atspi_accessible_role_set(parent, ELM_ATSPI_ROLE_SLIDER); + elm_atspi_accessible_reading_info_type_set(parent, ELM_ACCESSIBLE_READING_INFO_TYPE_NAME|ELM_ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION); + elm_atspi_accessible_name_cb_set(parent, _accessible_name_cb, obj); elm_atspi_accessible_description_cb_set(parent, _accessible_description_cb, obj); - elm_atspi_accessible_reading_info_type_set(parent, ELM_ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION); + // + //ONEUI1.5(19Jun2019): Enable sw/hw bezel + if (!eext_rotary_event_is_enabled()) + // + { + evas_object_event_callback_add(obj, EVAS_CALLBACK_MOUSE_DOWN, _mouse_down_cb, NULL); + evas_object_event_callback_add(obj, EVAS_CALLBACK_MOUSE_UP, _mouse_up_cb, NULL); + evas_object_event_callback_add(obj, EVAS_CALLBACK_MOUSE_OUT, _mouse_out_cb, NULL); + evas_object_event_callback_add(obj, EVAS_CALLBACK_MOUSE_MOVE, _mouse_move_cb, NULL); + } + //ONEUI1.5(11Jan2019): Slider access support + evas_object_smart_callback_add(parent, "atspi,screen,reader,changed", _slider_screen_reader_changed, obj); + if (elm_atspi_bridge_utils_is_screen_reader_enabled()) + { + if (!strcmp(evas_object_type_get(elm_object_parent_widget_get(parent)), "elm_naviframe")) + evas_object_smart_callback_add(elm_object_parent_widget_get(parent), "item,activated", _grab_highlight_cb, obj); + evas_object_event_callback_add(parent, EVAS_CALLBACK_SHOW, _show_cb, NULL); + evas_object_smart_callback_add(elm_object_top_widget_get(parent), "focused", _win_focus_cb, obj); + } + elm_atspi_accessible_gesture_cb_set(parent, _slider_gesture_cb, obj); + // return obj; } @@ -842,4 +1297,4 @@ _eext_circle_object_slider_value_transit_set_internal(Evas_Object *obj, double v 0.25, 0.46, 0.45, 1.0); return EINA_TRUE; -} \ No newline at end of file +} diff --git a/src/wearable/circle/efl_extension_circle_object_spinner.c b/src/wearable/circle/efl_extension_circle_object_spinner.c index 8d4a7da..67ea7bd 100644 --- a/src/wearable/circle/efl_extension_circle_object_spinner.c +++ b/src/wearable/circle/efl_extension_circle_object_spinner.c @@ -29,7 +29,9 @@ static const char SIGNAL_ACTIVATED[] = "rotary,activated"; static const char SIGNAL_DEACTIVATED[] = "rotary,deactivated"; +extern void *elm_object_accessibility_currently_highlighted_get(void); +//ONEUI1.5(04Jul2019): Apply blink effect static void _start_blink_effect(Evas_Object *obj) { @@ -53,100 +55,172 @@ _stop_blink_effect(Evas_Object *obj) } static void -_eext_circle_object_spinner_activated_cb(void *data, - Evas_Object *obj EINA_UNUSED, - void *event_info EINA_UNUSED) +_spinner_bezel_changed_cb(int *node, void *data) { Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data; EEXT_CIRCLE_OBJECT_SPINNER_DATA_GET(circle_obj, widget_data) return; - widget_data->spinner_activated = EINA_TRUE; - _start_blink_effect(circle_obj->widget_object); + Eina_Bool rotary = eext_rotary_event_is_enabled(); + if (rotary && widget_data->spinner_activated) + _start_blink_effect(circle_obj->widget_object); + else + _stop_blink_effect(circle_obj->widget_object); +} +// +static void +_eext_circle_object_spinner_activated_cb(void *data, + Evas_Object *obj, + void *event_info) +{ + Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data; + EEXT_CIRCLE_OBJECT_SPINNER_DATA_GET(circle_obj, widget_data) return; + widget_data->spinner_activated = EINA_TRUE; + //ONEUI1.5(04Jul2019): Apply blink effect + if (eext_rotary_event_is_enabled()) + _start_blink_effect(circle_obj->widget_object); + eext_rotary_event_changed_callback_add(_spinner_bezel_changed_cb, circle_obj); } static void _eext_circle_object_spinner_deactivated_cb(void *data, - Evas_Object *obj EINA_UNUSED, - void *event_info EINA_UNUSED) + Evas_Object *obj, + void *event_info) { Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data; EEXT_CIRCLE_OBJECT_SPINNER_DATA_GET(circle_obj, widget_data) return; - widget_data->spinner_activated = EINA_FALSE; + //ONEUI1.5(04Jul2019): Apply blink effect _stop_blink_effect(circle_obj->widget_object); + eext_rotary_event_changed_callback_del(_spinner_bezel_changed_cb); + // } static void _eext_circle_object_spinner_genlist_activated_cb(void *data, - Evas_Object *obj EINA_UNUSED, - void *event_info EINA_UNUSED) + Evas_Object *obj, + void *event_info) { Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data; EEXT_CIRCLE_OBJECT_SPINNER_DATA_GET(circle_obj, widget_data) return; - widget_data->genlist_activated = EINA_TRUE; } static void _eext_circle_object_spinner_genlist_deactivated_cb(void *data, - Evas_Object *obj EINA_UNUSED, - void *event_info EINA_UNUSED) + Evas_Object *obj, + void *event_info) { Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data; EEXT_CIRCLE_OBJECT_SPINNER_DATA_GET(circle_obj, widget_data) return; - widget_data->genlist_activated = EINA_FALSE; } static void -_spinner_genlist_hide_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_spinner_genlist_hide_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_GET(circle_obj, widget_data) return; - + Eext_Circle_Object_Spinner_Data *widget_data = (Eext_Circle_Object_Spinner_Data *)data; if (!widget_data->circle_genlist) return; - widget_data->genlist_visible = EINA_FALSE; + if (widget_data->genlist_activated) eext_rotary_object_event_activated_set(widget_data->circle_obj->widget_object, EINA_TRUE); +} - if (widget_data->genlist_activated) eext_rotary_object_event_activated_set(circle_obj->widget_object, EINA_TRUE); +//ONEUI1.5(14Mar2019): Scrolling should be enabled after current value item is aligned +static void +_spinner_genlist_aligned_item_detected_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Eext_Circle_Object_Spinner_Data *widget_data = (Eext_Circle_Object_Spinner_Data *)data; + if (widget_data->spinner_activated && widget_data->genlist_visible) + eext_rotary_object_event_activated_set(widget_data->circle_genlist, EINA_TRUE); } +// static void _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_GET(circle_obj, widget_data) return; - + Eext_Circle_Object_Spinner_Data *widget_data = (Eext_Circle_Object_Spinner_Data *)data; Evas_Object *genlist = NULL; - if (!widget_data->circle_genlist) { genlist = elm_object_part_content_get(obj, "elm.swallow.genlist"); - widget_data->genlist = genlist; - widget_data->circle_genlist = eext_circle_object_genlist_add(widget_data->genlist, circle_obj->surface); - + widget_data->circle_genlist = eext_circle_object_genlist_add(widget_data->genlist, widget_data->circle_obj->surface); eext_circle_object_genlist_scroller_policy_set(widget_data->circle_genlist, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); - - 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); + evas_object_smart_callback_add(widget_data->genlist, "hide", _spinner_genlist_hide_cb, widget_data); + //ONEUI1.5(14Mar2019): Scrolling should be enabled after current value item is aligned + evas_object_smart_callback_add(widget_data->genlist, "aligned,item,detected", _spinner_genlist_aligned_item_detected_cb, widget_data); + // + evas_object_smart_callback_add(widget_data->circle_genlist, SIGNAL_ACTIVATED, _eext_circle_object_spinner_genlist_activated_cb, widget_data->circle_obj); + evas_object_smart_callback_add(widget_data->circle_genlist, SIGNAL_DEACTIVATED, _eext_circle_object_spinner_genlist_deactivated_cb, widget_data->circle_obj); } - widget_data->genlist_visible = EINA_TRUE; - if (widget_data->spinner_activated) eext_rotary_object_event_activated_set(widget_data->circle_genlist, EINA_TRUE); } +//ONEUI1.5(28Feb2019): update spinner value based on rotation direction +static void +_update_spinner_value(Evas_Object *spinner, Eext_Rotary_Event_Direction direction) +{ + double current_val, step_val, max_val, min_val; + Eina_Bool wrap_mode; + current_val = elm_spinner_value_get(spinner); + step_val = elm_spinner_step_get(spinner); + elm_spinner_min_max_get(spinner, &min_val, &max_val); + wrap_mode = elm_spinner_wrap_get(spinner); + if (direction == EEXT_ROTARY_DIRECTION_CLOCKWISE) + { + if (wrap_mode) + { + if (current_val == max_val) + elm_spinner_value_set(spinner, min_val); + else + elm_spinner_value_set(spinner, current_val + step_val); + } + else + { + if (current_val == max_val) + elm_spinner_value_set(spinner, max_val); + else + elm_spinner_value_set(spinner, current_val + step_val); + } + } + else if (direction == EEXT_ROTARY_DIRECTION_COUNTER_CLOCKWISE) + { + if (wrap_mode) + { + if (current_val == min_val) + elm_spinner_value_set(spinner, max_val); + else + elm_spinner_value_set(spinner, current_val - step_val); + } + else + { + if (current_val == min_val) + elm_spinner_value_set(spinner, min_val); + else + elm_spinner_value_set(spinner, current_val - step_val); + } + } +} +// + static Eina_Bool -_rotary_changed_cb(void *data, Evas_Object *obj EINA_UNUSED, Eext_Rotary_Event_Info *info EINA_UNUSED) +_rotary_changed_cb(void *data, Evas_Object *obj, Eext_Rotary_Event_Info *info) { Eext_Circle_Object *circle_obj = data; Eext_Circle_Object_Spinner_Data *widget_data = (Eext_Circle_Object_Spinner_Data *)circle_obj->widget_data; - if (!widget_data->genlist_visible) + Eina_Bool is_activated_or_is_highlighted = EINA_FALSE; + + if (elm_atspi_bridge_utils_is_screen_reader_enabled()) + is_activated_or_is_highlighted = (elm_object_accessibility_currently_highlighted_get() == (void*)circle_obj->widget_object); + else is_activated_or_is_highlighted = widget_data->spinner_activated; + + if (!widget_data->genlist_visible && is_activated_or_is_highlighted) { + //ONEUI1.5(28Feb2019): update spinner value based on rotation direction + _update_spinner_value(circle_obj->widget_object, info->direction); + // widget_data->genlist_visible = EINA_TRUE; - elm_layout_signal_emit(circle_obj->widget_object, "elm,action,genlist,toggle", "elm"); + elm_layout_signal_emit(circle_obj->widget_object, "elm,action,entry,toggle", "elm"); } return EINA_TRUE; } @@ -156,14 +230,12 @@ _eext_circle_object_spinner_del_cb(Eext_Circle_Object *obj) { if (!obj) return; - EEXT_CIRCLE_OBJECT_SPINNER_DATA_GET(obj, widget_data) return; 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); - if (widget_data->circle_genlist) { evas_object_smart_callback_del_full(widget_data->circle_genlist, SIGNAL_ACTIVATED, _eext_circle_object_spinner_genlist_activated_cb, obj); @@ -190,19 +262,19 @@ _eext_circle_object_spinner_init(Eext_Circle_Object *obj, Evas_Object *spinner) data = (Eext_Circle_Object_Spinner_Data *)calloc(1, sizeof(Eext_Circle_Object_Spinner_Data)); if (!data) { - ERR("Could not allocate memory for Eext_Circle_Object_Spinner_Data!"); + LOGE("Could not allocate memory for Eext_Circle_Object_Spinner_Data!"); return; } + data->circle_obj = 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); + evas_object_smart_callback_add(spinner, "genlist,show", _spinner_genlist_show_cb, 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); - 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); diff --git a/src/wearable/circle/efl_extension_circle_surface.c b/src/wearable/circle/efl_extension_circle_surface.c index 831f625..3215f33 100644 --- a/src/wearable/circle/efl_extension_circle_surface.c +++ b/src/wearable/circle/efl_extension_circle_surface.c @@ -30,7 +30,7 @@ _eext_circle_surface_main_obj_add(Evas_Object *parent) if (!main_obj) { - ERR("Failed to create elm_table object."); + LOGE("Failed to create elm_table object."); return NULL; } @@ -55,7 +55,7 @@ _eext_circle_surface_vector_draw_arc(Efl_VG *vg, r = (r * a) / 255; g = (g * a) / 255; b = (b * a) / 255; - evas_vg_shape_stroke_color_set(vg, r, g, b, a); + efl_gfx_shape_stroke_color_set(vg, r, g, b, a); int x, y, w, h; w = radius * 2; @@ -63,12 +63,12 @@ _eext_circle_surface_vector_draw_arc(Efl_VG *vg, x = (surface_width - w) / 2; y = (surface_height - h) / 2; - evas_vg_shape_append_arc(vg, x, y, w, h, (angle1 * -1) + 90, (angle2 - angle1) * -1); + efl_gfx_path_append_arc(vg, x, y, w, h, (angle1 * -1) + 90, (angle2 - angle1) * -1); if (round_cap) - evas_vg_shape_stroke_cap_set(vg, EFL_GFX_CAP_ROUND); + efl_gfx_shape_stroke_cap_set(vg, EFL_GFX_CAP_ROUND); else - evas_vg_shape_stroke_cap_set(vg, EFL_GFX_CAP_BUTT); + efl_gfx_shape_stroke_cap_set(vg, EFL_GFX_CAP_BUTT); } static void @@ -81,7 +81,7 @@ _eext_circle_surface_render(void *data) if (!surface) { - ERR("Surface is NULL... Going to remove surface render function."); + LOGE("Surface is NULL... Going to remove surface render function."); return; } @@ -91,8 +91,8 @@ _eext_circle_surface_render(void *data) { Eext_Circle_Object_Item *item; - if ((!render_obj->visible) || - (render_obj->visible_on_activate && !(render_obj->is_active))) + if (!render_obj->changed && ((!render_obj->visible) || + (render_obj->visible_on_activate && !(render_obj->is_active)))) { efl_parent_set(render_obj->vg_container, render_obj->main_obj); continue; @@ -102,6 +102,7 @@ _eext_circle_surface_render(void *data) efl_parent_set(render_obj->vg_container, surface->vg_root); } + render_obj->changed = EINA_FALSE; /* Find the last object's bg file path. * Currently, only one bg image can be drawn. */ if (_eext_circle_object_bg_file_path_get(render_obj)) @@ -116,8 +117,9 @@ _eext_circle_surface_render(void *data) EINA_LIST_FOREACH(render_obj->items, ll, item) { // Skip invisible item. - if (item->draw.color.a == 0) continue; + if (!item->color_changed && item->draw.color.a == 0) continue; + item->color_changed = EINA_FALSE; // If there is no text, the item is arc item. if (!item->text) { @@ -125,14 +127,14 @@ _eext_circle_surface_render(void *data) if (item->line_width) { double angle1, angle2; - Eina_Bool is_mirrored = EINA_FALSE; + surface->is_mirrored = EINA_FALSE; if (render_obj->mirrored_state == EEXT_CIRCLE_MIRRORED_CONFIG) - is_mirrored = elm_config_mirrored_get(); + surface->is_mirrored = elm_config_mirrored_get(); else if (render_obj->mirrored_state == EEXT_CIRCLE_MIRRORED_ON) - is_mirrored = EINA_TRUE; + surface->is_mirrored = EINA_TRUE; - if (is_mirrored) + if (surface->is_mirrored) { angle1 = (item->draw.angle_offset + item->min_angle) * -1; angle2 = (item->draw.angle_offset + item->draw.angle) * -1; @@ -182,6 +184,7 @@ static void _eext_circle_surface_render_finish(Eext_Circle_Surface *surface) { if (!surface) return; + if (!EINA_MAGIC_CHECK(surface, EEXT_CIRCLE_SURFACE_MAGIC)) return; if (surface->render_job) ecore_job_del(surface->render_job); surface->render_job = NULL; @@ -190,6 +193,9 @@ _eext_circle_surface_render_finish(Eext_Circle_Surface *surface) static void _eext_circle_surface_vector_finish(Eext_Circle_Surface *surface) { + if (!surface) return; + if (!EINA_MAGIC_CHECK(surface, EEXT_CIRCLE_SURFACE_MAGIC)) return; + if (surface->vg_obj) evas_object_del(surface->vg_obj); surface->vg_obj = NULL; @@ -207,7 +213,7 @@ _eext_circle_surface_vector_init(Eext_Circle_Surface *surface) if (surface->main_obj == NULL) { - ERR("Fail to get buffer from image object!"); + LOGE("Fail to get buffer from image object!"); return; } @@ -237,7 +243,7 @@ _eext_circle_surface_update(Eext_Circle_Surface *surface) if ((surface->w != 0) && (surface->h != 0)) { - INF("Surface will be initialized!"); + LOGI("Surface will be initialized!"); _eext_circle_surface_vector_init(surface); _eext_circle_surface_changed(surface); } @@ -260,7 +266,10 @@ _eext_circle_surface_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_i { Eext_Circle_Surface *surface = (Eext_Circle_Surface *)data; - INF("Surface is going to free in delete callback for image widget."); + if (!surface) return; + if (!EINA_MAGIC_CHECK(surface, EEXT_CIRCLE_SURFACE_MAGIC)) return; + + LOGI("Surface is going to free in delete callback for image widget."); _eext_circle_surface_del_internal(surface); } @@ -268,6 +277,8 @@ static void _eext_circle_surface_parent_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) { Eext_Circle_Surface *surface = (Eext_Circle_Surface *)data; + if (!surface) return; + if (!EINA_MAGIC_CHECK(surface, EEXT_CIRCLE_SURFACE_MAGIC)) return; surface->parent = NULL; } @@ -276,6 +287,8 @@ static void _eext_circle_surface_hide_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) { Eext_Circle_Surface *surface = (Eext_Circle_Surface *)data; + if (!surface) return; + if (!EINA_MAGIC_CHECK(surface, EEXT_CIRCLE_SURFACE_MAGIC)) return; evas_object_hide(surface->vg_obj); _eext_circle_surface_render_finish(surface); @@ -294,6 +307,7 @@ static void _eext_circle_surface_object_rotary_activated_cb(void *data, Evas_Object *obj, void *event_info) { Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data; + if (!circle_obj) return; evas_object_show(circle_obj->main_obj); circle_obj->is_active = EINA_TRUE; @@ -325,6 +339,8 @@ static void _deactivated_obj_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) { Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data; + if (!circle_obj) return; + if (!EINA_MAGIC_CHECK(circle_obj->surface, EEXT_CIRCLE_SURFACE_MAGIC)) return; if (circle_obj && circle_obj->surface && circle_obj->surface->parent_surface && (circle_obj->surface->parent_surface->type == EEXT_CIRCLE_SURFACE_TYPE_NAVIFRAME)) @@ -338,10 +354,13 @@ static void _eext_circle_surface_object_rotary_deactivated_cb(void *data, Evas_Object *obj, void *event_info) { Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data; + if (!circle_obj) return; evas_object_hide(circle_obj->main_obj); circle_obj->is_active = EINA_FALSE; + if (!EINA_MAGIC_CHECK(circle_obj->surface, EEXT_CIRCLE_SURFACE_MAGIC)) return; + // Previous view's circle object should not be disappeared while naviframe effect. // At here, just keep the current deactivated object. if (circle_obj->surface && circle_obj->surface->parent_surface && @@ -362,11 +381,11 @@ _eext_circle_surface_object_rotary_deactivated_cb(void *data, Evas_Object *obj, static Eext_Circle_Surface * _eext_circle_surface_naviframe_item_view_add(Evas_Object *layout) { - Eext_Circle_Surface *surface; + Eext_Circle_Surface *surface = NULL; if (!layout) { - ERR("The given Evas_Object is NULL! It returns NULL."); + LOGE("The given Evas_Object is NULL! It returns NULL."); return NULL; } @@ -374,20 +393,27 @@ _eext_circle_surface_naviframe_item_view_add(Evas_Object *layout) { surface = _eext_circle_surface_add(layout, EEXT_CIRCLE_SURFACE_TYPE_DEFAULT); + if (!surface) + { + LOGE("Surface creation failed!"); + return NULL; + } + + if (!surface->main_obj) { - ERR("Surface doesn't have image widget for drawing. It returns NULL."); + LOGE("Surface doesn't have image widget for drawing. It returns NULL."); return NULL; } - INF("Put the surface[%p]'s widget[%p] to layout widget[%p]", surface, surface->main_obj, layout); + LOGI("Put the surface[%p]'s widget[%p] to layout widget[%p]", surface, surface->main_obj, layout); elm_object_part_content_set(layout, "elm.swallow.circle", surface->main_obj); return surface; } else { - ERR("There is no \"elm.swallow.circle\" part in elm_layout widget! It returns NULL."); + LOGE("There is no \"elm.swallow.circle\" part in elm_layout widget! It returns NULL."); return NULL; } } @@ -396,15 +422,16 @@ static void _naviframe_item_push_cb(void *data, Evas_Object *obj, void *event_in { Evas_Object *view = (Evas_Object *)event_info; Eext_Circle_Surface *surface = (Eext_Circle_Surface *)data; - Eext_Circle_Surface *view_surface; - Eext_Circle_Object *circle_obj; - Eina_List *l, *l_next; + Eext_Circle_Surface *view_surface = NULL; + Eext_Circle_Object *circle_obj = NULL; + Eina_List *l = NULL, *l_next = NULL; if (!surface) { - ERR("No matched surface exists for the naviframe:%p", obj); + LOGE("No matched surface exists for the naviframe:%p", obj); return; } + if (!EINA_MAGIC_CHECK(surface, EEXT_CIRCLE_SURFACE_MAGIC)) return; view_surface = _eext_circle_surface_naviframe_item_view_add(view); view_surface->parent_surface = surface; @@ -434,8 +461,10 @@ static void _naviframe_item_push_cb(void *data, Evas_Object *obj, void *event_in static void _eext_circle_surface_del_internal(Eext_Circle_Surface *surface) { - Eext_Circle_Object *obj; - Eina_List *l, *l_next; + Eext_Circle_Object *obj = NULL; + Eina_List *l = NULL, *l_next = NULL; + if (!surface) return; + if (!EINA_MAGIC_CHECK(surface, EEXT_CIRCLE_SURFACE_MAGIC)) return; if (surface->type == EEXT_CIRCLE_SURFACE_TYPE_NAVIFRAME) { @@ -477,7 +506,7 @@ _eext_circle_surface_del_internal(Eext_Circle_Surface *surface) if (surface->type != EEXT_CIRCLE_SURFACE_TYPE_PRIVATE) { Eext_Circle_Surface *private_surface; - INF("Private Surface will be initialized for widget[%p], circle_obj[%p]!", + LOGI("Private Surface will be initialized for widget[%p], circle_obj[%p]!", obj->main_obj, obj); surface->render_objs = eina_list_remove_list(surface->render_objs, l); @@ -502,12 +531,19 @@ _eext_circle_surface_del_internal(Eext_Circle_Surface *surface) } } + if (surface->map) + evas_map_free(surface->map); + + if (surface->bg_file_path) { eina_stringshare_del(surface->bg_file_path); surface->bg_file_path = NULL; } + EINA_MAGIC_SET(surface, EINA_MAGIC_NONE); + LOGI("surface %p is freed", surface); + free(surface); } @@ -535,14 +571,15 @@ _eext_circle_surface_common_init(Eext_Circle_Surface *surface) Eext_Circle_Surface * _eext_circle_surface_init(Evas_Object *main_obj, Evas_Object *parent, Eext_Circle_Surface_Type type) { - Eext_Circle_Surface *surface; + Eext_Circle_Surface *surface = NULL; surface = (Eext_Circle_Surface *)calloc(1, sizeof(Eext_Circle_Surface)); if (!surface) { - ERR("Fail to calloc for (Eext_Circle_Surface)"); + LOGE("Fail to calloc for (Eext_Circle_Surface)"); return NULL; } + EINA_MAGIC_SET(surface, EEXT_CIRCLE_SURFACE_MAGIC); surface->type = type; surface->parent = parent; @@ -552,11 +589,23 @@ _eext_circle_surface_init(Evas_Object *main_obj, Evas_Object *parent, Eext_Circl if (type == EEXT_CIRCLE_SURFACE_TYPE_NAVIFRAME) { + // ONEUI1.5 (20180508) : Fix for avoiding multiple callbacks when multiple naviframe surfaces are added + evas_object_smart_callback_del(surface->parent, "item,pushed,internal", _naviframe_item_push_cb); + evas_object_event_callback_del(surface->parent, EVAS_CALLBACK_DEL, _eext_circle_surface_del_cb); + // + // If the surface is created with elm_naviframe. evas_object_smart_callback_add(surface->parent, "item,pushed,internal", _naviframe_item_push_cb, surface); evas_object_event_callback_add(surface->parent, EVAS_CALLBACK_DEL, _eext_circle_surface_del_cb, surface); } - else if (type != EEXT_CIRCLE_SURFACE_TYPE_PRIVATE) + else if (type == EEXT_CIRCLE_SURFACE_TYPE_PRIVATE) + { + evas_object_event_callback_add(surface->parent, EVAS_CALLBACK_RESIZE, _eext_circle_surface_resize_cb, surface); + evas_object_event_callback_add(surface->parent, EVAS_CALLBACK_DEL, _eext_circle_surface_del_cb, surface); + evas_object_event_callback_add(surface->parent, EVAS_CALLBACK_HIDE, _eext_circle_surface_hide_cb, surface); + evas_object_event_callback_add(surface->parent, EVAS_CALLBACK_SHOW, _eext_circle_surface_show_cb, surface); + } + else { evas_object_event_callback_add(surface->parent, EVAS_CALLBACK_DEL, _eext_circle_surface_parent_del_cb, surface); } @@ -579,6 +628,7 @@ _eext_circle_surface_object_remove(Eext_Circle_Surface *surface, Eext_Circle_Obj Eext_Circle_Object_Item *item; if (!surface) return; + if (!EINA_MAGIC_CHECK(surface, EEXT_CIRCLE_SURFACE_MAGIC)) return; if (!obj) return; EINA_LIST_FOREACH(obj->items, l, item) @@ -621,6 +671,7 @@ void _eext_circle_surface_object_append(Eext_Circle_Surface *surface, Eext_Circle_Object *obj) { if (!surface) return; + if (!EINA_MAGIC_CHECK(surface, EEXT_CIRCLE_SURFACE_MAGIC)) return; if (!obj) return; if (obj->surface) @@ -649,7 +700,6 @@ _eext_circle_surface_object_append(Eext_Circle_Surface *surface, Eext_Circle_Obj parent = elm_object_parent_widget_get(parent); if (parent == surface->parent) break; } - } } @@ -682,6 +732,7 @@ _eext_circle_surface_object_exclusive_show(Eext_Circle_Surface *surface, Eext_Ci Eina_List *l; if (!surface) return; + if (!EINA_MAGIC_CHECK(surface, EEXT_CIRCLE_SURFACE_MAGIC)) return; if (!obj) return; if (!evas_object_visible_get(obj->main_obj) && @@ -699,6 +750,8 @@ void _eext_circle_surface_changed(Eext_Circle_Surface *surface) { if (!surface) return; + if (!EINA_MAGIC_CHECK(surface, EEXT_CIRCLE_SURFACE_MAGIC)) return; + surface->changed = EINA_TRUE; if (!surface->render_job && surface->main_obj && evas_object_visible_get(surface->main_obj) && @@ -730,12 +783,12 @@ _eext_circle_surface_add(Evas_Object *parent, Eext_Circle_Surface_Type type) EAPI Eext_Circle_Surface * eext_circle_surface_conformant_add(Evas_Object *conform) { - Eext_Circle_Surface *surface; + Eext_Circle_Surface *surface = NULL; const char *type = NULL; if (!conform) { - ERR("The given Evas_Object is NULL! It returns NULL."); + LOGE("The given Evas_Object is NULL! It returns NULL."); return NULL; } @@ -748,11 +801,11 @@ eext_circle_surface_conformant_add(Evas_Object *conform) if (!surface->main_obj) { - ERR("Surface doesn't have image widget for drawing. It returns NULL."); + LOGE("Surface doesn't have image widget for drawing. It returns NULL."); return NULL; } - INF("Put the surface[%p]'s widget[%p] to elm_conformant widget[%p]", surface, surface->main_obj, conform); + LOGI("Put the surface[%p]'s widget[%p] to elm_conformant widget[%p]", surface, surface->main_obj, conform); efl_content_set(efl_part(conform, "efl.content.circle"), surface->main_obj); @@ -767,43 +820,49 @@ eext_circle_surface_conformant_add(Evas_Object *conform) { if (!edje_object_part_exists(elm_layout_edje_get(conform), "elm.swallow.circle")) { - ERR("There is no \"elm.swallow.circle\" part in elm_conformant widget! It returns NULL."); + LOGE("There is no \"elm.swallow.circle\" part in elm_conformant widget! It returns NULL."); return NULL; } surface = _eext_circle_surface_add(conform, EEXT_CIRCLE_SURFACE_TYPE_DEFAULT); + if (!surface) + { + LOGE("Surface creation failed!"); + return NULL; + } if (!surface->main_obj) { - ERR("Surface doesn't have image widget for drawing. It returns NULL."); + LOGE("Surface doesn't have image widget for drawing. It returns NULL."); + _eext_circle_surface_del_internal(surface); return NULL; } - INF("Put the surface[%p]'s widget[%p] to elm_conformant widget[%p]", surface, surface->main_obj, conform); + LOGI("Put the surface[%p]'s widget[%p] to elm_conformant widget[%p]", surface, surface->main_obj, conform); elm_object_part_content_set(conform, "elm.swallow.circle", surface->main_obj); return surface; } else { - ERR("elm_object_style_set is failed! The theme doesn't have \"elm/conformant/base/circle\" group. It returns NULL."); + LOGE("elm_object_style_set is failed! The theme doesn't have \"elm/conformant/base/circle\" group. It returns NULL."); return NULL; } } - ERR("The given Evas_Object[%p] is not elm_conformant widget! It returns NULL.", conform); + LOGE("The given Evas_Object[%p] is not elm_conformant widget! It returns NULL.", conform); return NULL; } EAPI Eext_Circle_Surface * eext_circle_surface_layout_add(Evas_Object *layout) { - Eext_Circle_Surface *surface; + Eext_Circle_Surface *surface = NULL; const char *type = NULL; if (!layout) { - ERR("The given Evas_Object is NULL! It returns NULL."); + LOGE("The given Evas_Object is NULL! It returns NULL."); return NULL; } @@ -815,43 +874,50 @@ eext_circle_surface_layout_add(Evas_Object *layout) { if (!edje_object_part_exists(elm_layout_edje_get(layout), "elm.swallow.circle")) { - ERR("There is no \"elm.swallow.circle\" part in elm_layout widget! It returns NULL."); + LOGE("There is no \"elm.swallow.circle\" part in elm_layout widget! It returns NULL."); return NULL; } surface = _eext_circle_surface_add(layout, EEXT_CIRCLE_SURFACE_TYPE_DEFAULT); + if (!surface) + { + LOGE("Surface creation failed!"); + return NULL; + } + + if (!surface->main_obj) { - ERR("Surface doesn't have image widget for drawing. It returns NULL."); + LOGE("Surface doesn't have image widget for drawing. It returns NULL."); return NULL; } - INF("Put the surface[%p]'s widget[%p] to layout widget[%p]", surface, surface->main_obj, layout); + LOGI("Put the surface[%p]'s widget[%p] to layout widget[%p]", surface, surface->main_obj, layout); elm_object_part_content_set(layout, "elm.swallow.circle", surface->main_obj); return surface; } else { - ERR("elm_layout_theme_set is failed! The theme doesn't have \"elm/layout/circle/surface\" group. It returns NULL."); + LOGE("elm_layout_theme_set is failed! The theme doesn't have \"elm/layout/circle/surface\" group. It returns NULL."); return NULL; } } - ERR("The given Evas_Object[%p] is not elm_layout widget! It returns NULL.", layout); + LOGE("The given Evas_Object[%p] is not elm_layout widget! It returns NULL.", layout); return NULL; } EAPI Eext_Circle_Surface * eext_circle_surface_naviframe_add(Evas_Object *naviframe) { - Eext_Circle_Surface *surface; + Eext_Circle_Surface *surface = NULL; const char *type = NULL; if (!naviframe) { - ERR("The given Evas_Object is NULL! It returns NULL."); + LOGE("The given Evas_Object is NULL! It returns NULL."); return NULL; } @@ -860,10 +926,14 @@ eext_circle_surface_naviframe_add(Evas_Object *naviframe) if (type && (!strcmp(type, "Elm_Naviframe") || !strcmp(type, "elm_naviframe"))) { surface = _eext_circle_surface_add(naviframe, EEXT_CIRCLE_SURFACE_TYPE_NAVIFRAME); + + Evas_Object *win = elm_object_top_widget_get(naviframe); + evas_object_data_set(win, "EEXT_NAVIFRAME_SURFACE", surface); + return surface; } - ERR("The given Evas_Object[%p] is not elm_naviframe widget! It returns NULL.", naviframe); + LOGE("The given Evas_Object[%p] is not elm_naviframe widget! It returns NULL.", naviframe); return NULL; } @@ -872,21 +942,21 @@ eext_circle_surface_del(Eext_Circle_Surface *surface) { if (!surface) { - ERR("Surface is already NULL"); + LOGE("Surface is already NULL"); return; } + if (!EINA_MAGIC_CHECK(surface, EEXT_CIRCLE_SURFACE_MAGIC)) return; if (surface->main_obj) { + _eext_circle_surface_vector_finish(surface); _eext_circle_surface_render_finish(surface); - evas_object_event_callback_del(surface->main_obj, EVAS_CALLBACK_RESIZE, _eext_circle_surface_resize_cb); - evas_object_event_callback_del(surface->main_obj, EVAS_CALLBACK_DEL, _eext_circle_surface_del_cb); evas_object_del(surface->main_obj); surface->main_obj = NULL; } - INF("Surface[%p] is going to free in eext_circle_surface_del API.", surface); + LOGI("Surface[%p] is going to free in eext_circle_surface_del API.", surface); _eext_circle_surface_del_internal(surface); } diff --git a/src/wearable/circle/efl_extension_rotary.c b/src/wearable/circle/efl_extension_rotary.c index f523272..7a5760f 100644 --- a/src/wearable/circle/efl_extension_rotary.c +++ b/src/wearable/circle/efl_extension_rotary.c @@ -105,21 +105,21 @@ eext_rotary_event_handler_add(Eext_Rotary_Handler_Cb func, void *data) Eext_Rotary_Handler *new_hd = NULL; if (!func) return EINA_FALSE; - INF("detent: In"); + LOGI("detent: In"); /* init event registration */ if (!_is_init) { #ifdef WITH_X if (!_init_Xi2_system()) { - ERR("Failed to init Xi2 system"); + LOGE("Failed to init Xi2 system"); return EINA_FALSE; } #endif #ifdef WITH_WAYLAND if (!_init_ecore_event()) { - ERR("Failed to init ecore_event"); + LOGE("Failed to init ecore_event"); return EINA_FALSE; } #endif @@ -134,7 +134,7 @@ eext_rotary_event_handler_add(Eext_Rotary_Handler_Cb func, void *data) _motion_changed_cb, NULL); if (!_motion_handler) { - ERR("Cannot register generic ecore event handler"); + LOGE("Cannot register generic ecore event handler"); return EINA_FALSE; } } @@ -146,7 +146,7 @@ eext_rotary_event_handler_add(Eext_Rotary_Handler_Cb func, void *data) _ecore_detent_cb, NULL); if (!_ecore_detent_handler) { - ERR("Cannot register ecore detent handler"); + LOGE("Cannot register ecore detent handler"); return EINA_FALSE; } } @@ -157,7 +157,7 @@ eext_rotary_event_handler_add(Eext_Rotary_Handler_Cb func, void *data) _rotary_rotate_event_cb, NULL); if (!_rotate_handler) { - ERR("Cannot register eext rotate event handler"); + LOGE("Cannot register eext rotate event handler"); return EINA_FALSE; } } @@ -165,7 +165,7 @@ eext_rotary_event_handler_add(Eext_Rotary_Handler_Cb func, void *data) new_hd = malloc(sizeof(Eext_Rotary_Handler)); if (!new_hd) { - ERR("Cannot allocate memory"); + LOGE("Cannot allocate memory"); return EINA_FALSE; } new_hd->func = func; @@ -178,7 +178,7 @@ eext_rotary_event_handler_add(Eext_Rotary_Handler_Cb func, void *data) EAPI void * eext_rotary_event_handler_del(Eext_Rotary_Handler_Cb func) { - INF("detent: In"); + LOGI("detent: In"); Eina_List *l = NULL; Eext_Rotary_Handler *hd = NULL; void *data = NULL; @@ -203,14 +203,14 @@ eext_rotary_event_handler_del(Eext_Rotary_Handler_Cb func) EAPI Eina_Bool eext_rotary_object_event_callback_add(Evas_Object *obj, Eext_Rotary_Event_Cb func, void *data) { - INF("In"); + LOGI("In"); return eext_rotary_object_event_callback_priority_add(obj, 0, func, data); } EAPI Eina_Bool eext_rotary_object_event_callback_priority_add(Evas_Object *obj, Eext_Callback_Priority priority, Eext_Rotary_Event_Cb func, void *data) { - INF("detent: In"); + LOGI("detent: In"); Eina_List *l; Eext_Rotary_Obj_Pri *op = NULL; Eext_Rotary_Cb *cb = NULL, *new_cb = NULL; @@ -223,7 +223,7 @@ eext_rotary_object_event_callback_priority_add(Evas_Object *obj, Eext_Callback_P { if (!eext_rotary_event_handler_add(_rotary_rotate_handler_cb, NULL)) { - ERR("Cannot register rotary handler"); + LOGE("Cannot register rotary handler"); return EINA_FALSE; } _handler_registered = EINA_TRUE; @@ -232,7 +232,7 @@ eext_rotary_object_event_callback_priority_add(Evas_Object *obj, Eext_Callback_P new_cb = malloc(sizeof(Eext_Rotary_Cb)); if (!new_cb) { - ERR("Cannot allocate memory"); + LOGE("Cannot allocate memory"); return EINA_FALSE; } new_cb->obj = obj; @@ -258,7 +258,7 @@ eext_rotary_object_event_callback_priority_add(Evas_Object *obj, Eext_Callback_P new_op = calloc(1, sizeof(Eext_Rotary_Obj_Pri)); if (!new_op) { - ERR("Cannot allocate memory"); + LOGE("Cannot allocate memory"); free(new_cb); return EINA_FALSE; } @@ -292,12 +292,12 @@ eext_rotary_object_event_callback_priority_add(Evas_Object *obj, Eext_Callback_P EAPI void * eext_rotary_object_event_callback_del(Evas_Object *obj, Eext_Rotary_Event_Cb func) { - INF("In"); + LOGI("In"); Eina_List *l = NULL; Eext_Rotary_Cb *cb = NULL; void *data = NULL; - INF("callback del %p, %s, func : %p", obj, evas_object_type_get(obj), func); + LOGI("callback del %p, %s, func : %p", obj, evas_object_type_get(obj), func); EINA_LIST_FOREACH(_callbacks, l, cb) { @@ -305,7 +305,7 @@ eext_rotary_object_event_callback_del(Evas_Object *obj, Eext_Rotary_Event_Cb fun { data = cb->data; _callbacks = eina_list_remove(_callbacks, cb); - INF("Removed cb from callbacks"); + LOGI("Removed cb from callbacks"); break; } cb = NULL; @@ -323,14 +323,14 @@ eext_rotary_object_event_callback_del(Evas_Object *obj, Eext_Rotary_Event_Cb fun } } free(cb); - INF("Freed cb"); + LOGI("Freed cb"); } if (!_callbacks) { eext_rotary_event_handler_del(_rotary_rotate_handler_cb); _handler_registered = EINA_FALSE; } - INF("done"); + LOGI("done"); return data; } @@ -340,7 +340,7 @@ eext_rotary_object_event_activated_set(Evas_Object *obj, Eina_Bool activated) { if (!obj) return; - INF("eext_rotary_object_event_activated_set : %p, %s, _activated_obj : %p, activated : %d", obj, evas_object_type_get(obj), _activated_obj, activated); + LOGI("eext_rotary_object_event_activated_set : %p, %s, _activated_obj : %p, activated : %d", obj, evas_object_type_get(obj), _activated_obj, activated); if (activated) { @@ -348,7 +348,7 @@ eext_rotary_object_event_activated_set(Evas_Object *obj, Eina_Bool activated) { if (_activated_obj != NULL) { - ERR("Activation delete!!!!"); + LOGE("Activation delete!!!!"); evas_object_event_callback_del(_activated_obj, EVAS_CALLBACK_DEL, _activated_obj_del_cb); evas_object_smart_callback_call(_activated_obj, SIG_DEACTIVATED, NULL); } @@ -383,19 +383,107 @@ eext_rotary_object_event_activated_get(Evas_Object *obj) return EINA_FALSE; } +#include +#include + +static Eext_Rotary_Event_Type _rotary_event_type = EEXT_ROTARY_EVENT_TYPE_UNDEFINED; +static int _is_rotary_event_enabled = -1; + +static void +_rotary_event_changed_cb(keynode_t* node EINA_UNUSED, void* data EINA_UNUSED) +{ + int ret = vconf_get_bool(VCONFKEY_SETAPPL_ROTARY_EVENT_ENABLED_BOOL, &_is_rotary_event_enabled); + if (ret != VCONF_OK) + { + LOGE("failed to get rotary event on/off value. ret: %d", ret); + return; + } + INF("state of rotary event is changed to [%d]", _is_rotary_event_enabled); +} + +EAPI Eext_Rotary_Event_Type +eext_rotary_event_type_get(void) +{ + if (_rotary_event_type != EEXT_ROTARY_EVENT_TYPE_UNDEFINED) + return _rotary_event_type; + + bool bezel = false; + int ret = system_info_get_platform_bool("http://tizen.org/feature/input.rotating_bezel" , &bezel); + if (ret != SYSTEM_INFO_ERROR_NONE) + { + LOGE("failed to get input.rotating.bezel info"); + return EEXT_ROTARY_EVENT_TYPE_NONE; + } + + if (!bezel) + return _rotary_event_type = EEXT_ROTARY_EVENT_TYPE_NONE; + + bool virtual_bezel = false; + ret = system_info_get_platform_bool("http://tizen.org/feature/input.rotating_bezel.virtual" , &virtual_bezel); + if (ret != SYSTEM_INFO_ERROR_NONE) + { + LOGE("failed to get input.rotating.bezel.virtual info"); + return EEXT_ROTARY_EVENT_TYPE_HW_BEZEL; + } + + if (!virtual_bezel) + return _rotary_event_type = EEXT_ROTARY_EVENT_TYPE_HW_BEZEL; + + return _rotary_event_type = EEXT_ROTARY_EVENT_TYPE_SW_BEZEL; +} + +EAPI Eina_Bool +eext_rotary_event_is_enabled(void) +{ + if (_is_rotary_event_enabled != -1) + return (Eina_Bool) _is_rotary_event_enabled; + int ret = vconf_get_bool(VCONFKEY_SETAPPL_ROTARY_EVENT_ENABLED_BOOL, &_is_rotary_event_enabled); + if (ret != VCONF_OK) + { + LOGE("failed to get rotary event on/off value. ret: %d", ret); + return EINA_TRUE; + } + ret = vconf_notify_key_changed(VCONFKEY_SETAPPL_ROTARY_EVENT_ENABLED_BOOL, _rotary_event_changed_cb, NULL); + if (ret != VCONF_OK) + { + LOGE("failed to set rotary event changed callback. ret: %d", ret); + } + return (Eina_Bool) _is_rotary_event_enabled; +} + +EAPI void +eext_rotary_event_changed_callback_add(Eext_Rotary_Event_Changed_Cb cb, void* data) +{ + int ret = vconf_notify_key_changed(VCONFKEY_SETAPPL_ROTARY_EVENT_ENABLED_BOOL, (vconf_callback_fn) cb, data); + if (ret != VCONF_OK) + { + LOGE("failed to set rotary event changed callback. ret: %d", ret); + } +} + +EAPI void +eext_rotary_event_changed_callback_del(Eext_Rotary_Event_Changed_Cb cb) +{ + int ret = vconf_ignore_key_changed(VCONFKEY_SETAPPL_ROTARY_EVENT_ENABLED_BOOL, (vconf_callback_fn) cb); + if (ret != VCONF_OK) + { + LOGE("failed to delete rotary event changed callback. ret: %d", ret); + } +} + #ifdef WITH_WAYLAND static void _rotary_rotate_event_free(void *udata EINA_UNUSED, void *fdata) { - INF("detent: In"); - INF("In: ddata: %p", fdata); + LOGI("detent: In"); + LOGI("In: ddata: %p", fdata); free(fdata); } static Eina_Bool _init_ecore_event(void) { - INF("detent: In"); + LOGI("detent: In"); if (!ecore_event_init()) return EINA_FALSE; EEXT_EVENT_ROTARY_ROTATE = ecore_event_type_new(); return EINA_TRUE; @@ -403,14 +491,14 @@ _init_ecore_event(void) static Eina_Bool _ecore_detent_cb(void *data, int type, void *event_info) { - INF("detent: In"); + LOGI("detent: In"); Ecore_Event_Detent_Rotate *e = event_info; Rotary_Raw_Info *event = NULL; event = calloc(1, sizeof(Rotary_Raw_Info)); if (!event) { - ERR("Cannot allocate memory"); + LOGE("Cannot allocate memory"); return ECORE_CALLBACK_PASS_ON; } if (e->direction == ECORE_DETENT_DIRECTION_CLOCKWISE) @@ -418,7 +506,7 @@ _ecore_detent_cb(void *data, int type, void *event_info) else event->direction = EEXT_ROTARY_DIRECTION_COUNTER_CLOCKWISE; event->time_stamp = e->timestamp; - INF("detent: new EEXT_EVENT_ROTARY_ROTATE ecore event"); + LOGI("detent: new EEXT_EVENT_ROTARY_ROTATE ecore event"); ecore_event_add(EEXT_EVENT_ROTARY_ROTATE, event, _rotary_rotate_event_free, NULL); return ECORE_CALLBACK_PASS_ON; @@ -429,7 +517,7 @@ _ecore_detent_cb(void *data, int type, void *event_info) static Eina_Bool _init_Xi2_system(void) { - INF("In"); + LOGI("In"); Ecore_X_Display *display = NULL; Ecore_X_Window root_win; int opcode = 0, event = 0, error = 0; @@ -448,14 +536,14 @@ _init_Xi2_system(void) if (!XQueryExtension((Display *)display, "XInputExtension", &opcode, &event, &error)) { - ERR("Failed to query XInputExtension"); + LOGE("Failed to query XInputExtension"); return EINA_FALSE; } /* We support version 2.0 */ if (XIQueryVersion((Display *)display, &major, &minor) == BadRequest) { - ERR("Failed to query XI Version"); + LOGE("Failed to query XI Version"); return EINA_FALSE; } @@ -483,11 +571,11 @@ _init_Xi2_system(void) int ret = XISelectEvents((Display *)display, (Window)root_win, _xi_event_mask, 1); if (ret != 0) { - ERR("Failed to Select Events"); + LOGE("Failed to Select Events"); return EINA_FALSE; } - INF("Done"); + LOGI("Done"); return EINA_TRUE; } @@ -509,7 +597,7 @@ _motion_changed_cb(void *data, int type, void *event_info) static void _rotary_rotate_event_free(void *udata EINA_UNUSED, void *fdata) { - INF("In: ddata: %p", fdata); + LOGI("In: ddata: %p", fdata); free(fdata); } @@ -525,11 +613,11 @@ _process_raw_event(void *data EINA_UNUSED, int type EINA_UNUSED, void *raw_event return; } - INF("In"); + LOGI("In"); event = calloc(1, sizeof(Rotary_Raw_Info)); if (!event) { - ERR("Cannot allocate memory"); + LOGE("Cannot allocate memory"); return; } event->devid = xi_raw_event->deviceid; @@ -540,32 +628,32 @@ _process_raw_event(void *data EINA_UNUSED, int type EINA_UNUSED, void *raw_event if (XIMaskIsSet(xi_raw_event->valuators.mask, 1)) { event->time_stamp = (unsigned int)(*(value + 1)); - INF("time stamp: %d", event->time_stamp); + LOGI("time stamp: %d", event->time_stamp); } if (XIMaskIsSet(xi_raw_event->valuators.mask, 2)) { int dir = (int)(*(value + 2)); - INF("raw dir: %d", dir); + LOGI("raw dir: %d", dir); switch (dir) { case -1: event->direction = EEXT_ROTARY_DIRECTION_COUNTER_CLOCKWISE; - INF("direction: Counter Clockwise"); + LOGI("direction: Counter Clockwise"); ecore_event_add(EEXT_EVENT_ROTARY_ROTATE, event, _rotary_rotate_event_free, NULL); break; case 1: event->direction = EEXT_ROTARY_DIRECTION_CLOCKWISE; - INF("direction: Clockwise"); + LOGI("direction: Clockwise"); ecore_event_add(EEXT_EVENT_ROTARY_ROTATE, event, _rotary_rotate_event_free, NULL); break; case 0: - INF("Not detent"); + LOGI("Not detent"); free(event); break; default: - INF("Should not get in here"); + LOGI("Should not get in here"); free(event); } } @@ -579,7 +667,7 @@ _process_raw_event(void *data EINA_UNUSED, int type EINA_UNUSED, void *raw_event static Eina_Bool _rotary_rotate_event_cb(void *data EINA_UNUSED, int type EINA_UNUSED, void *event_info) { - INF("In"); + LOGI("In"); Eina_List *l; Eext_Rotary_Handler *hd; Rotary_Raw_Info *ev = event_info; @@ -619,16 +707,44 @@ _pri_compare(const void *data1, const void *data2) static Eina_Bool _rotary_rotate_handler_cb(void *data EINA_UNUSED, Eext_Rotary_Event_Info *info) { - INF("_rotary_rotate_handler_cb : %p, %s, %d", _activated_obj, evas_object_type_get(_activated_obj), evas_object_visible_get(_activated_obj)); + LOGI("_rotary_rotate_handler_cb : %p, %s, %d", _activated_obj, evas_object_type_get(_activated_obj), evas_object_visible_get(_activated_obj)); Eina_List *l; Eext_Rotary_Cb *cb; if (!info) return EINA_TRUE; - /* Deliver to the activated object and its parents */ - if ((_activated_obj) && - (evas_focus_state_get(evas_object_evas_get(_activated_obj))) && - (evas_object_visible_get(_activated_obj))) +//ONEUI1.5(20180313): support unfocusable window(keyboard window) + Evas* evas = NULL; + Eina_Bool force_event = EINA_FALSE; + Eina_Bool focus_state = EINA_FALSE; + + if (_activated_obj) + { + void *object = NULL; + evas = evas_object_evas_get(_activated_obj); + focus_state = evas_focus_state_get(evas); + + Eina_List* objs = evas_objects_in_rectangle_get(evas, SHRT_MIN, SHRT_MIN, USHRT_MAX, USHRT_MAX, EINA_TRUE, EINA_TRUE); + EINA_LIST_FREE(objs, object) + { + if (!strcmp((char*)evas_object_type_get((Evas_Object*)object), "elm_win")) + { + const int __ROTARY_EVENT_FORCE_VALUE = 1; + const char* EEXT_ROTARY_EVENT = "_eext_rotary_event"; + + if (__ROTARY_EVENT_FORCE_VALUE == (int)evas_object_data_get((Evas_Object*)object, EEXT_ROTARY_EVENT)) + { + force_event = EINA_TRUE; + } + break; + } + } + } +// + + /* Deliver to the activated object and its parents */ + if ((_activated_obj) && ((!force_event && focus_state) || force_event)&& + (evas_object_visible_get(_activated_obj))) { Evas_Object *obj = NULL; Eext_Rotary_Obj_Pri *op = NULL; @@ -639,9 +755,9 @@ _rotary_rotate_handler_cb(void *data EINA_UNUSED, Eext_Rotary_Event_Info *info) if (obj == _activated_obj) { if (info->direction == EEXT_ROTARY_DIRECTION_CLOCKWISE) - INF("Deliver clockwise rotary event to object: %p, %s, time_stamp : %d", obj, evas_object_type_get(obj), info->time_stamp); + LOGI("Deliver clockwise rotary event to object: %p, %s, time_stamp : %d", obj, evas_object_type_get(obj), info->time_stamp); else - INF("Deliver counter clockwise rotary event to object: %p, %s, time_stamp : %d", obj, evas_object_type_get(obj), info->time_stamp); + LOGI("Deliver counter clockwise rotary event to object: %p, %s, time_stamp : %d", obj, evas_object_type_get(obj), info->time_stamp); } EINA_LIST_FOREACH(_obj_pri_callbacks, l, op) { @@ -667,13 +783,13 @@ _rotary_rotate_handler_cb(void *data EINA_UNUSED, Eext_Rotary_Event_Info *info) static void _remove_ecore_handlers(void) { - INF("In"); + LOGI("In"); #ifdef HAVE_X if (_motion_handler) { ecore_event_handler_del(_motion_handler); _motion_handler = NULL; - INF("removed _motion_handler"); + LOGI("removed _motion_handler"); } #endif #ifdef HAVE_WAYLAND @@ -681,21 +797,21 @@ _remove_ecore_handlers(void) { ecore_event_handler_del(_ecore_detent_handler); _ecore_detent_handler = NULL; - INF("removed _ecore_detent_handler"); + LOGI("removed _ecore_detent_handler"); } #endif if (_rotate_handler) { ecore_event_handler_del(_rotate_handler); _rotate_handler = NULL; - INF("removed _rotate_handler"); + LOGI("removed _rotate_handler"); } } static void _object_deleted_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) { - INF("In: data: %p, obj: %p", data, obj); + LOGI("In: data: %p, obj: %p", data, obj); Eina_List *l = NULL; Eext_Rotary_Obj_Pri *op = NULL; @@ -724,14 +840,15 @@ _object_deleted_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj } if (_activated_obj == obj) _activated_obj = NULL; - INF("done"); + LOGI("done"); } static void -_activated_obj_del_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_activated_obj_del_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) { - INF("_activated_obj_del_cb : %p", _activated_obj); + LOGI("_activated_obj_del_cb : %p", _activated_obj); - evas_object_event_callback_del(_activated_obj, EVAS_CALLBACK_DEL, _activated_obj_del_cb); + evas_object_event_callback_del(obj, EVAS_CALLBACK_DEL, _activated_obj_del_cb); + if (_activated_obj == obj) _activated_obj = NULL; } diff --git a/src/wearable/efl_extension_more_option.c b/src/wearable/efl_extension_more_option.c index f375e0a..6500922 100644 --- a/src/wearable/efl_extension_more_option.c +++ b/src/wearable/efl_extension_more_option.c @@ -19,54 +19,1352 @@ #include "wearable/circle/efl_extension_circle_private.h" #include "wearable/efl_extension_common_private.h" +#include +//#include + #define EEXT_MORE_OPTION_DATA_KEY "eext_more_option_data" +//ONEUI1.5(21MAR2019): Support for scrollbar show timing +#define OBJECT_SHOW_INTERNAL "object,show,internal" +#define OBJECT_HIDE_INTERNAL "object,hide,internal" +// + +static const char SIGNAL_ACTIVATED[] = "rotary,activated"; + +/* === /internal object cb & util === */ +static void _drawer_back_cb(void *data, Evas_Object *obj, void *event_info); +static void _panel_active_cb(void *data, Evas_Object *obj, const char *emission, const char *source); +static void _panel_inactive_cb(void *data, Evas_Object *obj, const char *emission, const char *source); +static void _panel_cue_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source); +static void _panel_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); +static void _cue_hide_cb(void *data, Evas_Object *obj, const char *emission, const char *source); +static void _cue_show_cb(void *data, Evas_Object *obj, const char *emission, const char *source); +static void _rotary_activated_cb(void *data, Evas_Object *obj, void *event_info); + +/* === internal object creation (elm-demo-tizen/drawer.c) === */ +static Evas_Object *_drawer_layout_create(Evas_Object *parent); +static Evas_Object *_panel_create(Evas_Object *parent, Eext_More_Option_Data *mold); + +/* === more option API === */ +static Eext_More_Option_Data *_more_option_data_init(Evas_Object *obj, Evas_Object *parent); +static Eext_More_Option_Data *_more_option_data_get(const Evas_Object *more_option); +static void _more_option_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); +static void _rotary_selector_item_selected(void *data, Evas_Object *obj, void *event_info); +static void _rotary_selector_item_clicked(void *data, Evas_Object *obj, void *event_info); + +/* === Accessibility === */ +static Eina_Bool _access_action_cb(void *data, Evas_Object *obj, Elm_Access_Action_Info *action_info); +static char * _accessibility_name_set_cb(void *data, Evas_Object *obj); +static void _more_option_screen_reader_changed(void *data, Evas_Object *obj, void *event_info); +static char *_accessibility_panel_name_set_cb(void *data, Evas_Object *obj); +static char *_accessibility_panel_description_set_cb(void *data, Evas_Object *obj); +//ONEUI1.5(2019Mar01): Read name and description from dummy button +static void _set_item_access_info(Eext_Rotary_Selector_Item* item); +static char *_accessibility_item_name_cb(void *data, Evas_Object *obj); +static char *_accessibility_item_description_cb(void *data, Evas_Object *obj); +// +/* === color class === */ +void _eext_more_option_color_class_parent_set(Evas_Object *obj, Evas_Object *parent); + +extern Eina_Bool __elm_product_theme_is_loaded(void); + +/* === internal object cb & util === */ + +#define MORE_OPTION_GENLIST_CONTENT_SIZE 76 +#define MORE_OPTION_GENLIST_SCREEN_WIDTH 360 +#define MORE_OPTION_GENLIST_SCREEN_HEIGHT 360 +#define TIZEN_WEARABLE_SCREEN_SIZE 360 +#define TIZEN_EFFECT_BLUR_RADIUS 4.5 +#define TIZEN_EFFECT_ITEM_DURATION 0.08 +#define TIZEN_EFFECT_IMAGE_PATH \ + "/opt/usr/home/owner/share/.elementary/config/Effect_bg.png" + +static const char *more_option_mask_image = "more_option_masking_image.png"; +extern void* gxt_image_effect_object_mask(const Evas_Object *object, const char *mask, int w, int h, int mask_x, int mask_y); + +typedef enum { + ITEM_STYLE_1_TEXT, + ITEM_STYLE_2_TEXT, + ITEM_STYLE_1_TEXT_1_ICON, + ITEM_STYLE_2_TEXT_1_ICON, + ITEM_STYLE_MAX +} Genlist_Item_Style; + +static void +_genlist_item_text_copy(char **target, const char* source) +{ + int size = 0; + + if (*target) + { + free(*target); + *target = NULL; + } + size = strlen(source) + 1; + *target = malloc(sizeof(char)*size); + if (!(*target)) + { + LOGE("allocation is failed!!"); + return; + } + memset(*target, 0, size); + strncpy(*target, source, size); +} + +static Rotary_Genlist_Data * +_rotary_genlist_data_get(Evas_Object *genlist) +{ + return evas_object_data_get(genlist, "EEXT_ROTARY_GENLIST_DATA"); +} + +static const char* +_genlist_item_style_get(Evas_Object *obj, Genlist_Item_Style style) +{ + switch (style) + { + case ITEM_STYLE_1_TEXT: + return "prod/1text/more_option"; + + case ITEM_STYLE_2_TEXT: + return "prod/2text/more_option"; + + case ITEM_STYLE_1_TEXT_1_ICON: + return "prod/1text.1icon/more_option"; + + case ITEM_STYLE_2_TEXT_1_ICON: + return "prod/2text.1icon/more_option"; + + default: + LOGE("Returning Default Style"); + return "prod/1text/more_option"; + } +} + +static Eext_Rotary_Selector_Item * +_rotary_genlist_item_create(Evas_Object *obj, Rotary_Genlist_Data *rgd) +{ + Eext_Rotary_Selector_Item *item = calloc(sizeof(Eext_Rotary_Selector_Item), 1); + if (!item) + { + LOGE("Memory Allocation failed"); + return NULL; + } + Evas_Object *dummy_button = elm_button_add(rgd->parent); + elm_object_style_set(dummy_button, "prod/more_option/dummy"); + + item->dummy_button = dummy_button; + item->rgd = rgd; + item->base.obj = dummy_button; + item->obj = obj; + item->main_text = NULL; + item->sub_text = NULL; + item->domain = NULL; + item->parent = rgd->parent; + return item; +} + +//ONEUI1.5(20Jun2019): Add genlist scroller color class change +static void +_genlist_color_change_signal_cb(void *data, + Evas_Object *widget_obj, + const char *emission, + const char *source) +{ + Eext_More_Option_Data *mold = data; + if (!source) return; + + int r, g ,b, a; + if (mold->scrollbar_bezel_fg_color_class && !strcmp(source, mold->scrollbar_bezel_fg_color_class)) + { + edje_object_color_class_get(elm_layout_edje_get(mold->more_option), + mold->scrollbar_bezel_fg_color_class, + &r, &g, &b, &a, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); + edje_object_color_class_set(elm_layout_edje_get(mold->genlist), + mold->scrollbar_bezel_fg_color_class, + r, g, b, a, + 0, 0, 0, 0, 0, 0, 0, 0); + } + else if (mold->scrollbar_bg_color_class && !strcmp(source, mold->scrollbar_bg_color_class)) + { + edje_object_color_class_get(elm_layout_edje_get(mold->more_option), + mold->scrollbar_bg_color_class, + &r, &g, &b, &a, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); + edje_object_color_class_set(elm_layout_edje_get(mold->genlist), + mold->scrollbar_bg_color_class, + r, g, b, a, + 0, 0, 0, 0, 0, 0, 0, 0); + } + else if (mold->scrollbar_fg_color_class && !strcmp(source, mold->scrollbar_fg_color_class)) + { + edje_object_color_class_get(elm_layout_edje_get(mold->more_option), + mold->scrollbar_fg_color_class, + &r, &g, &b, &a, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); + edje_object_color_class_set(elm_layout_edje_get(mold->genlist), + mold->scrollbar_fg_color_class, + r, g, b, a, + 0, 0, 0, 0, 0, 0, 0, 0); + } +} +// + +static void +_genlist_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + Eina_List *l; + Eext_Rotary_Selector_Item *item = NULL; + Rotary_Genlist_Data *rgd = _rotary_genlist_data_get(obj); + + EINA_LIST_FOREACH(rgd->item_list, l, item) + { + if (item->main_text) free(item->main_text); + if (item->sub_text) free(item->sub_text); + if (item->domain) free(item->domain); + if (item->itc) elm_genlist_item_class_free(item->itc); + free(item); + rgd->item_list = eina_list_remove_list(rgd->item_list, l); + } + + eina_list_free(rgd->item_list); + free(rgd); +} + +static char * +_genlist_item_text_get_cb(void *data, Evas_Object *obj, const char *part) +{ + Eext_Rotary_Selector_Item *item = data; + + if (!strcmp(part, "elm.text")) + { + if (item->domain) + { + if (item->main_text) return strdup(dgettext(item->domain, item->main_text)); + } + else if (item->main_text) + { + return strdup(item->main_text); + } + } + else if (!strcmp(part, "elm.text.1")) + { + if (item->domain) + { + if (item->sub_text) return strdup(dgettext(item->domain, item->sub_text)); + } + else if (item->sub_text) + { + return strdup(item->sub_text); + } + } + + return NULL; +} + +static Evas_Object * +_genlist_content_get_cb(void *data, Evas_Object *obj, const char *part) +{ + Eext_Rotary_Selector_Item *item = data; + + if (!strcmp(part, "elm.icon")) + { + evas_object_show(item->content); + return item->content; + } + return NULL; +} + +static Evas_Object * +_genlist_add_item_content_get_cb(void *data, Evas_Object *obj, const char *part) +{ + if (strcmp(part, "elm.swallow.content")) return NULL; + + Eext_Rotary_Selector_Item *item = data; + Evas_Object *button = NULL; + + button = elm_button_add(obj); + elm_object_style_set(button, "rotary_selector_add_item"); + evas_object_repeat_events_set(button, EINA_TRUE); + elm_object_mirrored_set(button, EINA_FALSE); + elm_object_mirrored_automatic_set(button, EINA_FALSE); + evas_object_size_hint_weight_set(button,EVAS_HINT_EXPAND,EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(button, EVAS_HINT_FILL, EVAS_HINT_FILL); + + evas_object_size_hint_min_set(button, ELM_SCALE_SIZE(MORE_OPTION_GENLIST_CONTENT_SIZE), ELM_SCALE_SIZE(MORE_OPTION_GENLIST_CONTENT_SIZE)); + + evas_object_show(button); + item->content = button; + return item->content; +} + +static void +_genlist_item_selected_cb(void *data, Evas_Object *obj, void *event_info) +{ + Rotary_Genlist_Data *rgd = _rotary_genlist_data_get(obj); + + if (eext_more_option_opened_get(rgd->parent)) + { + Eext_Rotary_Selector_Item *item = (Eext_Rotary_Selector_Item *)data; + evas_object_smart_callback_call(rgd->parent, "item,clicked", item); + LOGI("item clicked: item: %p", event_info); + } + else + { + LOGI("item clicked rejected, panel closed"); + } +} + +static void +_genlist_selected_cb(void *data, Evas_Object *obj, void *event_info) +{ + Elm_Object_Item *item = event_info; + if (!item) return; + elm_genlist_item_selected_set(item, EINA_FALSE); +} + +static void +_genlist_add_item_selected_cb(void *data, Evas_Object *obj, void *event_info) +{ + evas_object_smart_callback_call(obj, "add_item,clicked", (void*)data); +} + +static void +_genlist_title_item_del_cb(void *data, Evas_Object *obj) +{ + free(data); +} + +static char * +_genlist_item_title_text_get_cb(void *data, Evas_Object *obj, const char *part) +{ + return strdup(""); +} + +static void +_genlist_title_item_create(Evas_Object *obj, Rotary_Genlist_Data *rgd) { + Eext_Rotary_Selector_Item *item = _rotary_genlist_item_create(obj, rgd); + + Elm_Genlist_Item_Class *itc = elm_genlist_item_class_new(); + itc->item_style = "title"; + itc->func.text_get = _genlist_item_title_text_get_cb; + itc->func.del = _genlist_title_item_del_cb; + item->item = elm_genlist_item_append( + obj, + itc, + item, + NULL, + ELM_GENLIST_ITEM_NONE, + NULL, + item); + elm_genlist_item_class_free(itc); + rgd->title_item = item; + //ONEUI1.5(04Feb2019): top empty item, should not take highlight + elm_atspi_accessible_role_set(item->item, ELM_ATSPI_ROLE_REDUNDANT_OBJECT); + // +} + +static void +_genlist_add_item_create(Evas_Object *obj, Rotary_Genlist_Data *rgd) { + Eext_Rotary_Selector_Item *item = _rotary_genlist_item_create(obj, rgd); + rgd->item_list = eina_list_prepend(rgd->item_list, item); + + Elm_Genlist_Item_Class *itc = elm_genlist_item_class_new(); + itc->item_style = "full"; + itc->func.content_get = _genlist_add_item_content_get_cb; + + item->item = elm_genlist_item_append( + obj, + itc, + item, + NULL, + ELM_GENLIST_ITEM_NONE, + _genlist_add_item_selected_cb, + item); + elm_genlist_item_class_free(itc); + rgd->add_item = item; +} + +static Elm_Genlist_Item_Class * +_genlist_item_class_create(Evas_Object *obj) +{ + Elm_Genlist_Item_Class *itc = elm_genlist_item_class_new(); + itc->item_style = _genlist_item_style_get(obj, ITEM_STYLE_1_TEXT); + itc->func.text_get = _genlist_item_text_get_cb; + itc->func.content_get = _genlist_content_get_cb; + return itc; +} + +static Evas_Object * +_eext_more_option_genlist_add(Evas_Object *parent) +{ + if (!parent) return NULL; + + Rotary_Genlist_Data *rgd = calloc(sizeof(Rotary_Genlist_Data), 1); + if (!rgd) + { + LOGE("Memory Allocation failed"); + return NULL; + } + rgd->add_enabled = EINA_FALSE; + rgd->parent = parent; + + Eext_More_Option_Data *mold = _more_option_data_get(parent); + if (!mold) + { + free(rgd); + LOGE("More option data is null"); + return NULL; + } + + //Panel supports show/hide signals of scrollbar for genlist + Evas_Object *genlist = elm_genlist_add(mold->panel); + elm_object_style_set(genlist, "prod/more_option"); + evas_object_smart_callback_add(genlist, "selected", _genlist_selected_cb, NULL); + evas_object_smart_callback_call(genlist, "bottom,margin,enable", NULL); + /* Dont remove sizing code, it wont trigger item realization on first launch */ + evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND,EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(genlist, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_move(genlist, 0, 0); + evas_object_resize(genlist, MORE_OPTION_GENLIST_SCREEN_WIDTH, MORE_OPTION_GENLIST_SCREEN_HEIGHT); + elm_genlist_mode_set(genlist, ELM_LIST_COMPRESS); + /* End */ + evas_object_event_callback_add(genlist, EVAS_CALLBACK_DEL, _genlist_del_cb, rgd); + evas_object_data_set(genlist, "EEXT_ROTARY_GENLIST_DATA", rgd); + //ONEUI1.5(20Jun2019): Add genlist scroller color class change +#define STRING_ADD(x) \ + x ? (char *)eina_stringshare_add(x) : NULL + mold->scrollbar_bezel_fg_color_class = STRING_ADD(edje_object_data_get(elm_layout_edje_get(genlist), "bezel_bar_color_class")); + mold->scrollbar_fg_color_class = STRING_ADD(edje_object_data_get(elm_layout_edje_get(genlist), "bar_color_class")); + mold->scrollbar_bg_color_class = STRING_ADD(edje_object_data_get(elm_layout_edje_get(genlist), "bar_bg_color_class")); + if (mold->scrollbar_bezel_fg_color_class) + edje_object_signal_callback_add(elm_layout_edje_get(parent), "color_class,set", mold->scrollbar_bezel_fg_color_class, _genlist_color_change_signal_cb, mold); + if (mold->scrollbar_fg_color_class) + edje_object_signal_callback_add(elm_layout_edje_get(parent), "color_class,set", mold->scrollbar_fg_color_class, _genlist_color_change_signal_cb, mold); + if (mold->scrollbar_bg_color_class) + edje_object_signal_callback_add(elm_layout_edje_get(parent), "color_class,set", mold->scrollbar_bg_color_class, _genlist_color_change_signal_cb, mold); + // + _genlist_title_item_create(genlist, rgd); + LOGI("genlist added successfully"); + return genlist; +} + +static Eext_Object_Item * +_eext_more_option_genlist_item_append(Evas_Object *obj) +{ + Rotary_Genlist_Data *rgd = _rotary_genlist_data_get(obj); + + Eext_Rotary_Selector_Item *item = _rotary_genlist_item_create(obj, rgd); + item->itc = _genlist_item_class_create(obj); + rgd->item_list = eina_list_append(rgd->item_list, item); + + item->item = elm_genlist_item_append( + obj, + item->itc, + item, + NULL, + ELM_GENLIST_ITEM_NONE, + _genlist_item_selected_cb, + item); + + //ONEUI1.5(2019Mar01): Read name and description from dummy button + _set_item_access_info(item); + // + + return (Eext_Object_Item *)item; +} + +static Eext_Object_Item * +_eext_more_option_item_prepend(Evas_Object *obj) +{ + Rotary_Genlist_Data *rgd = _rotary_genlist_data_get(obj); + Eext_Rotary_Selector_Item *item = _rotary_genlist_item_create(obj, rgd); + item->itc = _genlist_item_class_create(obj); + rgd->item_list = eina_list_prepend(rgd->item_list, item); + + item->item = elm_genlist_item_prepend( + obj, + item->itc, + item, + NULL, + ELM_GENLIST_ITEM_NONE, + _genlist_item_selected_cb, + item); + + //ONEUI1.5(2019Mar01): Read name and description from dummy button + _set_item_access_info(item); + // + + return (Eext_Object_Item *)item; +} + +static Eext_Object_Item * +_eext_more_option_genlist_item_insert_after(Evas_Object *obj, Eext_Object_Item *after) +{ + Rotary_Genlist_Data *rgd = _rotary_genlist_data_get(obj); + Eext_Rotary_Selector_Item *after_item = (Eext_Rotary_Selector_Item *)after; + Eext_Rotary_Selector_Item *item = _rotary_genlist_item_create(obj, rgd); + item->itc = _genlist_item_class_create(obj); + rgd->item_list = eina_list_append_relative(rgd->item_list, item, after); + + item->item = elm_genlist_item_insert_after( + obj, + item->itc, + item, + NULL, + after_item->item, + ELM_GENLIST_ITEM_NONE, + _genlist_item_selected_cb, + item); + + //ONEUI1.5(2019Mar01): Read name and description from dummy button + _set_item_access_info(item); + // + + return (Eext_Object_Item *)item; +} + +static Eext_Object_Item * +_eext_more_option_genlist_item_insert_before(Evas_Object *obj, Eext_Object_Item *before) +{ + Rotary_Genlist_Data *rgd = _rotary_genlist_data_get(obj); + Eext_Rotary_Selector_Item *before_item = (Eext_Rotary_Selector_Item *)before; + Eext_Rotary_Selector_Item *item = _rotary_genlist_item_create(obj, rgd); + item->itc = _genlist_item_class_create(obj); + rgd->item_list = eina_list_prepend_relative(rgd->item_list, item, before); + + item->item = elm_genlist_item_insert_before( + obj, + item->itc, + item, + NULL, + before_item->item, + ELM_GENLIST_ITEM_NONE, + _genlist_item_selected_cb, + item); + + //ONEUI1.5(2019Mar01): Read name and description from dummy button + _set_item_access_info(item); + // + + return (Eext_Object_Item *)item; +} + +static void +_eext_more_option_genlist_item_del(Eext_Object_Item *item) +{ + Eext_Rotary_Selector_Item *rotary_selector_item = (Eext_Rotary_Selector_Item *)item; + Rotary_Genlist_Data *rgd = rotary_selector_item->rgd; + elm_object_item_del(rotary_selector_item->item); + rgd->item_list = eina_list_remove(rgd->item_list, rotary_selector_item); + + if (rotary_selector_item->main_text) free(rotary_selector_item->main_text); + if (rotary_selector_item->sub_text) free(rotary_selector_item->sub_text); + if (rotary_selector_item->domain) free(rotary_selector_item->domain); + evas_object_del(rotary_selector_item->content); + evas_object_del(rotary_selector_item->dummy_button); + elm_genlist_item_class_free(rotary_selector_item->itc); + free(item); +} + +static void +_eext_more_option_genlist_items_clear(Evas_Object *obj) +{ + Eina_List *l; + Eext_Rotary_Selector_Item *item = NULL; + Rotary_Genlist_Data *rgd = _rotary_genlist_data_get(obj); + + EINA_LIST_FOREACH(rgd->item_list, l, item) + { + if (item->main_text) free(item->main_text); + if (item->sub_text) free(item->sub_text); + if (item->domain) free(item->domain); + elm_genlist_item_class_free(item->itc); + elm_object_item_del(item->item); + evas_object_del(item->dummy_button); + evas_object_del(item->content); + free(item); + rgd->item_list = eina_list_remove_list(rgd->item_list, l); + } + + eina_list_free(rgd->item_list); +} + +static void +_eext_more_option_genlist_item_part_text_set(Eext_Object_Item *item, const char *part_name, const char *text) +{ + Eext_Rotary_Selector_Item *rotary_selector_item = (Eext_Rotary_Selector_Item *)item; + if (!rotary_selector_item) + { + LOGE("rotary_selector_item is NULL!!"); + return; + } + if (!part_name) + { + LOGE("part_name is NULL!!"); + return; + } + if (!text) + { + LOGE("text is NULL!!"); + return; + } + + Rotary_Genlist_Data *rgd = _rotary_genlist_data_get(rotary_selector_item->obj); + if (!rgd) + { + LOGE("rgd is NULL!!"); + return; + } + + if (!strcmp(part_name, "selector,main_text")) + { + _genlist_item_text_copy(&(rotary_selector_item->main_text), text); + if (rotary_selector_item->content) + { + rotary_selector_item->itc->item_style = _genlist_item_style_get(item->obj, ITEM_STYLE_1_TEXT_1_ICON); + elm_genlist_item_item_class_update(rotary_selector_item->item, rotary_selector_item->itc); + } + elm_genlist_item_fields_update(rotary_selector_item->item, "elm.text", ELM_GENLIST_ITEM_FIELD_TEXT); + elm_genlist_item_fields_update(rotary_selector_item->item, "elm.swallow.dummy_button", ELM_GENLIST_ITEM_FIELD_CONTENT); + } + else if (!strcmp(part_name, "selector,sub_text")) + { + _genlist_item_text_copy(&(rotary_selector_item->sub_text), text); + if (rotary_selector_item->content) + { + rotary_selector_item->itc->item_style = _genlist_item_style_get(item->obj, ITEM_STYLE_2_TEXT_1_ICON); + } + else + { + rotary_selector_item->itc->item_style = _genlist_item_style_get(item->obj, ITEM_STYLE_2_TEXT); + } + elm_genlist_item_item_class_update(rotary_selector_item->item, rotary_selector_item->itc); + elm_genlist_item_fields_update(rotary_selector_item->item, "elm.text.1", ELM_GENLIST_ITEM_FIELD_TEXT); + elm_genlist_item_fields_update(rotary_selector_item->item, "elm.swallow.dummy_button", ELM_GENLIST_ITEM_FIELD_CONTENT); + } + else + { + LOGE("Not supported part name [%s]", part_name); + return; + } +} + +static const char * +_eext_more_option_genlist_item_part_text_get(const Eext_Object_Item *item, const char *part_name) +{ + Eext_Rotary_Selector_Item *rotary_selector_item = (Eext_Rotary_Selector_Item*)item; + if (!rotary_selector_item) + { + LOGE("item is NULL!!"); + return NULL; + } + if (!strcmp(part_name, "selector,main_text")) + { + return rotary_selector_item->main_text; + } + else if (!strcmp(part_name, "selector,sub_text")) + { + return rotary_selector_item->sub_text; + } + + return NULL; +} + +static void +_eext_more_option_genlist_item_domain_translatable_part_text_set(Eext_Object_Item *item, const char *part_name, const char *domain, const char *text) +{ + Eext_Rotary_Selector_Item *rotary_selector_item = (Eext_Rotary_Selector_Item *)item; + if (!rotary_selector_item) + { + LOGE("rotary_selector_item is NULL!!"); + return; + } + if (!part_name) + { + LOGE("part_name is NULL!!"); + return; + } + if (!domain) + { + LOGE("domain is NULL!!"); + return; + } + if (!text) + { + LOGE("text is NULL!!"); + return; + } + + Rotary_Genlist_Data *rgd = _rotary_genlist_data_get(rotary_selector_item->obj); + if (!rgd) + { + LOGE("rsd is NULL!!"); + return; + } + + if (!strcmp(part_name, "selector,main_text")) + { + _genlist_item_text_copy(&(rotary_selector_item->domain), domain); + _genlist_item_text_copy(&(rotary_selector_item->main_text), text); + if (rotary_selector_item->content) + { + rotary_selector_item->itc->item_style = _genlist_item_style_get(item->obj, ITEM_STYLE_1_TEXT_1_ICON); + elm_genlist_item_item_class_update(rotary_selector_item->item, rotary_selector_item->itc); + } + elm_genlist_item_fields_update(rotary_selector_item->item, "elm.text", ELM_GENLIST_ITEM_FIELD_TEXT); + elm_genlist_item_fields_update(rotary_selector_item->item, "elm.swallow.dummy_button", ELM_GENLIST_ITEM_FIELD_CONTENT); + } + else if (!strcmp(part_name, "selector,sub_text")) + { + _genlist_item_text_copy(&(rotary_selector_item->domain), domain); + _genlist_item_text_copy(&(rotary_selector_item->sub_text), text); + if (rotary_selector_item->content) + { + rotary_selector_item->itc->item_style = _genlist_item_style_get(item->obj, ITEM_STYLE_2_TEXT_1_ICON); + } + else + { + rotary_selector_item->itc->item_style = _genlist_item_style_get(item->obj, ITEM_STYLE_2_TEXT); + } + elm_genlist_item_item_class_update(rotary_selector_item->item, rotary_selector_item->itc); + elm_genlist_item_fields_update(rotary_selector_item->item, "elm.text.1", ELM_GENLIST_ITEM_FIELD_TEXT); + elm_genlist_item_fields_update(rotary_selector_item->item, "elm.swallow.dummy_button", ELM_GENLIST_ITEM_FIELD_CONTENT); + } + else + { + LOGE("Not supported part name [%s]", part_name); + } + + return; +} + +static void +_eext_more_option_genlist_item_part_content_set(Eext_Object_Item *item, const char *part_name, Eext_Rotary_Selector_Item_State state, Evas_Object *content) +{ + Eext_Rotary_Selector_Item *rotary_selector_item = (Eext_Rotary_Selector_Item *)item; + if (!rotary_selector_item) + { + LOGE("rotary_selector_item is NULL!!"); + return; + } + if (!part_name) + { + LOGE("part_name is NULL!!"); + return; + } + if (!content) + { + LOGE("content is NULL!!"); + return; + } + if (state != EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL) + { + LOGE("Not implemented!!"); + return; + } + + Rotary_Genlist_Data *rgd = _rotary_genlist_data_get(rotary_selector_item->obj); + if (!rgd) + { + LOGE("rgd is NULL!!"); + return; + } + /* FIXME: TBD for other parts */ + if (!strcmp(part_name, "item,icon")) + { + rotary_selector_item->content = content; + if (rotary_selector_item->main_text && rotary_selector_item->sub_text) + { + rotary_selector_item->itc->item_style = _genlist_item_style_get(item->obj, ITEM_STYLE_2_TEXT_1_ICON); + } + else + { + rotary_selector_item->itc->item_style = _genlist_item_style_get(item->obj, ITEM_STYLE_1_TEXT_1_ICON); + } + + elm_genlist_item_item_class_update(rotary_selector_item->item, rotary_selector_item->itc); + elm_genlist_item_fields_update(rotary_selector_item->item, "elm.text", ELM_GENLIST_ITEM_FIELD_TEXT); + elm_genlist_item_fields_update(rotary_selector_item->item, "elm.text.1", ELM_GENLIST_ITEM_FIELD_TEXT); + elm_genlist_item_fields_update(rotary_selector_item->item, "elm.icon", ELM_GENLIST_ITEM_FIELD_CONTENT); + elm_genlist_item_fields_update(rotary_selector_item->item, "elm.swallow.dummy_button", ELM_GENLIST_ITEM_FIELD_CONTENT); + } + else + { + LOGE("Not supported part name!!"); + } +} + +static Evas_Object * +_eext_more_option_genlist_item_part_content_get(const Eext_Object_Item *item, const char *part_name, Eext_Rotary_Selector_Item_State state) +{ + Eext_Rotary_Selector_Item *rotary_selector_item = (Eext_Rotary_Selector_Item*)item; + if (!rotary_selector_item) + { + LOGE("rotary_selector_item is NULL!!"); + return NULL; + } + if (!part_name) + { + LOGE("part_name is NULL!!"); + return NULL; + } + if (state != EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL) + { + LOGE("Not implemented!!"); + return NULL; + } + /* FIXME: TBD for other parts */ + if (!strcmp(part_name, "item,icon")) + { + return rotary_selector_item->content; + } + else + { + LOGE("Not supported part name!!"); + } + + return NULL; +} + +static const Eina_List* +_eext_more_option_genlist_items_get(const Evas_Object *obj) +{ + Rotary_Genlist_Data *rgd = _rotary_genlist_data_get((Evas_Object *)obj); + if (!rgd) + { + LOGE("rsd is NULL!!"); + return NULL; + } + + return rgd->item_list; +} + +static Eina_Bool +_eext_more_option_genlist_editing_enabled_get(const Evas_Object *obj) +{ + //FIXME: TBD + return EINA_FALSE; +} + +static void +_eext_more_option_genlist_editing_enabled_set(Evas_Object *obj, Eina_Bool enabled) +{ + //FIXME: TBD + return; +} + +static void +_eext_more_option_genlist_add_item_enabled_set(Evas_Object *obj, Eina_Bool enabled) +{ + Rotary_Genlist_Data *rgd = _rotary_genlist_data_get(obj); + if (!rgd) + { + LOGE("rgd is NULL!!"); + return; + } + + if (rgd->add_enabled == enabled) + return; + rgd->add_enabled = enabled; + + if (enabled) + { + _genlist_add_item_create(obj, rgd); + } + else if (rgd->add_item) + { + rgd->item_list = eina_list_remove(rgd->item_list, rgd->add_item); + if(rgd->add_item->main_text) free(rgd->add_item->main_text); + if(rgd->add_item->sub_text) free(rgd->add_item->sub_text); + if(rgd->add_item->domain) free(rgd->add_item->domain); + + elm_object_item_del(rgd->add_item->item); + free(rgd->add_item); + rgd->add_item = NULL; + } +} + +static Eina_Bool +_eext_more_option_genlist_add_item_enabled_get(const Evas_Object *obj) +{ + Rotary_Genlist_Data *rgd = _rotary_genlist_data_get((Evas_Object *)obj);; + + if (!rgd) + { + LOGE("rotary_selector_item is NULL!!"); + return EINA_FALSE; + } + + return rgd->add_enabled; +} + +static void +_eext_more_option_genlist_item_delete_enabled_set(Eext_Object_Item *item, Eina_Bool enabled) +{ + //FIXME: TBD + return; +} + +static Eina_Bool +_eext_more_option_genlist_item_delete_enabled_get(const Eext_Object_Item *item) +{ + //FIXME: TBD + return EINA_FALSE; +} + +/*static Evas_Object * +_capture_image_masking_apply(Eext_More_Option_Data *mold, Evas_Object *captured_image) +{ + char buf[PATH_MAX]; + Evas_Object *image; + + snprintf(buf, sizeof(buf), "%s/%s", IMG_DIR, more_option_mask_image); + + void* masking_buffer = gxt_image_effect_object_mask(captured_image, buf, TIZEN_WEARABLE_SCREEN_SIZE, TIZEN_WEARABLE_SCREEN_SIZE, 0, 0); + + image = evas_object_image_filled_add(evas_object_evas_get(mold->more_option)); + evas_object_image_size_set(image, TIZEN_WEARABLE_SCREEN_SIZE, TIZEN_WEARABLE_SCREEN_SIZE); + evas_object_image_data_set(image, masking_buffer); + evas_object_image_smooth_scale_set(image, EINA_FALSE); + evas_object_image_alpha_set(image, EINA_TRUE); + evas_object_image_data_update_add(image, 0, 0, TIZEN_WEARABLE_SCREEN_SIZE, TIZEN_WEARABLE_SCREEN_SIZE); + + mold->mask_buffer = masking_buffer; + return image; +}*/ + +static Eina_Bool +_screen_shot_take(Eext_More_Option_Data *data) +{ + Eext_More_Option_Data *mold = data; + int error; + int width = TIZEN_WEARABLE_SCREEN_SIZE, height = TIZEN_WEARABLE_SCREEN_SIZE; + efl_util_screenshot_h screenshot; + tbm_surface_h surface; + tbm_surface_info_s info; + void *ptr = NULL; + Eina_Bool freeMem = EINA_FALSE; + unsigned char *src = NULL; + unsigned char *dst = NULL; + + screenshot = efl_util_screenshot_initialize(width, height); + if (!screenshot) + { + LOGE("Screenshot init fail"); + return EINA_FALSE; + } + + surface = efl_util_screenshot_take_tbm_surface(screenshot); + error = get_last_result(); + if (error != EFL_UTIL_ERROR_NONE) + { + efl_util_screenshot_deinitialize(screenshot); + LOGE("Screenshot take fail"); + return EINA_FALSE; + } + + tbm_surface_map(surface, TBM_SURF_OPTION_READ, &info); + if (info.width == (info.planes[0].stride / 4)) + { + ptr = info.planes[0].ptr; + } + else + { + ptr = malloc(info.width * info.height * 4); + if (!ptr) + { + LOGE("Memory Error"); + } + freeMem = EINA_TRUE; + + src = (unsigned char *)info.planes[0].ptr; + dst = (unsigned char *)ptr; + int src_stride = info.planes[0].stride; + int dst_stride = info.width * 4; + int i; + + for (i = 0; i < info.height; i++) + { + memcpy(dst, src, dst_stride); + src += src_stride; + dst += dst_stride; + } + } + + char *bufpixels; + bufpixels = alloca(sizeof(char) * 4 * height * width); + + memcpy(bufpixels, ptr, sizeof(char) * 4 * height * width); + Evas_Object *image = evas_object_image_filled_add(evas_object_evas_get(mold->more_option)); + if (!image) + { + LOGE("Image Creation failed"); + return EINA_FALSE; + } + evas_object_image_size_set(image, TIZEN_WEARABLE_SCREEN_SIZE, TIZEN_WEARABLE_SCREEN_SIZE); + evas_object_image_data_set(image, bufpixels); + evas_object_image_smooth_scale_set(image, EINA_FALSE); + evas_object_image_data_update_add(image, 0, 0, width, height); + + Eina_Bool success = evas_object_image_save(image, TIZEN_EFFECT_IMAGE_PATH, NULL, "quality=100 compress=1"); + if (!success) + { + evas_object_del(image); + LOGE("Image Save failed"); + return EINA_FALSE; + } +// mold->blur_image = //_capture_image_masking_apply(data, image); + evas_object_del(image); + + if (freeMem == EINA_TRUE && ptr) + { + free(ptr); + ptr = NULL; + } + tbm_surface_unmap(surface); + tbm_surface_destroy(surface); + efl_util_screenshot_deinitialize(screenshot); + + LOGI("Screenshot Success"); + return EINA_TRUE; +} + +static void +_effect_cancel(Eext_More_Option_Data *data) +{ + Eext_More_Option_Data *mold = data; + if (!mold) + { + LOGI("Mold data null, object deleted"); + return; + } + + if (mold->mask_buffer) + { + free(mold->mask_buffer); + mold->mask_buffer = NULL; + } + evas_object_del(mold->blur_image); + mold->blur_image = NULL; +} + +static Eina_Bool +_effect_bg_image_create(Eext_More_Option_Data *data) +{ + Eext_More_Option_Data *mold = data; + + evas_object_del(mold->blur_image); + + Evas_Object *conform = evas_object_data_get(elm_object_top_widget_get(mold->more_option), "\377 elm,conformant"); + if (!conform) + { + if (_screen_shot_take(mold)) + { + return EINA_TRUE; + } + return EINA_FALSE; + } + Evas_Object *image = evas_object_image_filled_add(evas_object_evas_get(mold->more_option)); + if (!image) + { + LOGE("Image Creation failed"); + return EINA_FALSE; + } + evas_object_image_alpha_set(image, EINA_TRUE); + evas_object_image_colorspace_set(image, EVAS_COLORSPACE_ARGB8888); + evas_object_image_smooth_scale_set(image, EINA_FALSE); + evas_object_image_size_set(image, TIZEN_WEARABLE_SCREEN_SIZE, TIZEN_WEARABLE_SCREEN_SIZE); + evas_object_image_source_set(image, conform); + Eina_Bool success = evas_object_image_save(image, TIZEN_EFFECT_IMAGE_PATH, NULL, "quality=100 compress=1"); + if (success) + { + LOGI("Bg capture success"); + evas_object_del(image); + image = evas_object_image_filled_add(evas_object_evas_get(mold->more_option)); + evas_object_image_file_set(image, TIZEN_EFFECT_IMAGE_PATH, NULL); + +// mold->blur_image = _capture_image_masking_apply(data, image); + evas_object_del(image); + return EINA_TRUE; + } + else + { + LOGE("Image could not be saved!!!!"); + evas_object_del(image); + if (_screen_shot_take(mold)) + { + return EINA_TRUE; + } + return EINA_FALSE; + } +} + +static void +_bg_image_hide_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + Eext_More_Option_Data *mold = data; + _effect_cancel(mold); +} + +/*static void +_bg_blur_set(unsigned int *dst, unsigned int *src, double level) +{ + gxt_buffer_s src_obj, dst_obj; + src_obj.pixels = src; + src_obj.width = TIZEN_WEARABLE_SCREEN_SIZE; + src_obj.height = TIZEN_WEARABLE_SCREEN_SIZE; + src_obj.bytes_per_line = TIZEN_WEARABLE_SCREEN_SIZE * sizeof(unsigned int); + src_obj.pixel_format = GXT_PIXEL_FORMAT_XRGB8888; + + dst_obj.pixels = dst; + dst_obj.width = TIZEN_WEARABLE_SCREEN_SIZE; + dst_obj.height = TIZEN_WEARABLE_SCREEN_SIZE; + dst_obj.bytes_per_line = TIZEN_WEARABLE_SCREEN_SIZE * sizeof(unsigned int); + dst_obj.pixel_format = GXT_PIXEL_FORMAT_XRGB8888; + + gxt_buffer_blur(&dst_obj, &src_obj, level); +}*/ + +static void +_effect_blur_bg_image(Eext_More_Option_Data *data) +{ + unsigned int *bg_src, *bg_dst; + Eext_More_Option_Data *mold = data; + + Evas_Object *image = evas_object_image_filled_add(evas_object_evas_get(mold->more_option)); + evas_object_image_size_set(image, TIZEN_WEARABLE_SCREEN_SIZE, TIZEN_WEARABLE_SCREEN_SIZE); + evas_object_event_callback_add(image, EVAS_CALLBACK_HIDE, _bg_image_hide_cb, mold); + elm_object_part_content_set(mold->panel, "blur_base", image); + + bg_src = evas_object_image_data_get(mold->blur_image, 0); + bg_dst = evas_object_image_data_get(image, 1); + + // _bg_blur_set(bg_dst, bg_src, TIZEN_EFFECT_BLUR_RADIUS); + evas_object_image_data_set(image, bg_dst); + evas_object_image_data_update_add(image, 0, 0, TIZEN_WEARABLE_SCREEN_SIZE, TIZEN_WEARABLE_SCREEN_SIZE); + evas_object_show(image); + evas_object_del(mold->blur_image); + mold->blur_image = image; +} + +//ONEUI1.5(27May2019): Reduce tbm memory by adding surface on demand +static void +_more_option_genlist_surface_create(Eext_More_Option_Data *data) +{ + Eext_More_Option_Data *mold = data; + + Evas_Object *circle_genlist = NULL; + Evas_Object *surface_layout = NULL; + + surface_layout = elm_layout_add(mold->genlist); + if (!surface_layout) + { + LOGE("Surface Layout creation failed"); + return; + } + evas_object_size_hint_weight_set(surface_layout, EVAS_HINT_EXPAND,EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(surface_layout, EVAS_HINT_FILL, EVAS_HINT_FILL); + Eext_Circle_Surface *surface = eext_circle_surface_layout_add(surface_layout); + if (!surface) + { + LOGE("Surface creation failed"); + return; + } + elm_object_part_content_set(mold->genlist, "elm.swallow.circle", surface_layout); + circle_genlist = eext_circle_object_genlist_add(mold->genlist, surface); + if (!circle_genlist) + { + LOGE("Circle Genlist creation failed"); + return; + } + eext_circle_object_genlist_scroller_policy_set(circle_genlist, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_AUTO); + mold->circle_genlist = circle_genlist; + mold->surface = surface; + + LOGI("Surface created: %p", surface); +} + +static void +_more_option_genlist_surface_destroy(Eext_More_Option_Data *data) +{ + Eext_More_Option_Data *mold = data; + + LOGI("Surface destroyed: %p", mold->surface); + + eext_circle_surface_del(mold->surface); + evas_object_del(elm_object_part_content_get(mold->genlist, "elm.swallow.circle")); + evas_object_del(mold->circle_genlist); + mold->circle_genlist = NULL; + mold->surface = NULL; +} +// + +static Eina_Bool +_effect_timer_cb(void *data) +{ + Eext_More_Option_Data *mold = data; + Elm_Object_Item *it = elm_genlist_nth_item_get(mold->genlist, ++mold->effect_count); + + if (it) + { + if (mold->effect_count == 1) elm_object_item_signal_emit(it, "elm,state,first,vi,show", "elm"); + else elm_object_item_signal_emit(it, "elm,state,vi,show", "elm"); + if (mold->effect_count == 3) + { + return ECORE_CALLBACK_CANCEL; + } + else + { + return ECORE_CALLBACK_RENEW; + } + } + else + { + return ECORE_CALLBACK_CANCEL; + } +} + +static void +_item_hide_signal_emit(Eext_More_Option_Data *data) +{ + Eext_More_Option_Data *mold = data; + + Elm_Object_Item *it = elm_genlist_nth_item_get(mold->genlist, 1); + if (it) + { + elm_object_item_signal_emit(it, "elm,state,first,vi,hide", "elm"); + } + int idx = 0; + for (idx = 1; idx <= 3; idx++) + { + it = elm_genlist_nth_item_get(mold->genlist, idx); + if (it) + { + elm_object_item_signal_emit(it, "elm,state,vi,hide", "elm"); + } + } + mold->effect_count = 0; + if (mold->effect_timer) + { + ecore_timer_del(mold->effect_timer); + mold->effect_timer = NULL; + } + mold->effect_timer = ecore_timer_add(TIZEN_EFFECT_ITEM_DURATION, _effect_timer_cb, mold); +} -/* === /internal object cb & util === */ -static void _drawer_back_cb(void *data, Evas_Object *obj, void *event_info); -static void _panel_active_cb(void *data, Evas_Object *obj, const char *emission, const char *source); -static void _panel_inactive_cb(void *data, Evas_Object *obj, const char *emission, const char *source); -static void _panel_cue_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source); -static void _panel_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); -static void _cue_hide_cb(void *data, Evas_Object *obj, const char *emission, const char *source); -static void _cue_show_cb(void *data, Evas_Object *obj, const char *emission, const char *source); +//ONEUI1.5(30May2019): Improve VI effect +static Eina_Bool +_after_blur_idler_cb(void * data) +{ + Eext_More_Option_Data *mold = data; -/* === internal object creation (elm-demo-tizen/drawer.c) === */ -static Evas_Object *_drawer_layout_create(Evas_Object *parent); -static Evas_Object *_panel_create(Evas_Object *parent, Eext_More_Option_Data *mold); + //ONEUI1.5(20Jun2019): Add blur timer in case blur idler is not invoked + if (mold->blur_timer) + { + ecore_timer_del(mold->blur_timer); + mold->blur_timer = NULL; + } + // + LOGI("Panel Status: %d",elm_panel_hidden_get(mold->panel)); + _item_hide_signal_emit(mold); + elm_panel_toggle(mold->panel); + mold->blur_idler = NULL; -/* === more option API === */ -static Eext_More_Option_Data *_more_option_data_init(Evas_Object *obj, Evas_Object *parent); -static Eext_More_Option_Data *_more_option_data_get(const Evas_Object *more_option); -static void _more_option_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); + return EINA_FALSE; +} +// -/* === Accessibility === */ -static Eina_Bool _access_action_cb(void *data, Evas_Object *obj, Elm_Access_Action_Info *action_info); -static char * _accessibility_name_set_cb(void *data, Evas_Object *obj); -static void _more_option_screen_reader_changed(void *data, Evas_Object *obj, void *event_info); -static char *_accessibility_panel_name_set_cb(void *data, Evas_Object *obj); -static char *_accessibility_panel_description_set_cb(void *data, Evas_Object *obj); +//ONEUI1.5(20Jun2019): Add blur timer in case blur idler is not invoked +static Eina_Bool +_after_blur_timer_cb(void * data) +{ + Eext_More_Option_Data *mold = data; -/* === color class === */ -void _eext_more_option_color_class_parent_set(Evas_Object *obj, Evas_Object *parent); + if (mold->blur_idler) + { + ecore_idler_del(mold->blur_idler); + mold->blur_idler = NULL; + } + LOGI("Panel Status: %d",elm_panel_hidden_get(mold->panel)); + _item_hide_signal_emit(mold); + elm_panel_toggle(mold->panel); + mold->blur_timer = NULL; + + return EINA_FALSE; +} +// + +static void +_eext_more_option_effect_create(Eext_More_Option_Data *data) +{ + Eext_More_Option_Data *mold = data; + //ONEUI1.5(27May2019): Reduce tbm memory by adding surface on demand + _more_option_genlist_surface_destroy(mold); + _more_option_genlist_surface_create(mold); + // + //ONEUI1.5(31Oct2019): For access on case, show first item when panel becomes active + if (!elm_atspi_bridge_utils_is_screen_reader_enabled()) + elm_genlist_item_bring_in(elm_genlist_nth_item_get(mold->genlist, 1), ELM_GENLIST_ITEM_SCROLLTO_MIDDLE); + else + elm_genlist_item_show(elm_genlist_nth_item_get(mold->genlist, 1), ELM_GENLIST_ITEM_SCROLLTO_MIDDLE); + // + + LOGI("blur effect create"); + + if (_effect_bg_image_create(mold)) + { + _effect_blur_bg_image(mold); + } + else + { + LOGE("Bg image is NULL!!!"); + } + + evas_object_freeze_events_set(mold->panel, EINA_TRUE); + eext_rotary_object_event_activated_set(mold->circle_genlist, EINA_TRUE); + //ONEUI1.5(20Jun2019): Add blur timer in case blur idler is not invoked + if (mold->blur_timer) + { + ecore_timer_del(mold->blur_timer); + mold->blur_timer = NULL; + } + mold->blur_timer = ecore_timer_add(0.5, _after_blur_timer_cb, mold); + // + //ONEUI1.5(30May2019): Improve VI effect + if (mold->blur_idler) + { + ecore_idler_del(mold->blur_idler); + mold->blur_idler = NULL; + } + mold->blur_idler = ecore_idler_add(_after_blur_idler_cb, mold); + // +} -/* === internal object cb & util === */ static void _drawer_back_cb(void *data, Evas_Object *obj, void *event_info) { + LOGI("panel back cb"); + Evas_Object *panel = obj; if (!panel) { - ERR("panel is NULL!!"); + LOGE("panel is NULL!!"); return; } Eext_More_Option_Data *mold = data; if (!mold) { - ERR("mold is NULL!!"); + LOGE("mold is NULL!!"); return; } + if (__elm_product_theme_is_loaded()) + eext_rotary_object_event_activated_set(mold->circle_genlist, EINA_FALSE); + else + eext_rotary_object_event_activated_set(mold->rotary_selector, EINA_FALSE); + + LOGI("Panel Status: %d",elm_panel_hidden_get(panel)); if (!elm_panel_hidden_get(panel)) elm_panel_toggle(panel); } @@ -78,26 +1376,42 @@ _panel_active_cb(void *data, Evas_Object *obj, const char *emission, const char if (mold) { evas_object_smart_callback_call(mold->more_option, "more,option,opened", NULL); - eext_rotary_object_event_activated_set(mold->rotary_selector, EINA_TRUE); - eext_object_event_callback_add(obj, EEXT_CALLBACK_BACK, _drawer_back_cb, mold); - Edje_Message_Int msg; - msg.val = 0; - - Evas_Object* content_part = elm_object_part_content_get(mold->rotary_selector, "content"); - if (content_part) + if (__elm_product_theme_is_loaded()) + { + LOGI("panel back registered"); + eext_object_event_callback_add(obj, EEXT_CALLBACK_BACK, _drawer_back_cb, mold); + evas_object_freeze_events_set(mold->panel, EINA_FALSE); + //Support for scrollbar show and hide + evas_object_smart_callback_call(mold->panel, OBJECT_SHOW_INTERNAL, mold->genlist); + // + } + else { - edje_object_message_send(elm_layout_edje_get(content_part), EDJE_MESSAGE_INT, 0, &msg); + eext_object_event_callback_add(obj, EEXT_CALLBACK_BACK, _drawer_back_cb, mold); + Edje_Message_Int msg; + msg.val = 0; + + Evas_Object* content_part = elm_object_part_content_get(mold->rotary_selector, "content"); + if (content_part) + { + edje_object_message_send(elm_layout_edje_get(content_part), EDJE_MESSAGE_INT, 0, &msg); + } } //for accessibility // signal send to rotary selector for highlighted access object - evas_object_show(mold->rotary_selector); - if(elm_atspi_bridge_utils_is_screen_reader_enabled()) + if (elm_atspi_bridge_utils_is_screen_reader_enabled()) { evas_object_smart_callback_call(mold->rotary_selector, "more,option,opened", NULL); + if (mold->cue_access_object) + elm_atspi_component_highlight_clear(mold->cue_access_object); } // + //ONEUI1.5(20190424):Avoid panel close by api when panel is not active. + mold->is_panel_active = EINA_TRUE; + // } + LOGI("panel active"); } static void @@ -106,49 +1420,112 @@ _panel_inactive_cb(void *data, Evas_Object *obj, const char *emission, const cha Eext_More_Option_Data *mold = data; if (mold) { + /*ONEUI1.5(10Oct2019): Do nothing in inactive state when panel was not active. + This case occurs when panel first loaded with toggle signal + which invokes inactive state and before cue clicked is processed, inactive state + is invoked and cue event becomes unresponsive. + */ + if (!mold->is_panel_active) return; + // evas_object_repeat_events_set(mold->panel, EINA_FALSE); - + LOGI("Panel is inactive"); evas_object_smart_callback_call(mold->more_option, "more,option,closed", NULL); - eext_rotary_object_event_activated_set(mold->rotary_selector, EINA_FALSE); - - Edje_Message_Int msg; - msg.val = 1; - - Evas_Object* content_part = elm_object_part_content_get(mold->rotary_selector, "content"); - if (content_part) + if (__elm_product_theme_is_loaded()) { - edje_object_message_send(elm_layout_edje_get(content_part), EDJE_MESSAGE_INT, 0, &msg); + //ONEUI1.5(20Jun2019): Add blur timer in case blur idler is not invoked + if (mold->blur_timer) + { + ecore_timer_del(mold->blur_timer); + mold->blur_timer = NULL; + } + if (mold->blur_idler) + { + ecore_idler_del(mold->blur_idler); + mold->blur_idler = NULL; + } + // + eext_rotary_object_event_activated_set(mold->circle_genlist, EINA_FALSE); + //ONEUI1.5(31Oct2019): For access on case, show first item when panel becomes inactive + if (!elm_atspi_bridge_utils_is_screen_reader_enabled()) + elm_genlist_item_bring_in(elm_genlist_nth_item_get(mold->genlist, 1), ELM_GENLIST_ITEM_SCROLLTO_MIDDLE); + else + elm_genlist_item_show(elm_genlist_nth_item_get(mold->genlist, 1), ELM_GENLIST_ITEM_SCROLLTO_MIDDLE); + // + mold->effect_count = 0; + evas_object_del(mold->blur_image); + if (mold->effect_timer) + { + ecore_timer_del(mold->effect_timer); + mold->effect_timer = NULL; + } + //ONEUI1.5(27May2019): Reduce tbm memory by adding surface on demand + _more_option_genlist_surface_destroy(mold); + // + //Support for scrollbar show and hide + evas_object_smart_callback_call(mold->panel, OBJECT_HIDE_INTERNAL, mold->genlist); + // } - - //item index is initialized as zero. - if (mold->rotary_selector) + else { - //Initialize item to zero - Eext_Object_Item *item = eina_list_data_get(mold->item_list); - eext_rotary_selector_selected_item_set(mold->rotary_selector, item); + eext_rotary_object_event_activated_set(mold->rotary_selector, EINA_FALSE); + + Edje_Message_Int msg; + msg.val = 1; + + Evas_Object* content_part = elm_object_part_content_get(mold->rotary_selector, "content"); + if (content_part) + { + edje_object_message_send(elm_layout_edje_get(content_part), EDJE_MESSAGE_INT, 0, &msg); + } + + //item index is initialized as zero. + if (mold->rotary_selector) + { + //Initialize item to zero + Eext_Object_Item *item = eina_list_data_get(mold->item_list); + if (item) + { + eext_rotary_selector_selected_item_set(mold->rotary_selector, item); + } + } } - //for accessibility // signal send to rotary selector for highlighted access object - evas_object_hide(mold->rotary_selector); - if(elm_atspi_bridge_utils_is_screen_reader_enabled()) + if (elm_atspi_bridge_utils_is_screen_reader_enabled()) { evas_object_smart_callback_call(mold->rotary_selector, "more,option,closed", NULL); } // + //ONEUI1.5(20190424):Avoid panel close by api when panel is not active. + mold->is_panel_active = EINA_FALSE; + // } - + LOGI("panel inactive, panel back deregister"); eext_object_event_callback_del(obj, EEXT_CALLBACK_BACK, _drawer_back_cb); } static void _panel_cue_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source) { - INF("more_option cue clicked!!"); + LOGI("more_option cue clicked!!"); Eext_More_Option_Data *mold = data; - if (mold) - evas_object_smart_callback_call(mold->more_option, "cue,clicked", NULL); + if (!mold) + { + LOGE("mold is NULL"); + return; + } + + if (__elm_product_theme_is_loaded()) + { + _eext_more_option_effect_create(mold); + } + else + { + eext_rotary_object_event_activated_set(mold->rotary_selector, EINA_TRUE); + } + + evas_object_smart_callback_call(mold->more_option, "cue,clicked", NULL); } static void @@ -168,7 +1545,7 @@ _drawer_layout_create(Evas_Object *parent) layout = elm_layout_add(parent); if (!layout) { - ERR("drawer layout is NULL"); + LOGE("drawer layout is NULL"); return NULL; } @@ -186,15 +1563,21 @@ _panel_create(Evas_Object *parent, Eext_More_Option_Data *mold) panel = elm_panel_add(parent); if (!panel) { - ERR("panel is NULL"); + LOGE("panel is NULL"); return NULL; } evas_object_show(panel); //Default : right - elm_panel_orient_set(panel, ELM_PANEL_ORIENT_RIGHT); + //ONEUI1.5 20170418 performace inhancement + //elm_panel_orient_set(panel, ELM_PANEL_ORIENT_RIGHT); + // elm_object_part_content_set(parent, "elm.swallow.right", panel); + if (__elm_product_theme_is_loaded()) + { + elm_object_signal_emit(panel, "eext,more,option,enable", "elm"); + } evas_object_event_callback_add(panel, EVAS_CALLBACK_DEL, _panel_del_cb, NULL); @@ -210,7 +1593,7 @@ _more_option_data_init(Evas_Object *obj, Evas_Object *parent) mold = (Eext_More_Option_Data *)calloc(1, sizeof(Eext_More_Option_Data)); if (!mold) { - ERR("mold is NULL!!"); + LOGE("mold is NULL!!"); return NULL; } @@ -219,6 +1602,13 @@ _more_option_data_init(Evas_Object *obj, Evas_Object *parent) mold->item_list = NULL; mold->panel = NULL; mold->rotary_selector = NULL; + mold->genlist = NULL; + mold->effect_timer = NULL; + mold->effect_count = 0; + mold->mask_buffer = NULL; + //ONEUI1.5(20190424):Avoid panel close by api when panel is not active. + mold->is_panel_active = EINA_FALSE; + // mold->direction = EEXT_MORE_OPTION_DIRECTION_RIGHT; return mold; @@ -229,7 +1619,7 @@ _more_option_data_get(const Evas_Object *more_option) { if (!more_option) { - ERR("more_option is NULL!!"); + LOGE("more_option is NULL!!"); return NULL; } @@ -260,7 +1650,27 @@ static void _more_option_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) { Eext_More_Option_Data *mold = data; - + if (mold->effect_timer) + { + ecore_timer_del(mold->effect_timer); + mold->effect_timer = NULL; + } + //ONEUI1.5(20Jun2019): Add blur timer in case blur idler is not invoked + if (mold->blur_timer) + { + ecore_timer_del(mold->blur_timer); + mold->blur_timer = NULL; + } + if (mold->blur_idler) + { + ecore_idler_del(mold->blur_idler); + mold->blur_idler = NULL; + } + // + if (__elm_product_theme_is_loaded()) + { + evas_object_del(mold->blur_image); + } // accessibility evas_object_smart_callback_del(mold->more_option, "atspi,screen,reader,changed", _more_option_screen_reader_changed); if (mold->cue_access_object) @@ -273,12 +1683,38 @@ _more_option_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) evas_object_event_callback_del(mold->more_option, EVAS_CALLBACK_HIDE, _more_option_hide_cb); evas_object_event_callback_del(mold->more_option, EVAS_CALLBACK_SHOW, _more_option_show_cb); + evas_object_smart_callback_del(mold->more_option, SIGNAL_ACTIVATED, _rotary_activated_cb); + //ONEUI1.5(06AUG2019): Delete callbacks to avoid invalid read + if (__elm_product_theme_is_loaded()) + evas_object_smart_callback_del(mold->genlist, "aligned,item,detected", _rotary_selector_item_selected); + else + { + evas_object_smart_callback_del(mold->rotary_selector, "item,selected", _rotary_selector_item_selected); + evas_object_smart_callback_del(mold->rotary_selector, "item,clicked", _rotary_selector_item_clicked); + } + // if (mold->item_list) { mold->item_list = eina_list_free(mold->item_list); } - + //ONEUI1.5(20Jun2019): Add genlist scroller color class change + if (mold->scrollbar_bezel_fg_color_class) + { + edje_object_signal_callback_del(elm_layout_edje_get(mold->more_option), "color_class,set", mold->scrollbar_bezel_fg_color_class, _genlist_color_change_signal_cb); + eina_stringshare_del(mold->scrollbar_bezel_fg_color_class); + } + if (mold->scrollbar_fg_color_class) + { + edje_object_signal_callback_del(elm_layout_edje_get(mold->more_option), "color_class,set", mold->scrollbar_fg_color_class, _genlist_color_change_signal_cb); + eina_stringshare_del(mold->scrollbar_fg_color_class); + } + if (mold->scrollbar_bg_color_class) + { + edje_object_signal_callback_del(elm_layout_edje_get(mold->more_option), "color_class,set", mold->scrollbar_bg_color_class, _genlist_color_change_signal_cb); + eina_stringshare_del(mold->scrollbar_bg_color_class); + } + // evas_object_data_del(obj, EEXT_MORE_OPTION_DATA_KEY); free(mold); @@ -287,9 +1723,14 @@ _more_option_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) static void _cue_hide_cb(void *data, Evas_Object *obj, const char *emission, const char *source) { - INF("called!!"); + LOGI("called!!"); Eext_More_Option_Data *mold = data; + if (!mold) + { + LOGE("mold is NULL"); + return; + } // accessibility elm_layout_signal_emit(mold->panel, "cue,hide", "elm"); @@ -299,19 +1740,50 @@ _cue_hide_cb(void *data, Evas_Object *obj, const char *emission, const char *sou static void _cue_show_cb(void *data, Evas_Object *obj, const char *emission, const char *source) { - INF("called!!"); + LOGI("called!!"); Eext_More_Option_Data *mold = data; + if (!mold) + { + LOGE("mold is NULL"); + return; + } // accessibility elm_layout_signal_emit(mold->panel, "cue,show", "elm"); // } +static void +_rotary_activated_cb(void *data, Evas_Object *obj, void *event_info) +{ + LOGI("called!!"); + + Eext_More_Option_Data *mold = data; + if (!mold || elm_panel_hidden_get(mold->panel)) + { + return; + } + + if (__elm_product_theme_is_loaded()) + { + eext_rotary_object_event_activated_set(mold->circle_genlist, EINA_TRUE); + } + else + { + eext_rotary_object_event_activated_set(mold->rotary_selector, EINA_TRUE); + } +} + static void _rotary_selector_item_clicked(void *data, Evas_Object *obj, void *event_info) { Eext_More_Option_Data *mold = (Eext_More_Option_Data *)data; + if (!mold) + { + LOGE("mold is NULL"); + return; + } evas_object_smart_callback_call(mold->more_option, "item,clicked", event_info); } @@ -322,6 +1794,13 @@ _more_option_screen_reader_changed(void *data, Evas_Object *obj, void *event_inf if (elm_atspi_bridge_utils_is_screen_reader_enabled()) { + + //ONEUI1.5(20180521): Add name and description when SR is on after creation of more_option + elm_atspi_accessible_name_cb_set(mold->panel, _accessibility_panel_name_set_cb, NULL); + elm_atspi_accessible_description_cb_set(mold->panel, _accessibility_panel_description_set_cb, mold); + elm_atspi_accessible_reading_info_type_set(mold->panel, (ELM_ACCESSIBLE_READING_INFO_TYPE_NAME | ELM_ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION)); + // + if (!mold->cue_access_object) { if (!mold->cue_target_object) @@ -330,7 +1809,9 @@ _more_option_screen_reader_changed(void *data, Evas_Object *obj, void *event_inf elm_atspi_accessible_name_cb_set(mold->cue_access_object, _accessibility_name_set_cb, (Eext_More_Option_Data*)mold); elm_atspi_accessible_role_set(mold->cue_access_object, ELM_ATSPI_ROLE_PUSH_BUTTON); - elm_atspi_accessible_reading_info_type_set(mold->cue_access_object, ELM_ACCESSIBLE_READING_INFO_TYPE_NAME); + elm_atspi_accessible_reading_info_type_set(mold->cue_access_object, ELM_ACCESSIBLE_READING_INFO_TYPE_NAME| + ELM_ACCESSIBLE_READING_INFO_TYPE_ROLE| + ELM_ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION); elm_access_action_cb_set(mold->cue_access_object, ELM_ACCESS_ACTION_ACTIVATE, _access_action_cb, mold); evas_object_data_set(mold->more_option, "_cue_access_object", mold->cue_access_object); @@ -350,18 +1831,40 @@ _more_option_screen_reader_changed(void *data, Evas_Object *obj, void *event_inf static void _rotary_selector_item_selected(void *data, Evas_Object *obj, void *event_info) { + //ONEUI1.5(06AUG2019): Avoid operations for aligned item undetected case + if (__elm_product_theme_is_loaded() && !event_info) return; + // + LOGI("Genlist Selected CB"); Eext_More_Option_Data *mold = (Eext_More_Option_Data *)data; - evas_object_smart_callback_call(mold->more_option, "item,selected", event_info); + if (!mold || !(mold->more_option)) + { + LOGE("INFO: mold:%p\n", mold); + return; + } + if (__elm_product_theme_is_loaded()) + { + if (eext_more_option_opened_get(mold->more_option)) + { + LOGI("genlist item selected"); + event_info = elm_object_item_data_get(event_info); + evas_object_smart_callback_call(mold->more_option, "item,selected", event_info); + } + else + { + LOGE("panel is closed"); + } + } + else + evas_object_smart_callback_call(mold->more_option, "item,selected", event_info); } /* === public API implementation === */ - EAPI Evas_Object * eext_more_option_add(Evas_Object *parent) { if (!parent) { - ERR("parent is NULL!!"); + LOGE("parent is NULL!!"); return NULL; } @@ -371,14 +1874,14 @@ eext_more_option_add(Evas_Object *parent) more_option = _drawer_layout_create(parent); if (!more_option) { - ERR("more_option is NULL!!"); + LOGE("more_option is NULL!!"); return NULL; } mold = _more_option_data_init(more_option, parent); if (!mold) { - ERR("mold is NULL!!"); + LOGE("mold is NULL!!"); return NULL; } @@ -390,7 +1893,7 @@ eext_more_option_add(Evas_Object *parent) mold->panel = _panel_create(mold->more_option, mold); if (!mold->panel) { - ERR("panel is NULL!!"); + LOGE("panel is NULL!!"); return NULL; } @@ -399,41 +1902,52 @@ eext_more_option_add(Evas_Object *parent) elm_layout_signal_callback_add(mold->panel, "cue,clicked", "elm", _panel_cue_clicked_cb, mold); _eext_more_option_color_class_parent_set(mold->panel, mold->more_option); - mold->rotary_selector = eext_rotary_selector_add(mold->more_option); - if (!mold->rotary_selector) + if (__elm_product_theme_is_loaded()) { - ERR("rotary_selector is NULL!!"); - return NULL; + LOGE("genlist added"); + mold->genlist = _eext_more_option_genlist_add(mold->more_option); + if (!mold->genlist) + { + LOGE("genlist is NULL!!"); + return NULL; + } + evas_object_smart_callback_add(mold->genlist, "aligned,item,detected", _rotary_selector_item_selected, mold); + elm_object_part_content_set(mold->panel, "elm.swallow.content.blur", mold->genlist); } - - evas_object_smart_callback_add(mold->rotary_selector, "item,selected", _rotary_selector_item_selected, mold); - evas_object_smart_callback_add(mold->rotary_selector, "item,clicked", _rotary_selector_item_clicked, mold); - _eext_more_option_color_class_parent_set(mold->rotary_selector, mold->more_option); - - Evas_Object *selector_content = elm_layout_add(mold->rotary_selector); - if (!selector_content) + else { - ERR("selector_content is NULL!!"); - return NULL; - } - - elm_layout_theme_set(selector_content, "rotary_selector", "content", "more_option"); - - elm_object_part_content_set(mold->rotary_selector, "content", selector_content); - - elm_object_content_set(mold->panel, mold->rotary_selector); + mold->rotary_selector = eext_rotary_selector_add(mold->more_option); + if (!mold->rotary_selector) + { + LOGE("rotary_selector is NULL!!"); + return NULL; + } + evas_object_smart_callback_add(mold->rotary_selector, "item,selected", _rotary_selector_item_selected, mold); + evas_object_smart_callback_add(mold->rotary_selector, "item,clicked", _rotary_selector_item_clicked, mold); + _eext_more_option_color_class_parent_set(mold->rotary_selector, mold->more_option); - _eext_more_option_color_class_parent_set(selector_content, mold->more_option); + Evas_Object *selector_content = elm_layout_add(mold->rotary_selector); + if (!selector_content) + { + LOGE("selector_content is NULL!!"); + return NULL; + } + elm_layout_theme_set(selector_content, "rotary_selector", "content", "more_option"); + elm_object_part_content_set(mold->rotary_selector, "content", selector_content); + elm_object_content_set(mold->panel, mold->rotary_selector); + _eext_more_option_color_class_parent_set(selector_content, mold->more_option); + } + LOGI("Panel Status: %d",elm_panel_hidden_get(mold->panel)); elm_panel_toggle(mold->panel); //for accessibility evas_object_smart_callback_add(mold->more_option, "atspi,screen,reader,changed", _more_option_screen_reader_changed, mold); - if(elm_atspi_bridge_utils_is_screen_reader_enabled()) + if (elm_atspi_bridge_utils_is_screen_reader_enabled()) { elm_atspi_accessible_name_cb_set(mold->panel, _accessibility_panel_name_set_cb, NULL); - elm_atspi_accessible_description_cb_set(mold->panel, _accessibility_panel_description_set_cb, NULL); + elm_atspi_accessible_description_cb_set(mold->panel, _accessibility_panel_description_set_cb, mold); elm_atspi_accessible_reading_info_type_set(mold->panel, (ELM_ACCESSIBLE_READING_INFO_TYPE_NAME | ELM_ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION)); mold->cue_target_object = (Evas_Object *)edje_object_part_object_get(elm_layout_edje_get(mold->panel), "access"); @@ -441,7 +1955,9 @@ eext_more_option_add(Evas_Object *parent) elm_atspi_accessible_name_cb_set(mold->cue_access_object, _accessibility_name_set_cb, (Eext_More_Option_Data*)mold); elm_atspi_accessible_role_set(mold->cue_access_object, ELM_ATSPI_ROLE_PUSH_BUTTON); - elm_atspi_accessible_reading_info_type_set(mold->cue_access_object, ELM_ACCESSIBLE_READING_INFO_TYPE_NAME); + elm_atspi_accessible_reading_info_type_set(mold->cue_access_object, ELM_ACCESSIBLE_READING_INFO_TYPE_NAME| + ELM_ACCESSIBLE_READING_INFO_TYPE_ROLE| + ELM_ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION); elm_access_action_cb_set(mold->cue_access_object, ELM_ACCESS_ACTION_ACTIVATE, _access_action_cb, mold); evas_object_data_set(mold->more_option, "_cue_access_object", mold->cue_access_object); } @@ -449,6 +1965,7 @@ eext_more_option_add(Evas_Object *parent) evas_object_event_callback_add(mold->more_option, EVAS_CALLBACK_HIDE, _more_option_hide_cb, NULL); evas_object_event_callback_add(mold->more_option, EVAS_CALLBACK_SHOW, _more_option_show_cb, NULL); + evas_object_smart_callback_add(mold->more_option, SIGNAL_ACTIVATED, _rotary_activated_cb, mold); return mold->more_option; } @@ -458,7 +1975,7 @@ eext_more_option_direction_set(Evas_Object *obj, Eext_More_Option_Direction dire { if (!obj) { - ERR("obj is NULL!!"); + LOGE("obj is NULL!!"); return; } @@ -467,6 +1984,12 @@ eext_more_option_direction_set(Evas_Object *obj, Eext_More_Option_Direction dire if (mold) { elm_panel_orient_set(mold->panel, direction); + //ONEUI1.5(11July2019): Enable product theme when style changes + if (__elm_product_theme_is_loaded()) + { + elm_object_signal_emit(mold->panel, "eext,more,option,enable", "elm"); + } + // mold->direction = direction; } } @@ -476,7 +1999,7 @@ eext_more_option_direction_get(const Evas_Object *obj) { if (!obj) { - ERR("obj is NULL!!"); + LOGE("obj is NULL!!"); return EEXT_MORE_OPTION_DIRECTION_RIGHT; // defalut } @@ -499,12 +2022,13 @@ eext_more_option_item_append(Evas_Object *obj) mold = _more_option_data_get(obj); if (!mold) { - ERR("mold is NULL!!"); + LOGE("mold is NULL!!"); return NULL; } - - item = eext_rotary_selector_item_append(mold->rotary_selector); - + if (__elm_product_theme_is_loaded()) + item = _eext_more_option_genlist_item_append(mold->genlist); + else + item = eext_rotary_selector_item_append(mold->rotary_selector); mold->item_list = eina_list_append(mold->item_list, item); return item; @@ -519,11 +2043,13 @@ eext_more_option_item_prepend(Evas_Object *obj) mold = _more_option_data_get(obj); if (!mold) { - ERR("mold is NULL!!"); + LOGE("mold is NULL!!"); return NULL; } - - item = eext_rotary_selector_item_prepend(mold->rotary_selector); + if (__elm_product_theme_is_loaded()) + item = _eext_more_option_item_prepend(mold->genlist); + else + item = eext_rotary_selector_item_prepend(mold->rotary_selector); mold->item_list = eina_list_prepend(mold->item_list, item); @@ -539,11 +2065,14 @@ eext_more_option_item_insert_after(Evas_Object *obj, Eext_Object_Item *after) mold = _more_option_data_get(obj); if (!mold) { - ERR("mold is NULL!!"); + LOGE("mold is NULL!!"); return NULL; } - item = eext_rotary_selector_item_insert_after(mold->rotary_selector, after); + if (__elm_product_theme_is_loaded()) + item = _eext_more_option_genlist_item_insert_after(mold->genlist, after); + else + item = eext_rotary_selector_item_insert_after(mold->rotary_selector, after); mold->item_list = eina_list_append_relative(mold->item_list, item, after); @@ -559,11 +2088,14 @@ eext_more_option_item_insert_before(Evas_Object *obj, Eext_Object_Item *before) mold = _more_option_data_get(obj); if (!mold) { - ERR("mold is NULL!!"); + LOGE("mold is NULL!!"); return NULL; } - item = eext_rotary_selector_item_insert_before(mold->rotary_selector, before); + if (__elm_product_theme_is_loaded()) + item = _eext_more_option_genlist_item_insert_before(mold->genlist, before); + else + item = eext_rotary_selector_item_insert_before(mold->rotary_selector, before); mold->item_list = eina_list_prepend_relative(mold->item_list, item, before); @@ -577,22 +2109,27 @@ eext_more_option_item_del(Eext_Object_Item *item) Eext_Rotary_Selector_Item *rotary_selector_item = (Eext_Rotary_Selector_Item *)item; if (!rotary_selector_item) { - ERR("rotary_selector_item is NULL!!"); + LOGE("rotary_selector_item is NULL!!"); return; } Eext_More_Option_Data *mold = _more_option_data_get(rotary_selector_item->parent); if (!mold) { - ERR("mold is NULL!!"); + LOGE("mold is NULL!!"); return; } - eext_rotary_selector_item_del(item); - - mold->item_list = eina_list_remove(mold->item_list, item); - - return; + if (__elm_product_theme_is_loaded()) + { + mold->item_list = eina_list_remove(mold->item_list, item); + _eext_more_option_genlist_item_del(item); + } + else + { + eext_rotary_selector_item_del(item); + mold->item_list = eina_list_remove(mold->item_list, item); + } } EAPI void @@ -603,27 +2140,32 @@ eext_more_option_items_clear(Evas_Object *obj) if (!more_option) { - ERR("more_option is NULL!!"); + LOGE("more_option is NULL!!"); return; } mold = _more_option_data_get(more_option); if (!mold) { - ERR("mold is NULL!!"); + LOGE("mold is NULL!!"); return; } - eext_rotary_selector_items_clear(mold->rotary_selector); - mold->item_list = eina_list_free(mold->item_list); + if (__elm_product_theme_is_loaded()) + _eext_more_option_genlist_items_clear(mold->genlist); + else + eext_rotary_selector_items_clear(mold->rotary_selector); - return; + mold->item_list = eina_list_free(mold->item_list); } EAPI void eext_more_option_item_part_text_set(Eext_Object_Item *item, const char *part_name, const char *text) { - eext_rotary_selector_item_part_text_set(item, part_name, text); + if (__elm_product_theme_is_loaded()) + _eext_more_option_genlist_item_part_text_set(item, part_name, text); + else + eext_rotary_selector_item_part_text_set(item, part_name, text); return; } @@ -631,7 +2173,10 @@ eext_more_option_item_part_text_set(Eext_Object_Item *item, const char *part_nam EAPI void eext_more_option_item_domain_translatable_part_text_set(Eext_Object_Item *item, const char *part_name, const char *domain, const char *text) { - eext_rotary_selector_item_domain_translatable_part_text_set(item, part_name, domain, text); + if (__elm_product_theme_is_loaded()) + _eext_more_option_genlist_item_domain_translatable_part_text_set(item, part_name, domain, text); + else + eext_rotary_selector_item_domain_translatable_part_text_set(item, part_name, domain, text); return; } @@ -639,13 +2184,19 @@ eext_more_option_item_domain_translatable_part_text_set(Eext_Object_Item *item, EAPI const char * eext_more_option_item_part_text_get(const Eext_Object_Item *item, const char *part_name) { - return eext_rotary_selector_item_part_text_get(item, part_name); + if (__elm_product_theme_is_loaded()) + return _eext_more_option_genlist_item_part_text_get(item, part_name); + else + return eext_rotary_selector_item_part_text_get(item, part_name); } EAPI void eext_more_option_item_part_content_set(Eext_Object_Item *item, const char *part_name, Evas_Object *content) { - eext_rotary_selector_item_part_content_set(item, part_name, EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL, content); + if (__elm_product_theme_is_loaded()) + _eext_more_option_genlist_item_part_content_set(item, part_name, EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL, content); + else + eext_rotary_selector_item_part_content_set(item, part_name, EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL, content); return; } @@ -653,7 +2204,10 @@ eext_more_option_item_part_content_set(Eext_Object_Item *item, const char *part_ EAPI Evas_Object * eext_more_option_item_part_content_get(const Eext_Object_Item *item, const char *part_name) { - return eext_rotary_selector_item_part_content_get(item, part_name, EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL); + if (__elm_product_theme_is_loaded()) + return _eext_more_option_genlist_item_part_content_get(item, part_name, EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL); + else + return eext_rotary_selector_item_part_content_get(item, part_name, EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL); } EAPI void @@ -661,7 +2215,7 @@ eext_more_option_opened_set(Evas_Object *obj, Eina_Bool opened) { if (!obj) { - ERR("obj is NULL!!"); + LOGE("obj is NULL!!"); return; } @@ -669,8 +2223,43 @@ eext_more_option_opened_set(Evas_Object *obj, Eina_Bool opened) mold = _more_option_data_get(obj); if (mold) { - if (elm_panel_hidden_get(mold->panel) && opened) elm_panel_toggle(mold->panel); - else if (!elm_panel_hidden_get(mold->panel) && !opened) elm_panel_toggle(mold->panel); + if (__elm_product_theme_is_loaded()) + { + //ONEUI1.5(20Jun2019): Add blur timer in case blur idler is not invoked + if (mold->blur_timer) + { + ecore_timer_del(mold->blur_timer); + mold->blur_timer = NULL; + } + if (mold->blur_idler) + { + ecore_idler_del(mold->blur_idler); + mold->blur_idler = NULL; + } + // + //ONEUI1.5(20190424):Avoid panel close by api when panel is not active. + if (!opened && !mold->is_panel_active) return; + // + if (elm_panel_hidden_get(mold->panel) && opened) + { + _eext_more_option_effect_create(mold); + } + else if (!elm_panel_hidden_get(mold->panel) && !opened) + { + LOGI("Panel Status: %d",elm_panel_hidden_get(mold->panel)); + elm_panel_toggle(mold->panel); + } + } + else + { + LOGI("Panel Status: %d",elm_panel_hidden_get(mold->panel)); + if (elm_panel_hidden_get(mold->panel) && opened) + { + eext_rotary_object_event_activated_set(mold->rotary_selector, EINA_TRUE); + elm_panel_toggle(mold->panel); + } + else if (!elm_panel_hidden_get(mold->panel) && !opened) elm_panel_toggle(mold->panel); + } } } @@ -679,7 +2268,7 @@ eext_more_option_opened_get(Evas_Object *obj) { if (!obj) { - ERR("obj is NULL!!"); + LOGE("obj is NULL!!"); return EINA_FALSE; } @@ -701,18 +2290,21 @@ eext_more_option_items_get(const Evas_Object *obj) if (!more_option) { - ERR("more_option is NULL!!"); + LOGE("more_option is NULL!!"); return NULL; } mold = _more_option_data_get(more_option); if (!mold) { - ERR("mold is NULL!!"); + LOGE("mold is NULL!!"); return NULL; } - return eext_rotary_selector_items_get(mold->rotary_selector); + if (__elm_product_theme_is_loaded()) + return _eext_more_option_genlist_items_get(mold->genlist); + else + return eext_rotary_selector_items_get(mold->rotary_selector); } EAPI void @@ -723,18 +2315,21 @@ eext_more_option_editing_enabled_set(Evas_Object *obj, Eina_Bool enabled) if (!more_option) { - ERR("more_option is NULL!!"); + LOGE("more_option is NULL!!"); return; } mold = _more_option_data_get(more_option); if (!mold) { - ERR("mold is NULL!!"); + LOGE("mold is NULL!!"); return; } - eext_rotary_selector_editing_enabled_set(mold->rotary_selector, enabled); + if (__elm_product_theme_is_loaded()) + _eext_more_option_genlist_editing_enabled_set(mold->genlist, enabled); + else + eext_rotary_selector_editing_enabled_set(mold->rotary_selector, enabled); } EAPI Eina_Bool @@ -745,18 +2340,21 @@ eext_more_option_editing_enabled_get(const Evas_Object *obj) if (!more_option) { - ERR("more_option is NULL!!"); + LOGE("more_option is NULL!!"); return EINA_FALSE; } mold = _more_option_data_get(more_option); if (!mold) { - ERR("mold is NULL!!"); + LOGE("mold is NULL!!"); return EINA_FALSE; } - return eext_rotary_selector_editing_enabled_get(mold->rotary_selector); + if (__elm_product_theme_is_loaded()) + return _eext_more_option_genlist_editing_enabled_get(mold->genlist); + else + return eext_rotary_selector_editing_enabled_get(mold->rotary_selector); } EAPI Eina_Bool @@ -767,18 +2365,21 @@ eext_more_option_add_item_enabled_get(const Evas_Object *obj) if (!more_option) { - ERR("more_option is NULL!!"); + LOGE("more_option is NULL!!"); return EINA_FALSE; } mold = _more_option_data_get(more_option); if (!mold) { - ERR("mold is NULL!!"); + LOGE("mold is NULL!!"); return EINA_FALSE; } - return eext_rotary_selector_add_item_enabled_get(mold->rotary_selector); + if (__elm_product_theme_is_loaded()) + return _eext_more_option_genlist_add_item_enabled_get(mold->genlist); + else + return eext_rotary_selector_add_item_enabled_get(mold->rotary_selector); } EAPI void @@ -789,30 +2390,39 @@ eext_more_option_add_item_enabled_set(Evas_Object *obj, Eina_Bool enabled) if (!more_option) { - ERR("more_option is NULL!!"); + LOGE("more_option is NULL!!"); return; } mold = _more_option_data_get(more_option); if (!mold) { - ERR("mold is NULL!!"); + LOGE("mold is NULL!!"); return; } - return eext_rotary_selector_add_item_enabled_set(mold->rotary_selector, enabled); + if (__elm_product_theme_is_loaded()) + return _eext_more_option_genlist_add_item_enabled_set(mold->genlist, enabled); + else + return eext_rotary_selector_add_item_enabled_set(mold->rotary_selector, enabled); } EAPI Eina_Bool eext_more_option_item_delete_enabled_get(const Eext_Object_Item *item) { - return eext_rotary_selector_item_delete_enabled_get(item); + if (__elm_product_theme_is_loaded()) + return _eext_more_option_genlist_item_delete_enabled_get(item); + else + return eext_rotary_selector_item_delete_enabled_get(item); } EAPI void eext_more_option_item_delete_enabled_set(Eext_Object_Item *item, Eina_Bool enabled) { - eext_rotary_selector_item_delete_enabled_set(item, enabled); + if (__elm_product_theme_is_loaded()) + _eext_more_option_genlist_item_delete_enabled_set(item, enabled); + else + eext_rotary_selector_item_delete_enabled_set(item, enabled); } //for accessibility @@ -826,7 +2436,17 @@ _access_action_cb(void *data, Evas_Object *obj, Elm_Access_Action_Info *action_i case ELM_ACCESS_ACTION_ACTIVATE: if (mold) { - elm_panel_toggle(mold->panel); +//ONEUI1.5(12MAR2019): fixed bug(The bezel is not operated when screen-reader is on) + if (__elm_product_theme_is_loaded()) + { + _eext_more_option_effect_create(mold); + } + else + { + eext_rotary_object_event_activated_set(mold->rotary_selector, EINA_TRUE); + elm_panel_toggle(mold->panel); + } +// } break; default: @@ -834,6 +2454,7 @@ _access_action_cb(void *data, Evas_Object *obj, Elm_Access_Action_Info *action_i } return EINA_FALSE; } + static char * _accessibility_name_set_cb(void *data, Evas_Object *obj) { @@ -855,11 +2476,73 @@ _accessibility_panel_name_set_cb(void *data, Evas_Object *obj) static char * _accessibility_panel_description_set_cb(void *data, Evas_Object *obj) { + Eext_More_Option_Data *mold = (Eext_More_Option_Data *)data; char buf[255] = ""; - snprintf(buf, sizeof(buf), _("WDS_TTS_TBBODY_ROTATE_BEZEL_TO_NAVIGATE_ITEMS")); + const Eina_List *list = NULL; + + if (mold) + { + list = _eext_more_option_genlist_items_get(mold->genlist); + if (list && eina_list_count(list) > 1) + { + Eext_Rotary_Event_Type _rotary_event_type = eext_rotary_event_type_get(); + if (_rotary_event_type == EEXT_ROTARY_EVENT_TYPE_HW_BEZEL) + snprintf(buf, sizeof(buf), _("WDS_ACCS_TBBODY_TURN_BEZEL_TO_NAVIGATE_THROUGH_ITEMS")); + else if (_rotary_event_type == EEXT_ROTARY_EVENT_TYPE_SW_BEZEL && eext_rotary_event_is_enabled()) + snprintf(buf, sizeof(buf), _("WDS_ACCS_TBBODY_SWIPE_THE_BEZEL_TO_NAVIGATE_THROUGH_ITEMS")); + else + snprintf(buf, sizeof(buf), _("WDS_ACCS_TBBODY_SWIPE_RIGHT_FOR_NEXT_ITEM")); + } + } return strdup(buf); } +//ONEUI1.5(2019Feb28): Read button name and description instead of genlist item +static char * +_accessibility_item_name_cb(void *data, Evas_Object *obj) +{ + char *ret; + Eina_Strbuf *buf; + Eext_Rotary_Selector_Item* item = data; + const char *btn_name = NULL; + + btn_name = elm_atspi_accessible_name_get(item->dummy_button); + if (!btn_name) return NULL; + + buf = eina_strbuf_new(); + eina_strbuf_append(buf, btn_name); + + ret = eina_strbuf_string_steal(buf); + eina_strbuf_free(buf); + return strdup(ret); +} + +static char * +_accessibility_item_description_cb(void *data, Evas_Object *obj) +{ + char *ret; + Eina_Strbuf *buf; + Eext_Rotary_Selector_Item* item = data; + const char *btn_desc = NULL; + + btn_desc = elm_atspi_accessible_description_get(item->dummy_button); + if (!btn_desc) return NULL; + + buf = eina_strbuf_new(); + eina_strbuf_append(buf, btn_desc); + + ret = eina_strbuf_string_steal(buf); + eina_strbuf_free(buf); + return strdup(ret); +} + +static void +_set_item_access_info(Eext_Rotary_Selector_Item* item) +{ + elm_atspi_accessible_name_cb_set(item->item, _accessibility_item_name_cb, item); + elm_atspi_accessible_description_cb_set(item->item, _accessibility_item_description_cb, item); +} +// // void @@ -881,7 +2564,7 @@ _eext_more_option_color_class_parent_set(Evas_Object *obj, Evas_Object *parent) if (!edje || !parent_edje) { - ERR("There is a missing edje to have color class relationship... edje[%p], parent_edje[%p]", edje, parent_edje); + LOGE("There is a missing edje to have color class relationship... edje[%p], parent_edje[%p]", edje, parent_edje); return; } diff --git a/src/wearable/efl_extension_panel.c b/src/wearable/efl_extension_panel.c index b4fa994..2143af3 100644 --- a/src/wearable/efl_extension_panel.c +++ b/src/wearable/efl_extension_panel.c @@ -20,7 +20,13 @@ #include "wearable/efl_extension_common_private.h" #define EEXT_PANEL_DATA_KEY "eext_panel_data" +//ONEUI1.5(13MAR2019): Support for scrollbar show timing +#define OBJECT_SHOW_HIDE_KEY "object_show_hide" +#define OBJECT_SHOW_INTERNAL "object,show,internal" +#define OBJECT_HIDE_INTERNAL "object,hide,internal" +// +#define MAXALPHA 229 //90% of 255 static Eext_Panel_Data * _eext_panel_data_init(Evas_Object *obj, Evas_Object *parent) @@ -31,7 +37,7 @@ _eext_panel_data_init(Evas_Object *obj, Evas_Object *parent) if (!pd) { - ERR("pd is NULL!!"); + LOGE("pd is NULL!!"); return NULL; } @@ -49,7 +55,7 @@ _eext_panel_data_get(const Evas_Object *eext_panel) { if (!eext_panel) { - ERR("eext_panel is NULL!!"); + LOGE("eext_panel is NULL!!"); return NULL; } @@ -61,13 +67,29 @@ _panel_hide_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_U { if (!obj) { - ERR("panel is NULL!!"); + LOGE("panel is NULL!!"); return; } if (!elm_panel_hidden_get(obj)) elm_panel_toggle(obj); } +//ONEUI1.5(13MAR2019): Support for scrollbar show timing +static void +_panel_active_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Eext_Panel_Data *pd = data; + evas_object_smart_callback_call(pd->layout, OBJECT_SHOW_INTERNAL, pd->assist_panel); +} + +static void +_panel_inactive_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Eext_Panel_Data *pd = data; + evas_object_smart_callback_call(pd->layout, OBJECT_HIDE_INTERNAL, pd->assist_panel); +} +// + static void _panel_unhold_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { @@ -141,14 +163,35 @@ _panel_hold_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_U evas_object_smart_callback_call(pd->eext_panel, "assist,panel,hidden", NULL); } +static void +_cue_start_animation_cb(void *data, Evas_Object *obj, const char *emission, const char *source) +{ + Eext_Panel_Data *pd = data; + elm_layout_signal_emit(pd->primary_panel, "elm,state,panel,start,animation", "elm"); +} + +static void +_cue_stop_animation_cb(void *data, Evas_Object *obj, const char *emission, const char *source) +{ + Eext_Panel_Data *pd = data; + elm_layout_signal_emit(pd->primary_panel, "elm,state,panel,stop,animation", "elm"); +} + static void _panel_scroll_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info) { Eext_Panel_Data *pd = data; Elm_Panel_Scroll_Info *ev = event_info; + double pos = ev->rel_y; + + if (ev->rel_y < pd->prev_rel_y) + { + double cubic_bezier_v[] = {0.47, 0.0, 0.745, 0.715}; + pos = ecore_animator_pos_map_n(pos, ECORE_POS_MAP_CUBIC_BEZIER, 4, cubic_bezier_v); + } - int col = 229 * ev->rel_y; - evas_object_color_set(pd->panel_bg, 0, 0, 0, col); + int alpha = MAXALPHA * pos; + evas_object_color_set(pd->panel_bg, 0, 0, 0, alpha); } static void @@ -174,6 +217,18 @@ _eext_panel_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) { Eext_Panel_Data *pd = data; + elm_object_signal_callback_del(pd->assist_panel, "elm,state,unhold", "elm", (Edje_Signal_Cb)_panel_unhold_cb); + elm_object_signal_callback_del(pd->assist_panel, "elm,state,hold", "elm", (Edje_Signal_Cb)_panel_hold_cb); + //ONEUI1.5(13MAR2019): Support for scrollbar show timing + elm_object_signal_callback_del(pd->assist_panel, "elm,state,active", "elm", (Edje_Signal_Cb)_panel_active_cb); + elm_object_signal_callback_del(pd->assist_panel, "elm,state,inactive", "elm", (Edje_Signal_Cb)_panel_inactive_cb); + // + elm_layout_signal_callback_del(obj, "cue,start_animation", "ext", _cue_start_animation_cb); + elm_layout_signal_callback_del(obj, "cue,stop_animation", "ext", _cue_stop_animation_cb); + evas_object_smart_callback_del(pd->assist_panel, "scroll", _panel_scroll_cb); + evas_object_event_callback_del(pd->assist_panel, EVAS_CALLBACK_MOUSE_UP, _panel_mouse_up_cb); + evas_object_event_callback_del(pd->assist_panel, EVAS_CALLBACK_MOUSE_DOWN, _panel_mouse_down_cb); + free(pd); } @@ -190,7 +245,7 @@ eext_panel_add(Evas_Object *parent) layout = elm_layout_add(parent); if (!layout) { - ERR("eext_panel is NULL!!"); + LOGE("eext_panel is NULL!!"); return NULL; } @@ -206,7 +261,7 @@ eext_panel_add(Evas_Object *parent) ret = elm_layout_theme_set(layout, "layout", "drawer", "panel"); if (!ret) { - ERR("Failed to set theme!!"); + LOGE("Failed to set theme!!"); evas_object_del(layout); free(pd); return NULL; @@ -215,7 +270,7 @@ eext_panel_add(Evas_Object *parent) primary_ly = elm_layout_add(layout); if (!primary_ly) { - ERR("Primary layout is NULL!!"); + LOGE("Primary layout is NULL!!"); evas_object_del(layout); free(pd); return NULL; @@ -224,7 +279,7 @@ eext_panel_add(Evas_Object *parent) ret = elm_layout_theme_set(primary_ly, "layout", "panel", "primary"); if (!ret) { - ERR("Failed to set primary layout theme!!"); + LOGE("Failed to set primary layout theme!!"); evas_object_del(primary_ly); evas_object_del(layout); free(pd); @@ -239,7 +294,7 @@ eext_panel_add(Evas_Object *parent) panel = elm_panel_add(layout); if (!panel) { - ERR("Assist panel is NULL!!"); + LOGE("Assist panel is NULL!!"); evas_object_del(primary_ly); evas_object_del(layout); free(pd); @@ -253,15 +308,30 @@ eext_panel_add(Evas_Object *parent) elm_object_part_content_set(layout, "elm.swallow.right", panel); pd->assist_panel = panel; + pd->layout = layout; pd->panel_bg = evas_object_rectangle_add(evas_object_evas_get(layout)); evas_object_color_set(pd->panel_bg, 0, 0, 0, 0); elm_object_part_content_set(layout, "elm.swallow.bg", pd->panel_bg); + //ONEUI1.5(13MAR2019): Support for scrollbar show timing + evas_object_data_set(layout, OBJECT_SHOW_HIDE_KEY, pd->assist_panel); + // + elm_object_signal_callback_add(panel, "elm,state,unhold", "elm", (Edje_Signal_Cb)_panel_unhold_cb, pd); elm_object_signal_callback_add(panel, "elm,state,hold", "elm", (Edje_Signal_Cb)_panel_hold_cb, pd); + //ONEUI1.5(13MAR2019): Support for scrollbar show timing + elm_object_signal_callback_add(panel, "elm,state,active", "elm", + (Edje_Signal_Cb)_panel_active_cb, pd); + elm_object_signal_callback_add(panel, "elm,state,inactive", "elm", + (Edje_Signal_Cb)_panel_inactive_cb, pd); + // + elm_layout_signal_callback_add(layout, "cue,start_animation", "ext", + _cue_start_animation_cb, pd); + elm_layout_signal_callback_add(layout, "cue,stop_animation", "ext", + _cue_stop_animation_cb, pd); evas_object_smart_callback_add(panel, "scroll", _panel_scroll_cb, pd); evas_object_event_callback_add(panel, EVAS_CALLBACK_MOUSE_UP, _panel_mouse_up_cb, pd); @@ -281,24 +351,24 @@ eext_panel_part_content_set(Evas_Object *obj, const char *part_name, if (!obj) { - ERR("obj is NULL!!"); + LOGE("obj is NULL!!"); return; } if (!part_name) { - ERR("part_name is NULL!!"); + LOGE("part_name is NULL!!"); return; } if (!content) { - ERR("content is NULL!!"); + LOGE("content is NULL!!"); return; } pd = _eext_panel_data_get(obj); if (!pd) { - ERR("pd is NULL!!"); + LOGE("pd is NULL!!"); return; } @@ -313,7 +383,7 @@ eext_panel_part_content_set(Evas_Object *obj, const char *part_name, } else { - ERR("Not supported part name!!!"); + LOGE("Not supported part name!!!"); return; } } @@ -325,19 +395,19 @@ eext_panel_part_content_get(const Evas_Object *obj, const char *part_name) if (!obj) { - ERR("obj is NULL!!"); + LOGE("obj is NULL!!"); return NULL; } if (!part_name) { - ERR("part_name is NULL!!"); + LOGE("part_name is NULL!!"); return NULL; } pd = _eext_panel_data_get(obj); if (!pd) { - ERR("pd is NULL!!"); + LOGE("pd is NULL!!"); return NULL; } @@ -352,7 +422,7 @@ eext_panel_part_content_get(const Evas_Object *obj, const char *part_name) } else { - ERR("Not supported part name!!!"); + LOGE("Not supported part name!!!"); return NULL; } } diff --git a/src/wearable/efl_extension_rotary_selector.c b/src/wearable/efl_extension_rotary_selector.c index cb3a01a..f8cce25 100644 --- a/src/wearable/efl_extension_rotary_selector.c +++ b/src/wearable/efl_extension_rotary_selector.c @@ -48,11 +48,15 @@ #define _ROTARY_SELECTOR_ROTARY_EVENT_RESET_TIME 500 #define _ROTARY_SELECTOR_ROTARY_EVENT_TIME_ACCELERATION_THRESHOLD 60 -#define _ROTARY_SELECTOR_ITEM_DRAG_PAGE_ANIMATOIN_DELAY_TIME 0.1 -#define _ROTARY_SELECTOR_ITEM_LONGPRESS_MOVE_ANIMATOIN_DELAY_TIME 0.3 - +//ONEUI1.5(18Jun2018): Adjust drag iem size as per GUI #define _ROTARY_SELECTOR_DRAG_ITEM_WIDTH 80 #define _ROTARY_SELECTOR_DRAG_ITEM_HEIGHT 80 +// +//ONEUI1.5(04Jun2018) : Delay for item animatoin +#define _ROTARY_SELECTOR_ITEM_SWAP_ANIMATOIN_DELAY_TIME 0.1 +#define _ROTARY_SELECTOR_ITEM_DRAG_PAGE_ANIMATOIN_DELAY_TIME 0.2 +#define _ROTARY_SELECTOR_ITEM_LONGPRESS_MOVE_ANIMATOIN_DELAY_TIME 0.3 +// #define _ROTARY_SELECTOR_DEBUG_ENABLED 0 // ====================================== util ==================================== // @@ -86,6 +90,10 @@ if (a) *a = obj->part.state.a; \ } while (0) +// ONEUI1.5(20180607) - v2.4 ROTARY SELECTOR UI +#define ITEM_SIGNAL_BUF_SIZE 32 +char stylenumber[11][3] = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10"}; +// void _eext_rotary_selector_color_class_parent_set(Evas_Object *obj, Evas_Object *parent); static double @@ -213,6 +221,11 @@ static void _layer_items_invalidate(Eext_Rotary_Selector_Data *rsd); static void _item_rearrange(Eext_Rotary_Selector_Data *rsd, int selected_index); static void _item_select(Eext_Rotary_Selector_Data *rsd, int index); static void _item_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); + +//ONEUI1.5(20Jun2017): Add next/prev icons for product style. +static void _product_style_check(Eext_Rotary_Selector_Data *rsd); +static Evas_Object *_product_layer_icon_create(Eext_Rotary_Selector_Data *rsd, const char* style); + static Eext_Rotary_Selector_Item *_item_create(Eext_Rotary_Selector_Data *rsd, Eext_Rotary_Selector_Item_Type item_type); static void _item_selected_signal_send(Eext_Rotary_Selector_Data *rsd, int previous_item_index, int current_item_index); static void _item_touched_signal_send(Eext_Rotary_Selector_Data *rsd, int index, Eina_Bool pressed, Eina_Bool sound); @@ -242,13 +255,19 @@ static Eina_Bool _content_update_timer_cb(void *data); // ----------------------------------------- Accessibility API --------------------------------------// static void _accessibility_item_btn_highlighted_cb(void *data, Evas_Object *obj, void *event_info); +//ONEUI1.5(20180709): On double tap and hold, mouse down, up are sent in access mode +static void _accessibility_theme_changed_cb(void *data, Evas_Object *obj, void *event_info); +// +static char *_accessibility_item_name_set_cb(void *data, Evas_Object *obj); static void _accessibility_item_name_set(Eext_Rotary_Selector_Data *rsd, Eext_Rotary_Selector_Item *it); static void _accessibility_item_chain_end_set(Eext_Rotary_Selector_Data *rsd); static void _rotary_selector_moreoption_opened_cb(void *data, Evas_Object *obj, void *event_info); -static void _accessibility_item_btn_clicked_cb(void *data, Evas_Object *obj, void *event_info); +void *elm_object_accessibility_currently_highlighted_get(void); static void _rotary_selector_screen_reader_changed(void *data, Evas_Object *obj, void *event_info); static void _accessibility_rotary_selector_item_relationship_set(Evas_Object* obj, Evas_Object* after_obj); -static Eina_Bool _accessibility_item_gesutre_cb(void *data, Elm_Atspi_Gesture_Info gesture_info, Evas_Object *obj); +static Eina_Bool _accessibility_item_gesture_cb(void *data, Elm_Atspi_Gesture_Info gesture_info, Evas_Object *obj); +static void _accessibility_rotary_highlighted_cb(void *data, Evas_Object *obj, void *event_info); +static void _accessibility_rotary_unhighlighted_cb(void *data, Evas_Object *obj, void *event_info); // ----------------------------------------- event area API --------------------------------------// @@ -261,28 +280,63 @@ _delete_icon_mouse_on_check(Eext_Rotary_Selector_Data *rsd, int idx, Evas_Coord Eina_Rectangle *rect = NULL; item = eina_list_nth(rsd->item_list, idx); + //ONEUI1.5(09Jul2018):More safety for delete case if (!item) { - ERR("item is NULL"); + LOGE("item is NULL"); return EINA_FALSE; } + // if (!item->delete_enabled) return EINA_FALSE; idx = idx - rsd->current_page * _ROTARY_SELECTOR_PAGE_ITEM_MAX; evas_object_geometry_get(item->base.obj, &x, &y, &w, &h); - if (idx < _ROTARY_SELECTOR_PAGE_ITEM_MAX / 2) - { - rect = eina_rectangle_new(x, y, rsd->delete_icon_width, rsd->delete_icon_height); + //ONEUI1.5(20180620):delete_icon area r0~r10 + switch (idx) + { + case 0: + rect = eina_rectangle_new(x + 1, y + 32, rsd->delete_icon_width, rsd->delete_icon_height); + break; + case 1: + rect = eina_rectangle_new(x - 7, y + 23, rsd->delete_icon_width, rsd->delete_icon_height); + break; + case 2: + rect = eina_rectangle_new(x - 10, y + 12, rsd->delete_icon_width, rsd->delete_icon_height); + break; + case 3: + rect = eina_rectangle_new(x - 7, y + 2, rsd->delete_icon_width, rsd->delete_icon_height); + break; + case 4: + rect = eina_rectangle_new(x + 1, y - 5, rsd->delete_icon_width, rsd->delete_icon_height); + break; + case 5: + rect = eina_rectangle_new(x + 12, y - 9, rsd->delete_icon_width, rsd->delete_icon_height); + break; + case 6: + rect = eina_rectangle_new(x + 23, y - 5, rsd->delete_icon_width, rsd->delete_icon_height); + break; + case 7: + rect = eina_rectangle_new(x + 31, y + 2, rsd->delete_icon_width, rsd->delete_icon_height); + break; + case 8: + rect = eina_rectangle_new(x + 34, y + 12, rsd->delete_icon_width, rsd->delete_icon_height); + break; + case 9: + rect = eina_rectangle_new(x + 31, y + 23, rsd->delete_icon_width, rsd->delete_icon_height); + break; + case 10: + rect = eina_rectangle_new(x + 23, y + 32, rsd->delete_icon_width, rsd->delete_icon_height); + break; } - else + // + + if (rect) { - rect = eina_rectangle_new(x + w - rsd->delete_icon_width, y, - rsd->delete_icon_width, rsd->delete_icon_height); - } - inside = eina_rectangle_coords_inside(rect, px, py); + inside = eina_rectangle_coords_inside(rect, px, py); - eina_rectangle_free(rect); + eina_rectangle_free(rect); + } return inside; } @@ -291,6 +345,13 @@ static void _no_items_show(Eext_Rotary_Selector_Data *rsd) { Evas_Object *bg; + + //ONEUI1.5(11Apr2018) : Apply workaround for app launch time issue + if (!rsd->edit_mode_enabled) + { + return; + } + //FIXME: translation elm_object_part_text_set(elm_object_part_content_get(rsd->rotary_selector, "content"), "selector,main_text", _("No items")); @@ -372,7 +433,16 @@ _del_item_move_animator_cb(void *data) { _no_items_show(rsd); } + //ONEUI1.5(20180822): Case of setting add_item enabled while animation + evas_object_smart_callback_call(rsd->rotary_selector, "item,deleted", (void*)rsd->del_item); + if (rsd->del_item) + { + evas_object_del(rsd->del_item->base.obj); + } + // + //ONEUI1.5(20180611): Disable edit mode deletion during item rearrange animation rsd->del_item_move_animator = NULL; + // return ECORE_CALLBACK_CANCEL; } @@ -385,6 +455,52 @@ _del_item_timer_cb(void *data) Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data; rsd->item_del_timer = NULL; + //ONEUI1.5(20180621):Synchronized Item and delete icon + Eina_List *l; + Eext_Rotary_Selector_Item *item; + int i = 0; + int idx1 = 0, idx2 = 0; + int last_index = 0; + idx1 = rsd->del_item_index; + + last_index = (rsd->current_page + 1) * _ROTARY_SELECTOR_PAGE_ITEM_MAX - 1; + int item_no = eina_list_count(rsd->item_list); + if (last_index < item_no) + { + idx2 = last_index; + } + else + { + idx2 = item_no; + } + EINA_LIST_FOREACH(rsd->item_list, l, item) + { + if (i >= idx1 && i <= idx2) + { + Evas_Object *button; + button = item->base.obj; + char style[ITEM_SIGNAL_BUF_SIZE]="elm,selector,delete,r"; + + if (rsd->editing && item->delete_enabled && rsd->drag_done && i != idx2) + { + int style_number = item->index % _ROTARY_SELECTOR_PAGE_ITEM_MAX - 1; + //ONEUI1.5(20181224): SVACE #3665 fix + strncat(style, stylenumber[style_number], 3); + // + elm_object_signal_emit(button, style, "elm"); + } + else if (rsd->editing && item->delete_enabled && rsd->drag_done && i == idx2) + { + int style_number = _ROTARY_SELECTOR_PAGE_ITEM_MAX - 1; + //ONEUI1.5(20181224): SVACE #3665 fix + strncat(style, stylenumber[style_number], 3); + // + elm_object_signal_emit(button, style, "elm"); + } + } + i++; + } + // rsd->del_item_move_animator = ecore_animator_add(_del_item_move_animator_cb, rsd); return ECORE_CALLBACK_CANCEL; @@ -393,6 +509,7 @@ _del_item_timer_cb(void *data) static void _delete_item(Eext_Rotary_Selector_Data *rsd, Eext_Rotary_Selector_Item *it) { + //ONEUI1.5(20180611): Disable edit mode deletion during item rearrange animation if (rsd->item_del_timer || rsd->del_item_move_animator) { return; @@ -406,12 +523,26 @@ _delete_item(Eext_Rotary_Selector_Data *rsd, Eext_Rotary_Selector_Item *it) rsd->del_item_index = rsd->pressed_item_index; rsd->item_move_started = EINA_TRUE; - evas_object_smart_callback_call(rsd->rotary_selector, "item,deleted", (void*)rsd->del_item); + //ONEUI1.5(20180611): Edit mode screen reader support + if (elm_atspi_bridge_utils_is_screen_reader_enabled()) + { + //Edit mode screen reader deletion case + rsd->del_item_index = rsd->selected_index; + + elm_atspi_bridge_utils_say(_("WDS_ACCS_TBBODY_ITEM_REMOVED"), EINA_FALSE, NULL, NULL); + } + // if (rsd->del_item) { - evas_object_del(rsd->del_item->base.obj); + //ONEUI1.5(20180822): Case of setting add_item enabled while animation + evas_object_hide(rsd->del_item->base.obj); + // + //ONEUI1.5(20180620):Release pressed delete icon rsd->pressed_item_index = _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_INVALID; + // + //ONEUI1.5 (20180625): Reset drop_item_index rsd->drop_item_index = _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_INVALID; + // } if (rsd->item_del_timer) @@ -419,6 +550,7 @@ _delete_item(Eext_Rotary_Selector_Data *rsd, Eext_Rotary_Selector_Item *it) rsd->item_del_timer = ecore_timer_add(_ROTARY_SELECTOR_DEL_ANIMATION_DURATION, _del_item_timer_cb, rsd); } +//ONEUI1.5(20180608): Add gesture swipe support static Evas_Event_Flags _on_flick_end_cb(void *data, void *event_info) { @@ -476,6 +608,7 @@ _on_flick_end_cb(void *data, void *event_info) } return EVAS_EVENT_FLAG_ON_HOLD; } +// static void _dnd_end(Eext_Rotary_Selector_Data *data) @@ -483,10 +616,10 @@ _dnd_end(Eext_Rotary_Selector_Data *data) Eext_Rotary_Selector_Data *rsd = data; rsd->drag_done = EINA_TRUE; - + //ONEUI1.5(201806012) : Support gesture ux elm_gesture_layer_cb_set(rsd->gesture_layer, ELM_GESTURE_N_FLICKS, ELM_GESTURE_STATE_END, _on_flick_end_cb, rsd); - + // if (rsd->stand_timer) { ecore_timer_del(rsd->stand_timer); @@ -530,8 +663,6 @@ _dnd_end(Eext_Rotary_Selector_Data *data) //add back if (rsd->drag_item) { - Eext_Rotary_Selector_Item *tmp_item; - evas_object_del(rsd->drag_obj); rsd->item_list = eina_list_prepend_relative(rsd->item_list, rsd->drag_item, rsd->tmp_drag_item); rsd->item_list = eina_list_remove(rsd->item_list, rsd->tmp_drag_item); @@ -548,16 +679,55 @@ _dnd_end(Eext_Rotary_Selector_Data *data) } else { - ERR("drag item is NULL"); + LOGE("drag item is NULL"); } } if (rsd->drag_item) { + //ONEUI1.5(20180629): on reorder, update flow + if (elm_atspi_bridge_utils_is_screen_reader_enabled()) + { + int index = 0; + int first_index = rsd->current_page * _ROTARY_SELECTOR_PAGE_ITEM_MAX; + int last_index = (rsd->current_page + 1) * _ROTARY_SELECTOR_PAGE_ITEM_MAX - 1; + if (rsd->drop_item_index < 0) + index = rsd->drag_item_index; + else + index = rsd->drop_item_index; + Eext_Rotary_Selector_Item *prev_item = eina_list_nth(rsd->item_list, index - 1); + Eext_Rotary_Selector_Item *next_item = eina_list_nth(rsd->item_list, index + 1); + if (prev_item) + _accessibility_rotary_selector_item_relationship_set(prev_item->base.obj, rsd->drag_item->base.obj); + if (next_item) + _accessibility_rotary_selector_item_relationship_set(rsd->drag_item->base.obj, next_item->base.obj); + if (!prev_item) + { + elm_atspi_accessible_relationship_append(rsd->rotary_selector, ELM_ATSPI_RELATION_FLOWS_TO, rsd->drag_item->base.obj); + elm_atspi_accessible_relationship_append(rsd->drag_item->base.obj, ELM_ATSPI_RELATION_FLOWS_FROM, rsd->drag_item->base.obj); + } + else if (!next_item) + elm_atspi_accessible_relationship_append(rsd->drag_item->base.obj, ELM_ATSPI_RELATION_FLOWS_TO, rsd->drag_item->base.obj); + + if (index >= first_index && index <= last_index) + elm_atspi_component_highlight_grab(rsd->drag_item->base.obj); + _accessibility_item_chain_end_set(rsd); + } + // evas_object_smart_callback_call(rsd->rotary_selector, "item,reordered", (void*)rsd->drag_item); rsd->drag_item = NULL; + //ONEUI1.5(20180625): Reset drop_item_index + rsd->drop_item_index = _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_INVALID; + // + //ONEUI1.5(20180612): Edit mode screen reader support + if (elm_atspi_bridge_utils_is_screen_reader_enabled()) + { + elm_atspi_bridge_utils_say(_("WDS_ACCS_TBBODY_ITEM_MOVED"), EINA_FALSE, NULL, NULL); + } + // } } +// static Eina_Bool _page_move(void *data) @@ -694,9 +864,22 @@ _drag_item_move_animator_cb(void *data) _items_transformation_update(rsd); _items_invalidate(rsd); rsd->drag_item_index = eina_list_data_idx(rsd->item_list, rsd->tmp_drag_item); + rsd->is_item_animating = EINA_FALSE; rsd->is_item_animating = EINA_FALSE; + //ONEUI1.5(20180612): Edit mode screen reader support + if (elm_atspi_bridge_utils_is_screen_reader_enabled()) + { + char buf_slot[255]; + int drag_slot = rsd->drop_item_index + 1; + int total_slots = eina_list_count(rsd->item_list); + if (rsd->add_item) total_slots = total_slots - 1; + char *str = _("WDS_ACCS_TBOPT_SLOT_P1SD_OF_P2SD"); + snprintf(buf_slot, sizeof(buf_slot)-1, str, drag_slot, total_slots); + elm_atspi_bridge_utils_say(buf_slot, EINA_TRUE, NULL, NULL); + } + // return ECORE_CALLBACK_CANCEL; } @@ -739,11 +922,11 @@ _dnd_pos(Eext_Rotary_Selector_Data *data, Evas_Coord x, Evas_Coord y) const double center_x = _ROTARY_SELECTOR_SCREEN_WIDTH / 2.0f; const double center_y = _ROTARY_SELECTOR_SCREEN_HEIGHT / 2.0f; + rsd->drop_item_index = _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_INVALID; int point = sqrt(pow(center_x - x, 2) + pow(center_y - y, 2)); if ((point > _ROTARY_SELECTOR_SELECTOR_TOUCH_AREA_WIDTH / 2) && (!rsd->page_anim_on_going)) { - rsd->drop_item_index = _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_INVALID; double angle = _mouse_event_angle_get(x, y); if (angle < 20.f) { @@ -815,14 +998,13 @@ _image_create_icon(Eext_Rotary_Selector_Data *data) { Eext_Rotary_Selector_Data *rsd = data; Eext_Rotary_Selector_Item *item, *tmp_item; - int start_idx; const char *file, *group; Evas_Object *clone_img = NULL; Evas_Object *icon, *item_icon, *action_bg; if (!rsd) { - ERR("failed"); + LOGE("failed"); return NULL; } @@ -836,6 +1018,24 @@ _image_create_icon(Eext_Rotary_Selector_Data *data) item = eina_list_nth(rsd->item_list, rsd->pressed_item_index); rsd->drag_item = item; tmp_item->index = item->index; + + //ONEUI1.5(20180629): on reorder, update flow + if (elm_atspi_bridge_utils_is_screen_reader_enabled()) + { + Eext_Rotary_Selector_Item *before_item = eina_list_nth(rsd->item_list, item->index - 1); + Eext_Rotary_Selector_Item *after_item = eina_list_nth(rsd->item_list, item->index + 1); + if (before_item && after_item) + _accessibility_rotary_selector_item_relationship_set(before_item->base.obj, after_item->base.obj); + else if (!before_item && after_item) + { + elm_atspi_accessible_relationship_append(rsd->rotary_selector, ELM_ATSPI_RELATION_FLOWS_TO, after_item->base.obj); + elm_atspi_accessible_relationship_append(after_item->base.obj, ELM_ATSPI_RELATION_FLOWS_FROM, after_item->base.obj); + } + else if (before_item && !after_item) + elm_atspi_accessible_relationship_append(before_item->base.obj, ELM_ATSPI_RELATION_FLOWS_TO, before_item->base.obj); + _accessibility_item_chain_end_set(rsd); + } + // rsd->item_list = eina_list_prepend_relative(rsd->item_list, tmp_item, item); rsd->item_list = eina_list_remove(rsd->item_list, item); @@ -853,20 +1053,22 @@ _image_create_icon(Eext_Rotary_Selector_Data *data) evas_object_show(action_bg); elm_object_part_content_set(icon, "item,bg_image", action_bg); _eext_rotary_selector_color_class_parent_set(action_bg, rsd->rotary_selector); - - start_idx = rsd->current_page * _ROTARY_SELECTOR_PAGE_ITEM_MAX; + //ONEUI1.5(20180705):show highlight for item when drag it + if (elm_atspi_bridge_utils_is_screen_reader_enabled()) + elm_object_signal_emit(icon, "elm,action,access_highlight,show", "elm"); + // tmp_item->delete_enabled = EINA_FALSE; - if (item->delete_enabled) - { - if (item->index >= start_idx && - item->index < start_idx + _ROTARY_SELECTOR_PAGE_ITEM_MAX / 2 ) - { - elm_object_signal_emit(icon, "elm,selector,delete,left", "elm"); - } - else - { - elm_object_signal_emit(icon, "elm,selector,delete,right", "elm"); - } + //ONEUI1.5(20180611) : Hide delete icon while dnd + if (item->delete_enabled && rsd->drag_done) + { + // ONEUI1.5(20180607) - v2.4 ROTARY SELECTOR UI + char style[ITEM_SIGNAL_BUF_SIZE]="elm,selector,delete,r"; + int style_number = item->index % 11; + //ONEUI1.5(20181224): SVACE #3665 fix + strncat(style, stylenumber[style_number], 3); + // + elm_object_signal_emit(icon, style, "elm"); + // } else { @@ -884,10 +1086,13 @@ _image_create_icon(Eext_Rotary_Selector_Data *data) } else { - ERR("Cannot get image file path. Item icon only supports elm image"); + LOGE("Cannot get image file path. Item icon only supports elm image"); } elm_object_part_content_set(icon, "item,icon", clone_img); elm_object_signal_emit(icon, "elm,action,button,longpressed", ""); + //ONEUI1.5 (20180612) Set delete_icon state to hide + elm_object_signal_emit(item->base.obj, "elm,selector,delete,hide", "elm"); + // evas_object_hide(item->base.obj); _item_rearrange(rsd, rsd->selected_index); @@ -898,36 +1103,6 @@ _image_create_icon(Eext_Rotary_Selector_Data *data) return icon; } -static void -_drag_done(Eext_Rotary_Selector_Data *data) -{ - Eext_Rotary_Selector_Data *rsd = data; - //there was no dnd pos, leave, done at drop side - //add back item - if (rsd->drag_item && rsd->tmp_drag_item) - { - Eext_Rotary_Selector_Item *tmp_item; - - rsd->item_list = eina_list_prepend_relative(rsd->item_list, rsd->drag_item, rsd->tmp_drag_item); - rsd->item_list = eina_list_remove(rsd->item_list, rsd->tmp_drag_item); - - evas_object_show(rsd->drag_item->base.obj); - - _item_rearrange(rsd, rsd->selected_index); - _items_transformation_update(rsd); - _items_invalidate(rsd); - _item_update_animation_run(rsd); - //delete tmp_item - evas_object_del(rsd->tmp_drag_item->base.obj); - rsd->drag_item = NULL; - rsd->tmp_drag_item = NULL; - } - else - { - ERR("drag item is NULL"); - } -} - static Eina_Bool _item_longpress_cb(void *data) { @@ -935,14 +1110,19 @@ _item_longpress_cb(void *data) rsd->on_delete_icon = EINA_FALSE; rsd->drag_done = EINA_FALSE; - + //ONEUI1.5 (20180612) : Support gesture UX elm_gesture_layer_cb_del(rsd->gesture_layer, ELM_GESTURE_N_FLICKS, ELM_GESTURE_STATE_END, _on_flick_end_cb, rsd); - + // _image_create_icon(rsd); rsd->longpress_timer = NULL; - + //ONEUI1.5(20180612): Edit mode screen reader support + if (elm_atspi_bridge_utils_is_screen_reader_enabled()) + { + elm_atspi_bridge_utils_say(_("WDS_ACCS_TBBODY_DRAG_ITEM_TO_REORDER"), EINA_FALSE, NULL, NULL); + } + // return ECORE_CALLBACK_CANCEL; } @@ -958,7 +1138,7 @@ _event_area_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_inf rsd->drag_pos_y = -1; if (rsd->previous_page_animator || rsd->next_page_animator || rsd->end_effect_animator) { - INF("animator is running!!"); + LOGI("animator is running!!"); return; } rsd->pressed = EINA_TRUE; @@ -968,7 +1148,7 @@ _event_area_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_inf { double angle = _mouse_event_angle_get(ev->canvas.x, ev->canvas.y); #if _ROTARY_SELECTOR_DEBUG_ENABLED - INF("OUTSIDE OF SELECTOR : angle : %f", angle); + LOGI("OUTSIDE OF SELECTOR : angle : %f", angle); #endif int new_index = 0; @@ -1039,7 +1219,9 @@ _event_area_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_inf if (!rsd->add_enabled || (new_index != add_idx)) { rsd->drag_item_index = new_index; + //ONEUI1.5(20180622): Sometimes _dnd_pos is not called rsd->drop_item_index = new_index; + // rsd->longpress_timer = ecore_timer_add(rsd->item_longpress_move_delay_time, _item_longpress_cb, rsd); } @@ -1050,7 +1232,7 @@ _event_area_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_inf } } #if _ROTARY_SELECTOR_DEBUG_ENABLED - INF("pressed_item_index : %d", rsd->pressed_item_index); + LOGI("pressed_item_index : %d", rsd->pressed_item_index); #endif } } @@ -1059,8 +1241,6 @@ _event_area_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_inf static void _event_area_mouse_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) { - const double center_x = _ROTARY_SELECTOR_SCREEN_WIDTH/2.0f; - const double center_y = _ROTARY_SELECTOR_SCREEN_HEIGHT/2.0f; Evas_Event_Mouse_Move *ev = event_info; Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data; @@ -1114,13 +1294,12 @@ _event_area_mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) rsd->touched_item_changed = EINA_FALSE; rsd->pressed_item_index = _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_INVALID; _dnd_end(rsd); - _drag_done(rsd); return; } if (rsd->previous_page_animator || rsd->next_page_animator || rsd->end_effect_animator) { - INF("animator is running!!"); + LOGI("animator is running!!"); return; } if (!rsd->pressed) @@ -1136,13 +1315,14 @@ _event_area_mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) rsd->touched_item_changed = EINA_FALSE; rsd->pressed_item_index = _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_INVALID; rsd->pressed = EINA_FALSE; + rsd->entering_edit_mode = EINA_FALSE; return; } double angle = _mouse_event_angle_get(ev->canvas.x, ev->canvas.y); #if _ROTARY_SELECTOR_DEBUG_ENABLED - INF("OUTSIDE OF SELECTOR : angle : %f", angle); + LOGI("OUTSIDE OF SELECTOR : angle : %f", angle); #endif int new_index = 0; @@ -1200,36 +1380,45 @@ _event_area_mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) int add_idx = eina_list_count(rsd->item_list) - 1; if (rsd->editing) { - if (rsd->on_delete_icon) + if (!rsd->entering_edit_mode) { - Eina_Bool still_on = _delete_icon_mouse_on_check(rsd, new_index, ev->canvas.x, ev->canvas.y); - if (still_on) + if (rsd->on_delete_icon) { - Eext_Rotary_Selector_Item *it = NULL; - it = eina_list_nth(rsd->item_list, new_index); - _delete_item(rsd, it); + Eina_Bool still_on = _delete_icon_mouse_on_check(rsd, new_index, ev->canvas.x, ev->canvas.y); + if (still_on) + { + Eext_Rotary_Selector_Item *it = NULL; + it = eina_list_nth(rsd->item_list, new_index); + _delete_item(rsd, it); + } } - } - else if (!rsd->add_enabled || (new_index != add_idx)) - { - Eext_Rotary_Selector_Item *it = NULL; - it = eina_list_nth(rsd->item_list, new_index); - if (it->delete_enabled) + else if (rsd->add_enabled && (new_index == add_idx)) { - _delete_item(rsd, it); + if (!(ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)) + { + _editing_mode_turnoff(rsd); + evas_object_smart_callback_call(rsd->rotary_selector, + "add_item,clicked", NULL); + _item_touched_signal_send(rsd, add_idx, EINA_FALSE, EINA_TRUE); + } + else + { + _item_touched_signal_send(rsd, add_idx, EINA_FALSE, EINA_FALSE); + } + // } } - else if (rsd->add_enabled && (new_index == add_idx)) - { - _editing_mode_turnoff(rsd); - evas_object_smart_callback_call(rsd->rotary_selector, - "add_item,clicked", NULL); - _item_touched_signal_send(rsd, add_idx, EINA_FALSE, EINA_TRUE); - } } - else + else if (!(ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)) { _item_touched_signal_send(rsd, rsd->pressed_item_index, EINA_FALSE, EINA_TRUE); + //ONEUI1.5(19Jun2019): Enable sw/hw bezel + Eina_Bool send_clicked = EINA_FALSE; + if (!eext_rotary_event_is_enabled()) + { + send_clicked = rsd->selected_index == new_index ? EINA_TRUE : EINA_FALSE; + } + // rsd->selected_index = new_index; _item_selected_signal_send(rsd, previous_item_index, rsd->selected_index); _selector_update(rsd, EINA_FALSE, EINA_FALSE, EINA_FALSE); @@ -1237,20 +1426,61 @@ _event_area_mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) if (rsd->add_enabled && (new_index == add_idx)) { evas_object_smart_callback_call(rsd->rotary_selector, - "add_item,clicked", NULL); + "add_item,clicked", NULL); } else { - evas_object_smart_callback_call(rsd->rotary_selector, "item,clicked", (void*)_item_get(rsd, rsd->selected_index)); + //ONEUI1.5(19Jun2019): Enable sw/hw bezel + if (!eext_rotary_event_is_enabled()) + { + if (send_clicked) + { + evas_object_smart_callback_call(rsd->rotary_selector, "item,clicked", (void*)_item_get(rsd, rsd->selected_index)); + } + else + { + evas_object_smart_callback_call(rsd->rotary_selector, "item,selected", (void*)_item_get(rsd, rsd->selected_index)); + } + } + else + { + evas_object_smart_callback_call(rsd->rotary_selector, "item,clicked", (void*)_item_get(rsd, rsd->selected_index)); + } + // } } + //ONEUI1.5(25Sept2019): Fix touch cancel for s/w bezel + else + { + _item_touched_signal_send(rsd, rsd->pressed_item_index, EINA_FALSE, EINA_FALSE); + } + // } } } - + //ONEUI1.5(20180620):Release pressed delete icon + if (rsd->pressed_item_index != _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_INVALID) + { + Eext_Rotary_Selector_Item *it = NULL; + it = eina_list_nth(rsd->item_list, rsd->pressed_item_index); + if (it != NULL) + { + if (it->delete_enabled && rsd->editing) + { + char style[ITEM_SIGNAL_BUF_SIZE]="elm,selector,delete,r"; + int style_number = rsd->pressed_item_index % _ROTARY_SELECTOR_PAGE_ITEM_MAX; + //ONEUI1.5(20181224): SVACE #3665 fix + strncat(style, stylenumber[style_number], 3); + // + elm_object_signal_emit(it->base.obj, style, "elm"); + } + } + } + // rsd->pressed = EINA_FALSE; rsd->touched_item_changed = EINA_FALSE; rsd->pressed_item_index = _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_INVALID; + rsd->entering_edit_mode = EINA_FALSE; } static void @@ -1271,7 +1501,7 @@ _event_area_mouse_out_cb(void *data, Evas *e, Evas_Object *obj, void *event_info static void _event_area_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) { - INF("called!!"); + LOGI("called!!"); evas_object_event_callback_del(obj, EVAS_CALLBACK_MOUSE_DOWN, _event_area_mouse_down_cb); evas_object_event_callback_del(obj, EVAS_CALLBACK_MOUSE_MOVE, _event_area_mouse_move_cb); @@ -1282,7 +1512,7 @@ _event_area_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) static void _event_area_callback_add(Eext_Rotary_Selector_Data *rsd) { - INF("called!!"); + LOGI("called!!"); rsd->event_area = (Evas_Object *)edje_object_part_object_get(elm_layout_edje_get(rsd->rotary_selector), "event_area"); @@ -1309,7 +1539,7 @@ _eext_rotary_selector_data_init(Evas_Object *obj, Evas_Object *parent) rsd = (Eext_Rotary_Selector_Data *)calloc(1, sizeof(Eext_Rotary_Selector_Data)); if (!rsd) { - ERR("rsd is NULL!!"); + LOGE("rsd is NULL!!"); return NULL; } rsd->parent = parent; @@ -1335,17 +1565,21 @@ _eext_rotary_selector_data_init(Evas_Object *obj, Evas_Object *parent) rsd->selector_bg_image_color.pressed_color.set_flag = EINA_FALSE; rsd->pressed = EINA_FALSE; rsd->pressed_item_index = _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_INVALID; + //ONEUI1.5 (20180625): Init drop_item_index rsd->drop_item_index = _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_INVALID; + // rsd->touched_item_changed = EINA_FALSE; rsd->acceleration = EINA_FALSE; rsd->edit_mode_enabled = EINA_FALSE; rsd->editing = EINA_FALSE; + //ONEUI1.5 (20180611) : Hide delete icon while dnd rsd->drag_done = EINA_TRUE; + // radius = edje_object_data_get(elm_layout_edje_get(obj), "radius"); if (!radius) { - ERR("radius is NULL!!"); + LOGE("radius is NULL!!"); free(rsd); return NULL; } @@ -1354,7 +1588,7 @@ _eext_rotary_selector_data_init(Evas_Object *obj, Evas_Object *parent) item_width = edje_object_data_get(elm_layout_edje_get(obj), "item_width"); if (!item_width) { - ERR("item_width is NULL!!"); + LOGE("item_width is NULL!!"); free(rsd); return NULL; } @@ -1363,7 +1597,7 @@ _eext_rotary_selector_data_init(Evas_Object *obj, Evas_Object *parent) item_height = edje_object_data_get(elm_layout_edje_get(obj), "item_height"); if (!item_height) { - ERR("item_height is NULL!!"); + LOGE("item_height is NULL!!"); free(rsd); return NULL; } @@ -1372,25 +1606,27 @@ _eext_rotary_selector_data_init(Evas_Object *obj, Evas_Object *parent) data = edje_object_data_get(elm_layout_edje_get(obj), "delete_icon_width"); if (!data) { - ERR("item's delete_icon_width is NULL!"); + LOGE("item's delete_icon_width is NULL!"); free(rsd); return NULL; } - rsd->delete_icon_width = (Evas_Coord)atoi(data); - + //ONEUI1.5(20180620):Size up for delete icon touch detection + rsd->delete_icon_width = (Evas_Coord)atoi(data) + 10; + // data = edje_object_data_get(elm_layout_edje_get(obj), "delete_icon_height"); if (!data) { - ERR("item's delete_icon_height is NULL!"); + LOGE("item's delete_icon_height is NULL!"); free(rsd); return NULL; } - rsd->delete_icon_height = (Evas_Coord)atoi(data); - + //ONEUI1.5(20180620):Size up for delete icon touch detection + rsd->delete_icon_height = (Evas_Coord)atoi(data) + 10; + // data = edje_object_data_get(elm_layout_edje_get(obj), "page_item_width"); if (!data) { - ERR("item's page_item_width is NULL!"); + LOGE("item's page_item_width is NULL!"); free(rsd); return NULL; } @@ -1399,14 +1635,14 @@ _eext_rotary_selector_data_init(Evas_Object *obj, Evas_Object *parent) data = edje_object_data_get(elm_layout_edje_get(obj), "page_item_height"); if (!data) { - ERR("item's page_item_height is NULL!"); + LOGE("item's page_item_height is NULL!"); free(rsd); return NULL; } rsd->page_item_height = (Evas_Coord)atoi(data); rsd->rotary_event_time_stamp = 0.0; - INF("rsd is initialized!!"); + LOGI("rsd is initialized!!"); return rsd; } @@ -1416,7 +1652,7 @@ _eext_rotary_selector_data_get(const Evas_Object *rotary_selector) { if (!rotary_selector) { - ERR("rotary_selector is NULL!!"); + LOGE("rotary_selector is NULL!!"); return NULL; } @@ -1452,7 +1688,7 @@ _rotary_selector_rotary_cb(void *data, Evas_Object *obj, Eext_Rotary_Event_Info if (rsd->acceleration) { - INF("rotary acceleration!!"); + LOGI("rotary acceleration!!"); return EINA_FALSE; } @@ -1524,10 +1760,25 @@ _rotary_selector_rotary_cb(void *data, Evas_Object *obj, Eext_Rotary_Event_Info if (elm_atspi_bridge_utils_is_screen_reader_enabled() && rsd->is_first_rotary_control) { rsd->is_first_rotary_control = EINA_FALSE; + rsd->rot_highlighted = EINA_FALSE; + //ONEUI1.5(20180702): Sync item index when page transition, on edit mode, rotary selector + if (rsd->selected_index % (_ROTARY_SELECTOR_PAGE_ITEM_MAX) == 0 ) + { + rsd->selected_index = first_index; + } + else if(rsd->selected_index % (_ROTARY_SELECTOR_PAGE_ITEM_MAX - 1) == 0 ) + { + rsd->selected_index = last_index; + } + // } else { - rsd->selected_index += 1; + //ONEUI1.5(20180705):Manage selected_index as rotary highlighted + if (!rsd->rot_highlighted) + rsd->selected_index += 1; + else rsd->rot_highlighted = EINA_FALSE; + // } } else @@ -1542,13 +1793,11 @@ _rotary_selector_rotary_cb(void *data, Evas_Object *obj, Eext_Rotary_Event_Info //for accessibility if (elm_atspi_bridge_utils_is_screen_reader_enabled()) { - Eext_Rotary_Selector_Item *_item = _item_get(rsd, rsd->selected_index); - if (_item) - { - rsd->accessible_need_highlight_obj = _item->base.obj; - } + //ONEUI1.5(20180702): Sync item index when page transition, on edit mode, rotary selector + //rsd->selected_index = previous_item_index; + rsd->is_first_rotary_control = EINA_TRUE; + // } - // else { evas_object_smart_callback_call(rsd->rotary_selector, "item,selected", (void*)_item_get(rsd, rsd->selected_index)); @@ -1578,7 +1827,7 @@ _rotary_selector_rotary_cb(void *data, Evas_Object *obj, Eext_Rotary_Event_Info //for accessibility else if (elm_atspi_bridge_utils_is_screen_reader_enabled() && (rsd->selected_index == 0 && rsd->item_count == 1)) { - if (rsd->is_first_rotary_control) + if (rsd->is_first_rotary_control || rsd->rot_highlighted) { rsd->is_first_rotary_control = EINA_FALSE; Eext_Rotary_Selector_Item *_item = _item_get(rsd, rsd->selected_index); @@ -1588,6 +1837,12 @@ _rotary_selector_rotary_cb(void *data, Evas_Object *obj, Eext_Rotary_Event_Info rsd->accessible_need_highlight_obj = NULL; } } + //ONEUI1.5(20180702): Do end effect when selected_index = 0 + else + { + _end_effect_animation_run(rsd, EINA_TRUE); + } + // } // else @@ -1618,10 +1873,25 @@ _rotary_selector_rotary_cb(void *data, Evas_Object *obj, Eext_Rotary_Event_Info if (elm_atspi_bridge_utils_is_screen_reader_enabled() && rsd->is_first_rotary_control) { rsd->is_first_rotary_control = EINA_FALSE; + rsd->rot_highlighted = EINA_FALSE; + //ONEUI1.5(20180702): Sync item index when page transition, on edit mode, rotary selector + if (rsd->selected_index % (_ROTARY_SELECTOR_PAGE_ITEM_MAX) == 0 ) + { + rsd->selected_index = first_index; + } + else if(rsd->selected_index % (_ROTARY_SELECTOR_PAGE_ITEM_MAX - 1) == 0 ) + { + rsd->selected_index = last_index; + } + // } else { - rsd->selected_index -= 1; + //ONEUI1.5(20180705):Manage selected_index as rotary highlighted + if (!rsd->rot_highlighted) + rsd->selected_index -= 1; + else rsd->rot_highlighted = EINA_FALSE; + // } } else @@ -1636,11 +1906,10 @@ _rotary_selector_rotary_cb(void *data, Evas_Object *obj, Eext_Rotary_Event_Info //for accessibility if (elm_atspi_bridge_utils_is_screen_reader_enabled()) { - Eext_Rotary_Selector_Item *_item = _item_get(rsd, rsd->selected_index); - if (_item) - { - rsd->accessible_need_highlight_obj = _item->base.obj; - } + //ONEUI1.5(20180702): Sync item index when page transition, on edit mode, rotary selector + //rsd->selected_index = previous_item_index; + rsd->is_first_rotary_control = EINA_TRUE; + // } // else @@ -1671,9 +1940,10 @@ _rotary_selector_rotary_cb(void *data, Evas_Object *obj, Eext_Rotary_Event_Info //for accessibility else if (elm_atspi_bridge_utils_is_screen_reader_enabled() && rsd->selected_index == 0) { - if (rsd->is_first_rotary_control) + if (rsd->is_first_rotary_control || rsd->rot_highlighted) { rsd->is_first_rotary_control = EINA_FALSE; + rsd->rot_highlighted = EINA_FALSE; Eext_Rotary_Selector_Item *_item = _item_get(rsd, rsd->selected_index); if (_item) { @@ -1681,14 +1951,18 @@ _rotary_selector_rotary_cb(void *data, Evas_Object *obj, Eext_Rotary_Event_Info rsd->accessible_need_highlight_obj = NULL; } } + //ONEUI1.5(20180702): Do end effect when selected_index = 0 + else + { + _end_effect_animation_run(rsd, EINA_FALSE); + } + // } - // else { _end_effect_animation_run(rsd, EINA_FALSE); } } - return ECORE_CALLBACK_PASS_ON; } @@ -1698,7 +1972,7 @@ _rotary_selector_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data; if (!rsd) { - ERR("rsd is NULL!!"); + LOGE("rsd is NULL!!"); return; } @@ -1712,26 +1986,71 @@ _rotary_selector_show_cb(void *data, Evas *e, Evas_Object *obj, void *event_info rsd = data; if (!rsd) { - ERR("rsd is NULL!!"); + LOGE("rsd is NULL!!"); return; } - + //ONEUI1.5(20180614): Edit mode screen reader support + if (elm_atspi_bridge_utils_is_screen_reader_enabled()) + elm_atspi_component_highlight_grab(obj); + // _item_select(rsd, rsd->selected_index); } +//ONEUI1.5(20180614): Edit mode screen reader support +static Eina_Bool _highlight_timer_cb(void *data) +{ + Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data; + if (!rsd) return ECORE_CALLBACK_CANCEL; + elm_atspi_component_highlight_grab(rsd->rotary_selector); + rsd->highlight_timer = NULL; + return ECORE_CALLBACK_CANCEL; +} + +static void +_grab_highlight_cb(void *data, Evas_Object *obj, void *event_info) +{ + Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data; + if (!rsd) return; + if (!evas_object_visible_get(rsd->rotary_selector)) return; + if (rsd->highlight_timer) ecore_timer_del(rsd->highlight_timer); + rsd->highlight_timer = ecore_timer_add(0.5, _highlight_timer_cb, rsd); + evas_object_smart_callback_del(obj, "item,activated", _grab_highlight_cb); +} + +static void +_win_focus_cb(void *data, Evas_Object *obj, void *event_info) +{ + Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data; + if (!rsd) return; + if (!evas_object_visible_get(rsd->rotary_selector)) return; + if (rsd->highlight_timer) ecore_timer_del(rsd->highlight_timer); + rsd->highlight_timer = ecore_timer_add(0.5, _highlight_timer_cb, rsd); +} +// + static void _rotary_selector_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) { Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data; if (!rsd) { - ERR("rsd is NULL!!"); + LOGE("rsd is NULL!!"); return; } // accessibility evas_object_smart_callback_del(rsd->rotary_selector, "atspi,screen,reader,changed", _rotary_selector_screen_reader_changed); evas_object_smart_callback_del(rsd->rotary_selector, "more,option,opened", _rotary_selector_moreoption_opened_cb); + //ONEUI1.5(20180614): Edit mode screen reader support + Evas_Object *widget = elm_object_parent_widget_get(obj); + if (widget && !strcmp(evas_object_type_get(widget), "elm_naviframe")) + evas_object_smart_callback_del(widget, "item,activated", _grab_highlight_cb); + if (rsd->highlight_timer) + { + ecore_timer_del(rsd->highlight_timer); + rsd->highlight_timer = NULL; + } + evas_object_smart_callback_del(elm_object_top_widget_get(rsd->rotary_selector), "focused", _win_focus_cb); // if (rsd->item_list) @@ -1766,7 +2085,6 @@ _rotary_selector_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) ecore_animator_del(rsd->item_update_animator); rsd->item_update_animator = NULL; } - if (rsd->editing_timer) { ecore_timer_del(rsd->editing_timer); @@ -1821,6 +2139,9 @@ _rotary_selector_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) evas_object_data_del(obj, EEXT_ROTARY_SELECTOR_DATA_KEY); free(rsd); + //ONEUI1.5(20180614): Edit mode screen reader support + rsd = NULL; + // } static void @@ -1828,29 +2149,24 @@ _rotary_selector_item_delete_icon_show(Eext_Rotary_Selector_Data *rsd) { Eina_List *l = NULL; Eext_Rotary_Selector_Item *item; - int start_idx, i = 0, page; EINA_LIST_FOREACH(rsd->item_list, l, item) { - page = i / _ROTARY_SELECTOR_PAGE_ITEM_MAX; - start_idx = page * _ROTARY_SELECTOR_PAGE_ITEM_MAX; if (item->delete_enabled) { - if (item->index >= start_idx && - item->index < start_idx + _ROTARY_SELECTOR_PAGE_ITEM_MAX / 2 ) - { - elm_object_signal_emit(item->base.obj, "elm,selector,delete,left", "elm"); - } - else - { - elm_object_signal_emit(item->base.obj, "elm,selector,delete,right", "elm"); - } + // ONEUI1.5(20180607) - v2.4 ROTARY SELECTOR UI + char style[ITEM_SIGNAL_BUF_SIZE]="elm,selector,delete,r"; + int style_number = item->index % 11; + //ONEUI1.5(20181224): SVACE #3665 fix + strncat(style, stylenumber[style_number], 3); + // + elm_object_signal_emit(item->base.obj, style, "elm"); + // } else { elm_object_signal_emit(item->base.obj, "elm,selector,delete,hide", "elm"); } - i++; } } @@ -1870,7 +2186,9 @@ static void _add_item_create(Eext_Rotary_Selector_Data *rsd) { if (rsd->add_item) return; + Eext_Rotary_Selector_Item *prev_item = NULL; + prev_item = eina_list_data_get(eina_list_last(rsd->item_list)); Eext_Rotary_Selector_Item *add_item = _item_create(rsd, EEXT_ROTARY_SELECTOR_ADD_ITEM); if (!add_item) return; @@ -1880,6 +2198,23 @@ _add_item_create(Eext_Rotary_Selector_Data *rsd) add_item->index = rsd->item_count; rsd->item_count++; rsd->add_item = add_item; + + //ONEUI1.5(20180516) speak add_item main title when screen-reader + /* Accessibility */ + if (elm_atspi_bridge_utils_is_screen_reader_enabled()) + { + _accessibility_item_name_set(rsd, rsd->add_item); + _accessibility_item_chain_end_set(rsd); + if (prev_item) + { + _accessibility_rotary_selector_item_relationship_set(prev_item->base.obj, rsd->add_item->base.obj); + } + else + { + _accessibility_rotary_selector_item_relationship_set(rsd->rotary_selector, rsd->add_item->base.obj);//add item is the only item + } + } + // } static Eina_Bool @@ -1891,22 +2226,26 @@ _editing_timer_cb(void *data) Eext_Rotary_Selector_Item *item; rsd->editing_timer = NULL; - //FIXME: translate text Editing + elm_object_part_text_set(elm_object_part_content_get(rsd->rotary_selector, "content"), - "selector,main_text", "Editing"); + "selector,main_text", _("WDS_TPLATFORM_TMBODY_EDIT_MODE_ABB")); elm_object_part_text_set(elm_object_part_content_get(rsd->rotary_selector, "content"), "selector,sub_text", ""); elm_layout_signal_emit(elm_object_part_content_get(rsd->rotary_selector, "content"), "text1,show", "eext"); evas_object_smart_callback_call(rsd->rotary_selector, "editing,entered", NULL); rsd->editing = EINA_TRUE; + rsd->entering_edit_mode = EINA_TRUE; + EINA_LIST_FOREACH(rsd->item_list, l, item) { elm_object_signal_emit(item->base.obj, "elm,action,button,unselected", ""); } + //ONEUI1.5(20180618): Drag on first long press if (rsd->drag_pos_x == -1 && rsd->drag_pos_y == -1) + // _rotary_selector_item_delete_icon_show(rsd); else { @@ -1915,10 +2254,16 @@ _editing_timer_cb(void *data) add_idx = eina_list_count(rsd->item_list) - 1; if (!rsd->add_enabled || (rsd->pressed_item_index != add_idx)) { - rsd->drag_item_index = rsd->pressed_item_index; - _item_longpress_cb(rsd); + //ONEUI1.5(20180703): instant dnd when only normal mode + if (!elm_atspi_bridge_utils_is_screen_reader_enabled()) + // + { + rsd->drag_item_index = rsd->pressed_item_index; + _item_longpress_cb(rsd); + } } } + // _items_invalidate(rsd); bg = elm_object_part_content_get(rsd->rotary_selector, "selector,bg_image"); elm_object_signal_emit(bg, "elm,selector,bg,hide", "elm"); @@ -1926,6 +2271,22 @@ _editing_timer_cb(void *data) eext_object_event_callback_add(rsd->rotary_selector, EEXT_CALLBACK_BACK, _back_event_cb, rsd); + //ONEUI1.5(20180611): Edit mode screen reader support + if (elm_atspi_bridge_utils_is_screen_reader_enabled()) + { + char buf[4056]; + char buf_page[255]; + int max_page = ((rsd->item_count - 1) / _ROTARY_SELECTOR_PAGE_ITEM_MAX) + 1; + int min_page = rsd->current_page + 1; + char *str = _("WDS_TPLATFORM_TMBODY_EDIT_MODE_ABB"); + char *str1 = _("WDS_ACCS_TBBODY_DOUBLE_TAP_TO_REMOVE_OR_DOUBLE_TAP_AND_HOLD_TO_REORDER_ITEMS"); + snprintf(buf, sizeof(buf)-1, "%s, %s ", str, str1); + str = _("WDS_ACCS_TBOPT_PAGE_P1SD_OF_P2SD"); + snprintf(buf_page, sizeof(buf_page)-1, str, min_page, max_page); + strncat(buf, buf_page, sizeof(buf) - strlen(buf) - 1); + elm_atspi_bridge_utils_say(buf, EINA_TRUE, NULL, NULL); + } + // return ECORE_CALLBACK_CANCEL; } @@ -2035,19 +2396,19 @@ _eext_rotary_selector_color_class_parent_set(Evas_Object *obj, Evas_Object *pare if (!obj || !parent) return; - if (efl_isa(obj, EFL_UI_LAYOUT_CLASS)) + if (efl_isa(obj, EFL_UI_LAYOUT_CLASS)) edje = elm_layout_edje_get(obj); else if (efl_isa(obj, EFL_CANVAS_LAYOUT_CLASS)) edje = obj; - if (efl_isa(parent, EFL_UI_LAYOUT_CLASS)) + if (efl_isa(parent, EFL_UI_LAYOUT_CLASS)) parent_edje = elm_layout_edje_get(parent); else if (efl_isa(parent, EFL_CANVAS_LAYOUT_CLASS)) parent_edje = parent; if (!edje || !parent_edje) { - ERR("There is a missing edje to have color class relationship... edje[%p], parent_edje[%p]", edje, parent_edje); + LOGE("There is a missing edje to have color class relationship... edje[%p], parent_edje[%p]", edje, parent_edje); return; } @@ -2067,7 +2428,7 @@ _item_coords_update(Eext_Rotary_Selector_Data *rsd, Eext_Rotary_Selector_Item *i Evas_Coord x, y, w, h; evas_object_geometry_get(item->base.obj, &x, &y, &w, &h); - INF("item(0x%x), index(%d), x(%f), y(%f)", item, item->index, coords->x, coords->y); + LOGI("item(0x%x), index(%d), x(%f), y(%f)", item, item->index, coords->x, coords->y); #endif } @@ -2115,12 +2476,17 @@ _items_invalidate(Eext_Rotary_Selector_Data *rsd) if (i >= first_index && i <= last_index) { + //ONEUI1.5(20180611) : Hide delete icon while editing mode dnd if (rsd->editing && item->delete_enabled && rsd->drag_done) { - if (item->index < first_index + _ROTARY_SELECTOR_PAGE_ITEM_MAX / 2) - elm_object_signal_emit(button, "elm,selector,delete,left", "elm"); - else - elm_object_signal_emit(button, "elm,selector,delete,right", "elm"); + // ONEUI1.5(20180607) - v2.4 ROTARY SELECTOR UI + char style[ITEM_SIGNAL_BUF_SIZE]="elm,selector,delete,r"; + int style_number = item->index % _ROTARY_SELECTOR_PAGE_ITEM_MAX; + //ONEUI1.5(20181224): SVACE #3665 fix + strncat(style, stylenumber[style_number], 3); + // + elm_object_signal_emit(button, style, "elm"); + // } else { @@ -2133,15 +2499,29 @@ _items_invalidate(Eext_Rotary_Selector_Data *rsd) evas_object_raise(button); evas_object_show(button); #if _ROTARY_SELECTOR_DEBUG_ENABLED - INF("obj : 0x%x show index : %d x:%f y:%f", item->base.obj, item->index, x + item->coords.x, y + item->coords.y); + LOGI("obj : 0x%x show index : %d x:%f y:%f", item->base.obj, item->index, x + item->coords.x, y + item->coords.y); #endif } else { - elm_object_signal_emit(button, "elm,selector,delete,hide", "elm"); + //ONEUI1.5 (20180611) : Don't hide delete badge of other page while editing mode + if (rsd->editing && !rsd->drag_done) + { + elm_object_signal_emit(button, "elm,selector,delete,hide", "elm"); + } + else if (rsd->editing && item->delete_enabled && rsd->drag_done) + { + char style[ITEM_SIGNAL_BUF_SIZE]="elm,selector,delete,r"; + int style_number = item->index % _ROTARY_SELECTOR_PAGE_ITEM_MAX; + //ONEUI1.5(20181224): SVACE #3665 fix + strncat(style, stylenumber[style_number], 3); + // + elm_object_signal_emit(button, style, "elm"); + } + // evas_object_hide(button); #if _ROTARY_SELECTOR_DEBUG_ENABLED - INF("obj : 0x%x hide index : %d", item->base.obj, item->index); + LOGI("obj : 0x%x hide index : %d", item->base.obj, item->index); #endif } i++; @@ -2150,7 +2530,7 @@ _items_invalidate(Eext_Rotary_Selector_Data *rsd) _layer_items_invalidate(rsd); #if _ROTARY_SELECTOR_DEBUG_ENABLED - INF("elapsed time(%f)", ecore_time_unix_get() - start_time); + LOGI("elapsed time(%f)", ecore_time_unix_get() - start_time); #endif } @@ -2255,7 +2635,7 @@ _item_rearrange(Eext_Rotary_Selector_Data *rsd, int selected_index) rsd->selected_index = selected_index; #if _ROTARY_SELECTOR_DEBUG_ENABLED - INF("item is rearranged!! : item_count(%d)", rsd->item_count); + LOGI("item is rearranged!! : item_count(%d)", rsd->item_count); #endif } @@ -2263,8 +2643,10 @@ static void _item_select(Eext_Rotary_Selector_Data *rsd, int index) { #if _ROTARY_SELECTOR_DEBUG_ENABLED - INF("item is selected!! : index(%d)", index); + LOGI("item is selected!! : index(%d)", index); #endif +//ONEUI1.5(20170620): Add next/prev icons for product style. + _product_style_check(rsd); if (!rsd->editing) _item_selected_signal_send(rsd, rsd->selected_index, index); rsd->selected_index = index; @@ -2317,11 +2699,10 @@ _item_create(Eext_Rotary_Selector_Data *rsd, Eext_Rotary_Selector_Item_Type item button = elm_button_add(rotary_selector); if (!button) { - ERR("button is NULL!!"); + LOGE("button is NULL!!"); return NULL; } - if (!elm_atspi_bridge_utils_is_screen_reader_enabled()) evas_object_freeze_events_set(button, EINA_TRUE); evas_object_repeat_events_set(button, EINA_TRUE); @@ -2354,16 +2735,19 @@ _item_create(Eext_Rotary_Selector_Data *rsd, Eext_Rotary_Selector_Item_Type item item = (Eext_Rotary_Selector_Item *)calloc(1, sizeof(Eext_Rotary_Selector_Item)); if (!item) { - ERR("item is NULL!!"); + LOGE("item is NULL!!"); return NULL; } //for accessibility if (elm_atspi_bridge_utils_is_screen_reader_enabled()) { - evas_object_smart_callback_add(button, "clicked",_accessibility_item_btn_clicked_cb, (Eext_Rotary_Selector_Data*)rsd); evas_object_smart_callback_add(button, "atspi,highlighted", _accessibility_item_btn_highlighted_cb, (Eext_Rotary_Selector_Data*)rsd); - elm_atspi_accessible_gesture_cb_set(button, _accessibility_item_gesutre_cb, (Eext_Rotary_Selector_Data*)rsd); + elm_atspi_accessible_gesture_cb_set(button, _accessibility_item_gesture_cb, (Eext_Rotary_Selector_Data*)rsd); + //ONEUI1.5(20180709): On double tap and hold, mouse down, up are sent in access mode + elm_object_signal_emit(button, "elm,action,access_on", "elm"); + evas_object_smart_callback_add(button, "theme,changed", _accessibility_theme_changed_cb, (Eext_Rotary_Selector_Data*)rsd); + // } // @@ -2397,6 +2781,66 @@ _item_create(Eext_Rotary_Selector_Data *rsd, Eext_Rotary_Selector_Item_Type item return item; } +//ONEUI1.5(20170620): Add next/prev icons for product style. +static void +_product_style_check(Eext_Rotary_Selector_Data *rsd) +{ + if (!rsd->checked_product_style) + { + Eext_Rotary_Selector_Item *item = eina_list_nth(rsd->item_list, 0); + if (!item) return; + + if (evas_object_data_get(rsd->parent, "eext_more_option_data")) + { + if (!strcmp(elm_object_style_get(item->base.obj), "prod/more_option_item")) + { + rsd->is_product_style = EINA_TRUE; + } + } + else + { + if (!strcmp(elm_object_style_get(item->base.obj), "prod/rotary_selector_item")) + { + rsd->is_product_style = EINA_TRUE; + } + } + + rsd->checked_product_style = EINA_TRUE; + if(rsd->is_product_style) + { + if (rsd->item_count > _ROTARY_SELECTOR_PAGE_ITEM_MAX) + { + if (!rsd->next_icon && !rsd->prev_icon) + { + rsd->next_icon = _product_layer_icon_create(rsd, "next_icon"); + rsd->prev_icon = _product_layer_icon_create(rsd, "prev_icon"); + } + } + } + } +} + +static Evas_Object* +_product_layer_icon_create(Eext_Rotary_Selector_Data *rsd, const char* style) +{ + Evas_Object *layout = elm_layout_add(rsd->rotary_selector); + if (!layout) + { + LOGE("layout is NULL!!"); + return NULL; + } + + elm_layout_theme_set(layout, "rotary_selector", "prod_item", style); + evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND,EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL); + + evas_object_move(layout, -_ROTARY_SELECTOR_SCREEN_WIDTH, -_ROTARY_SELECTOR_SCREEN_HEIGHT); + evas_object_resize(layout, rsd->item_width, rsd->item_height); + evas_object_smart_member_add(layout, rsd->rotary_selector); + evas_object_repeat_events_set(layout, EINA_TRUE); + + return layout; +} static void _item_selected_signal_send(Eext_Rotary_Selector_Data *rsd, int previous_item_index, int current_item_index) @@ -2411,7 +2855,7 @@ _item_selected_signal_send(Eext_Rotary_Selector_Data *rsd, int previous_item_ind { elm_object_signal_emit(item->base.obj, "elm,action,button,unselected", ""); #if _ROTARY_SELECTOR_DEBUG_ENABLED - INF("item is unselected!! : index(%d)", previous_item_index); + LOGI("item is unselected!! : index(%d)", previous_item_index); #endif } if ((current_item_index != -1) && @@ -2420,7 +2864,7 @@ _item_selected_signal_send(Eext_Rotary_Selector_Data *rsd, int previous_item_ind { elm_object_signal_emit(item->base.obj, "elm,action,button,selected", ""); #if _ROTARY_SELECTOR_DEBUG_ENABLED - INF("item is selected!! : index(%d)", current_item_index); + LOGI("item is selected!! : index(%d)", current_item_index); #endif } i++; @@ -2485,7 +2929,7 @@ _item_text_copy(char **target, const char* source) *target = malloc(sizeof(char)*size); if (!(*target)) { - ERR("allocation is failed!!"); + LOGE("allocation is failed!!"); return; } memset(*target, 0, size); @@ -2644,8 +3088,21 @@ _item_update_animator_cb(void *data) rsd->item_update_animator = NULL; +//ONEUI1.5(20170620): Add next/prev icons for product style. + if(rsd->is_product_style) + { + if (rsd->item_count <= _ROTARY_SELECTOR_PAGE_ITEM_MAX) + { + if (rsd->next_icon && rsd->prev_icon) + { + evas_object_color_set(rsd->next_icon, 0, 0, 0, 0); + evas_object_color_set(rsd->prev_icon, 0, 0, 0, 0); + } + } + } + #if _ROTARY_SELECTOR_DEBUG_ENABLED - INF("item_list(0x%d), count(%d)", rsd->item_list, rsd->item_count); + LOGI("item_list(0x%d), count(%d)", rsd->item_list, rsd->item_count); #endif return ECORE_CALLBACK_CANCEL; @@ -2669,6 +3126,7 @@ _page_animation_run(Eext_Rotary_Selector_Data *rsd, Eina_Bool direction) msg->count = 1; msg->val[0] = 1; edje_object_message_send(elm_layout_edje_get(rsd->rotary_selector), EDJE_MESSAGE_FLOAT_SET, 0, msg); + free(msg); rsd->page_anim_on_going = EINA_TRUE; rsd->previous_page_animator_start_time = ecore_loop_time_get(); @@ -2699,7 +3157,7 @@ _item_update_animation_run(Eext_Rotary_Selector_Data *rsd) if (rsd->item_update_animator) { #if _ROTARY_SELECTOR_DEBUG_ENABLED - INF("item update animator is already running!!"); + LOGI("item update animator is already running!!"); #endif return; } @@ -2833,14 +3291,34 @@ _next_page_animator_cb(void *data) if (rsd->animation_direction) { rsd->current_page += 1; + //ONEUI1.5(20180706):More safety for page transition + if (rsd->current_page > ((rsd->item_count - 1) / _ROTARY_SELECTOR_PAGE_ITEM_MAX)) + { + rsd->current_page -= 1; + rsd->next_page_animator_start_time = 0.0f; + rsd->next_page_animator = NULL; + rsd->page_anim_on_going = EINA_FALSE; + return ECORE_CALLBACK_CANCEL; + } + // _items_invalidate(rsd); } else //Backward { rsd->current_page -= 1; + //ONEUI1.5(20180706):More safety for page transition + if (rsd->current_page < 0) + { + rsd->current_page = 0; + rsd->next_page_animator_start_time = 0.0f; + rsd->next_page_animator = NULL; + rsd->page_anim_on_going = EINA_FALSE; + return ECORE_CALLBACK_CANCEL; + } + // _items_invalidate(rsd); } - + //ONEUI1.5 (20180608) : When item dnd happend to other page if (rsd->editing) { int page_selected_index = rsd->selected_index % _ROTARY_SELECTOR_PAGE_ITEM_MAX; @@ -2854,18 +3332,26 @@ _next_page_animator_cb(void *data) rsd->selected_index = next_selected_index; _item_select(rsd, rsd->selected_index); } - + // rsd->next_page_animator_start_time = 0.0f; rsd->next_page_animator = NULL; /* Accessibility */ if (elm_atspi_bridge_utils_is_screen_reader_enabled()) { - if (rsd->accessible_need_highlight_obj) + rsd->rot_highlighted = EINA_FALSE; + if (!rsd->highlighted) + elm_atspi_component_highlight_grab(rsd->rotary_selector); + else { - elm_atspi_component_highlight_grab(rsd->accessible_need_highlight_obj); - rsd->accessible_need_highlight_obj = NULL; + char buf_page[255]; + int max_page = ((rsd->item_count - 1) / _ROTARY_SELECTOR_PAGE_ITEM_MAX) + 1; + int min_page = rsd->current_page + 1; + char *str = _("WDS_ACCS_TBOPT_PAGE_P1SD_OF_P2SD"); + snprintf(buf_page, sizeof(buf_page)-1, str, min_page, max_page); + elm_atspi_bridge_utils_say(buf_page, EINA_TRUE, NULL, NULL); } + // } // @@ -2911,7 +3397,7 @@ _end_effect_animator_cb(void *data) Evas_Object *selector = elm_object_part_content_get(rsd->rotary_selector, "selector,bg_image"); if (!selector) { - ERR("selector is NULL!!"); + LOGE("selector is NULL!!"); return ECORE_CALLBACK_CANCEL; } @@ -2919,7 +3405,7 @@ _end_effect_animator_cb(void *data) map = evas_map_new(4); if (!map) { - ERR("map is NULL!!"); + LOGE("map is NULL!!"); return ECORE_CALLBACK_CANCEL; } @@ -2963,7 +3449,7 @@ _selector_update(Eext_Rotary_Selector_Data *rsd, Eina_Bool page_changed, Eina_Bo Evas_Object *edje = elm_layout_edje_get(rsd->rotary_selector); if (!edje) { - ERR("edje is NULL!!"); + LOGE("edje is NULL!!"); return; } @@ -2986,7 +3472,14 @@ _selector_update(Eext_Rotary_Selector_Data *rsd, Eina_Bool page_changed, Eina_Bo if (is_anim) edje_object_signal_emit(edje, signals[rsd->selected_index % _ROTARY_SELECTOR_PAGE_ITEM_MAX], "eext"); else - edje_object_signal_emit(edje, signals[rsd->selected_index % _ROTARY_SELECTOR_PAGE_ITEM_MAX], "noanim"); + { + edje_object_signal_emit(edje, signals[rsd->selected_index%_ROTARY_SELECTOR_PAGE_ITEM_MAX], "noanim"); + if (rsd->acceleration) + { + rsd->acceleration = EINA_FALSE; + rsd->rotary_event_time_stamp = 0; + } + } } if (!rsd->editing) @@ -3134,12 +3627,12 @@ _selector_content_update(Eext_Rotary_Selector_Data *rsd) { elm_layout_signal_emit(elm_object_part_content_get(rsd->rotary_selector, "content"), "text1,show", "eext"); } - - /* Accessibility */ - if (elm_atspi_bridge_utils_is_screen_reader_enabled()) - _accessibility_item_name_set(rsd, item); + //ONEUI1.5(20180515): Update selector,main_text for add_item + if (item == rsd->add_item) + { + evas_object_smart_callback_call(rsd->rotary_selector, "add_item,selected", NULL); + } // - } } i++; @@ -3150,12 +3643,14 @@ _selector_content_update(Eext_Rotary_Selector_Data *rsd) } else if (rsd->selector_bg_hidden) { + //ONEUI1.5(20180719):Should not show selector on edit mode if (!rsd->editing) { Evas_Object *bg = elm_object_part_content_get(rsd->rotary_selector, "selector,bg_image"); elm_object_signal_emit(bg, "elm,selector,bg,show", "elm"); rsd->selector_bg_hidden = EINA_FALSE; } + // } } @@ -3163,7 +3658,7 @@ _selector_content_update(Eext_Rotary_Selector_Data *rsd) static void _selector_clicked_signal(void *data, Evas_Object *obj, const char *emission, const char *source) { - INF("called!!"); + LOGI("called!!"); Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data; if (rsd && !rsd->editing) @@ -3184,7 +3679,7 @@ _selector_clicked_signal(void *data, Evas_Object *obj, const char *emission, con static void _selector_animation_finished_cb(void *data, Evas_Object *obj, const char *emission, const char *source) { - INF("called!!"); + LOGI("called!!"); Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data; if (rsd) @@ -3197,7 +3692,132 @@ _selector_animation_finished_cb(void *data, Evas_Object *obj, const char *emissi } } +//ONEUI1.5(20180614): Edit mode screen reader support +static Eina_Bool +_accessibility_gesture_cb(void *data, Elm_Atspi_Gesture_Info gesture_info, Evas_Object *obj) +{ + Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data*)data; + if (!rsd) + return EINA_FALSE; + if (rsd->previous_page_animator || rsd->next_page_animator) + return EINA_FALSE; + + int first_index = rsd->current_page*_ROTARY_SELECTOR_PAGE_ITEM_MAX; + int last_index = 0; + int previous_item_index = rsd->selected_index; + if (rsd->current_page == 0) + { + last_index = _ROTARY_SELECTOR_PAGE_ITEM_MAX - 1; + } + else + { + last_index = (rsd->current_page + 1) * _ROTARY_SELECTOR_PAGE_ITEM_MAX - 1; + } + if (last_index > rsd->item_count - 1) + { + last_index = rsd->item_count - 1; + } + + LOGI("Gesture_type = %d x_beg = %d, x_end=%d y_beg=%d y_end=%d",gesture_info.type, + gesture_info.x_beg, gesture_info.x_end, gesture_info.y_beg, gesture_info.y_end); + + switch (gesture_info.type) + { + case ELM_ATSPI_GESTURE_ONE_FINGER_FLICK_LEFT: + { + if (rsd->editing) + { + Eext_Rotary_Selector_Item *_item = _item_get(rsd, last_index); + if (_item) + elm_atspi_component_highlight_grab(_item->base.obj); + } + else + { + Eext_Rotary_Selector_Item *_item = _item_get(rsd, rsd->selected_index); + if (_item) + { + rsd->accessible_need_highlight_obj = _item->base.obj; + elm_atspi_component_highlight_grab(rsd->accessible_need_highlight_obj); + rsd->accessible_need_highlight_obj = NULL; + } + } + return EINA_TRUE; + } + break; + case ELM_ATSPI_GESTURE_ONE_FINGER_FLICK_RIGHT: + { + if (rsd->editing) + { + Eext_Rotary_Selector_Item *_item = _item_get(rsd, first_index); + if (_item) + elm_atspi_component_highlight_grab(_item->base.obj); + } + else + { + Eext_Rotary_Selector_Item *_item = _item_get(rsd, rsd->selected_index); + if (_item) + { + rsd->accessible_need_highlight_obj = _item->base.obj; + elm_atspi_component_highlight_grab(rsd->accessible_need_highlight_obj); + rsd->accessible_need_highlight_obj = NULL; + } + } + return EINA_TRUE; + } + break; + case ELM_ATSPI_GESTURE_TWO_FINGERS_FLICK_RIGHT: + if (rsd->current_page > 0) + { + rsd->selected_index = first_index - 1; + _item_selected_signal_send(rsd, previous_item_index, rsd->selected_index); + _page_animation_run(rsd, EINA_FALSE); + _selector_update(rsd, EINA_TRUE, EINA_TRUE, EINA_TRUE); + evas_object_smart_callback_call(rsd->rotary_selector, "item,selected", (void*)_item_get(rsd, rsd->selected_index)); + return EINA_TRUE; + } + break; + case ELM_ATSPI_GESTURE_TWO_FINGERS_FLICK_LEFT: + if (rsd->current_page < ((rsd->item_count - 1) / _ROTARY_SELECTOR_PAGE_ITEM_MAX)) + { + rsd->selected_index = last_index + 1; + _item_selected_signal_send(rsd, previous_item_index, rsd->selected_index); + _page_animation_run(rsd, EINA_TRUE); + _selector_update(rsd, EINA_TRUE, EINA_TRUE, EINA_TRUE); + evas_object_smart_callback_call(rsd->rotary_selector, "item,selected", (void*)_item_get(rsd, rsd->selected_index)); + return EINA_TRUE; + } + break; + //ONEUI1.5(20180704):Consume hover and tap event to avoid highlight while dnd + case ELM_ATSPI_GESTURE_ONE_FINGER_HOVER: + if (rsd->editing) + return EINA_TRUE; + break; + case ELM_ATSPI_GESTURE_ONE_FINGER_SINGLE_TAP: + if (rsd->editing && gesture_info.state == EFL_ACCESS_GESTURE_STATE_ABORT) + return EINA_TRUE; + break; + // + default: + break; + } + return EINA_FALSE; +} + +static char * +_accessibility_name_set_cb(void *data, Evas_Object *obj) +{ + char buf_page[255]; + Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data; + int max_page = ((rsd->item_count - 1) / _ROTARY_SELECTOR_PAGE_ITEM_MAX) + 1; + int min_page = rsd->current_page + 1; + char *str = _("WDS_ACCS_TBOPT_PAGE_P1SD_OF_P2SD"); + snprintf(buf_page, sizeof(buf_page)-1, str, min_page, max_page); + return strdup(buf_page); +} +// + // ----------------------------------------- public API implementation --------------------------------------// + EAPI Evas_Object * eext_rotary_selector_add(Evas_Object *parent) { @@ -3208,7 +3828,7 @@ eext_rotary_selector_add(Evas_Object *parent) Evas_Object *rotary_selector = elm_layout_add(parent); if (!rotary_selector) { - ERR("rotary_selector is NULL!!"); + LOGE("rotary_selector is NULL!!"); return NULL; } @@ -3221,16 +3841,18 @@ eext_rotary_selector_add(Evas_Object *parent) rsd = _eext_rotary_selector_data_init(rotary_selector, parent); if (!rsd) { - ERR("rsd is NULL!!"); + LOGE("rsd is NULL!!"); return NULL; } evas_object_data_set(rotary_selector, EEXT_ROTARY_SELECTOR_DATA_KEY, rsd); + //ONEUI1.5(20180608): Add gesture swipe support rsd->gesture_layer = elm_gesture_layer_add(rotary_selector); elm_gesture_layer_attach(rsd->gesture_layer, rotary_selector); elm_gesture_layer_cb_set(rsd->gesture_layer, ELM_GESTURE_N_FLICKS, ELM_GESTURE_STATE_END, _on_flick_end_cb, rsd); + // edje_object_signal_callback_add(elm_layout_edje_get(rsd->rotary_selector), "eext,clicked", "", _selector_clicked_signal, rsd); edje_object_signal_callback_add(elm_layout_edje_get(rsd->rotary_selector), "elm,anim,finished", "elm", _selector_animation_finished_cb, rsd); @@ -3239,11 +3861,18 @@ eext_rotary_selector_add(Evas_Object *parent) Evas_Object *selector_bg = elm_layout_add(rotary_selector); if (!selector_bg) { - ERR("selector_bg is NULL!!"); + LOGE("selector_bg is NULL!!"); return NULL; } - elm_layout_theme_set(selector_bg, "rotary_selector", "selector", "selector_bg"); + if (!evas_object_data_get(parent, "eext_more_option_data")) + { + elm_layout_theme_set(selector_bg, "rotary_selector", "selector", "selector_bg"); + } + else + { + elm_layout_theme_set(selector_bg, "rotary_selector", "selector", "more_option"); + } elm_object_part_content_set(rotary_selector, "selector,bg_image", selector_bg); _eext_rotary_selector_color_class_parent_set(selector_bg, rotary_selector); @@ -3251,11 +3880,13 @@ eext_rotary_selector_add(Evas_Object *parent) Evas_Object *content = elm_layout_add(rotary_selector); if (!content) { - ERR("content is NULL!!"); + LOGE("content is NULL!!"); return NULL; } - - elm_layout_theme_set(content, "rotary_selector", "content", "default"); + if (!evas_object_data_get(parent, "eext_more_option_data")) + { + elm_layout_theme_set(content, "rotary_selector", "content", "default"); + } elm_object_part_content_set(rotary_selector, "content", content); _eext_rotary_selector_color_class_parent_set(content, rotary_selector); @@ -3284,8 +3915,27 @@ eext_rotary_selector_add(Evas_Object *parent) { evas_object_smart_callback_add(rotary_selector, "more,option,opened", _rotary_selector_moreoption_opened_cb, rsd); rsd->is_first_rotary_control = EINA_TRUE; + //ONEUI1.5(20180614): Edit mode screen reader support + elm_atspi_accessible_role_set(rotary_selector, ELM_ATSPI_ROLE_REDUNDANT_OBJECT); + + if (!evas_object_data_get(parent, "eext_more_option_data")) + { + //elm_atspi_accessible_attribute_append(widget, "default_label", "disabled"); ->check why not working + if (!strcmp(evas_object_type_get(parent), "elm_naviframe")) + evas_object_smart_callback_add(parent, "item,activated", _grab_highlight_cb, rsd); + evas_object_smart_callback_add(elm_object_top_widget_get(rotary_selector), "focused", _win_focus_cb, rsd); + // + } + elm_atspi_accessible_gesture_cb_set(rotary_selector, _accessibility_gesture_cb, (Eext_Rotary_Selector_Data*)rsd); + elm_atspi_accessible_name_cb_set(rotary_selector, _accessibility_name_set_cb, (Eext_Rotary_Selector_Data*)rsd); + evas_object_smart_callback_add(rotary_selector, "atspi,highlighted", _accessibility_rotary_highlighted_cb, rsd); + evas_object_smart_callback_add(rotary_selector, "atspi,unhighlighted", _accessibility_rotary_unhighlighted_cb, rsd); + elm_atspi_accessible_reading_info_type_set(rotary_selector, ELM_ACCESSIBLE_READING_INFO_TYPE_NAME); + elm_gesture_layer_cb_del(rsd->gesture_layer, ELM_GESTURE_N_FLICKS, + ELM_GESTURE_STATE_END, _on_flick_end_cb, rsd); } // + return rotary_selector; } @@ -3300,14 +3950,14 @@ eext_rotary_selector_item_append(Evas_Object *obj) rsd = _eext_rotary_selector_data_get(rotary_selector); if (!rsd) { - ERR("rsd is NULL!!"); + LOGE("rsd is NULL!!"); return NULL; } item = _item_create(rsd, EEXT_ROTARY_SELECTOR_NORMAL_ITEM); if (!item) { - ERR("item is NULL!!"); + LOGE("item is NULL!!"); return NULL; } @@ -3372,14 +4022,14 @@ eext_rotary_selector_item_prepend(Evas_Object *obj) rsd = _eext_rotary_selector_data_get(rotary_selector); if (!rsd) { - ERR("rsd is NULL!!"); + LOGE("rsd is NULL!!"); return NULL; } item = _item_create(rsd, EEXT_ROTARY_SELECTOR_NORMAL_ITEM); if (!item) { - ERR("item is NULL!!"); + LOGE("item is NULL!!"); return NULL; } @@ -3437,21 +4087,21 @@ eext_rotary_selector_item_insert_after(Evas_Object *obj, Eext_Object_Item *after if (!after_item) { - ERR("after_item is NULL!!"); + LOGE("after_item is NULL!!"); return NULL; } rsd = _eext_rotary_selector_data_get(rotary_selector); if (!rsd) { - ERR("rsd is NULL!!"); + LOGE("rsd is NULL!!"); return NULL; } item = _item_create(rsd, EEXT_ROTARY_SELECTOR_NORMAL_ITEM); if (!item) { - ERR("item is NULL!!"); + LOGE("item is NULL!!"); return NULL; } @@ -3526,21 +4176,21 @@ eext_rotary_selector_item_insert_before(Evas_Object *obj, Eext_Object_Item *befo if (!before_item) { - ERR("before_item is NULL!!"); + LOGE("before_item is NULL!!"); return NULL; } rsd = _eext_rotary_selector_data_get(rotary_selector); if (!rsd) { - ERR("rsd is NULL!!"); + LOGE("rsd is NULL!!"); return NULL; } item = _item_create(rsd, EEXT_ROTARY_SELECTOR_NORMAL_ITEM); if (!item) { - ERR("item is NULL!!"); + LOGE("item is NULL!!"); return NULL; } @@ -3617,14 +4267,14 @@ eext_rotary_selector_item_del(Eext_Object_Item *item) if (!rotary_selector_item) { - ERR("rotary_selector_item is NULL!!"); + LOGE("rotary_selector_item is NULL!!"); return; } rsd = _eext_rotary_selector_data_get(rotary_selector_item->rotary_selector); if (!rsd) { - ERR("rsd is NULL!!"); + LOGE("rsd is NULL!!"); return; } @@ -3670,7 +4320,6 @@ eext_rotary_selector_item_del(Eext_Object_Item *item) else if (before_item && !after_item) elm_atspi_accessible_relationship_append(before_item->base.obj, ELM_ATSPI_RELATION_FLOWS_TO, before_item->base.obj); - evas_object_smart_callback_del(find_item->base.obj, "clicked",_accessibility_item_btn_clicked_cb); evas_object_smart_callback_del(find_item->base.obj, "atspi,highlighted", _accessibility_item_btn_highlighted_cb); elm_atspi_accessible_gesture_cb_set(find_item->base.obj, NULL, NULL); } @@ -3704,14 +4353,14 @@ eext_rotary_selector_items_clear(Evas_Object *obj) if (!rotary_selector) { - ERR("rotary_selector is NULL!!"); + LOGE("rotary_selector is NULL!!"); return; } rsd = _eext_rotary_selector_data_get(rotary_selector); if (!rsd) { - ERR("rsd is NULL!!"); + LOGE("rsd is NULL!!"); return; } @@ -3725,8 +4374,9 @@ eext_rotary_selector_items_clear(Evas_Object *obj) } rsd->selected_index = 0; + //ONEUI1.5 (20180607) : Current page also have to init rsd->current_page = 0; - + // _item_rearrange(rsd, rsd->selected_index); _items_transformation_update(rsd); _items_invalidate(rsd); @@ -3742,17 +4392,17 @@ eext_rotary_selector_item_part_text_set(Eext_Object_Item *item, const char *part if (!rotary_selector_item) { - ERR("rotary_selector_item is NULL!!"); + LOGE("rotary_selector_item is NULL!!"); return; } if (!part_name) { - ERR("part_name is NULL!!"); + LOGE("part_name is NULL!!"); return; } if (!text) { - ERR("text is NULL!!"); + LOGE("text is NULL!!"); return; } @@ -3760,7 +4410,7 @@ eext_rotary_selector_item_part_text_set(Eext_Object_Item *item, const char *part rsd = _eext_rotary_selector_data_get(rotary_selector_item->rotary_selector); if (!rsd) { - ERR("rsd is NULL!!"); + LOGE("rsd is NULL!!"); return; } @@ -3770,11 +4420,20 @@ eext_rotary_selector_item_part_text_set(Eext_Object_Item *item, const char *part } else if (!strcmp(part_name, "selector,sub_text")) { + //ONEUI1.5(20180726): Support accessibility for sub_text toggle item case + if (elm_atspi_bridge_utils_is_screen_reader_enabled() && + rotary_selector_item->text2 != NULL && + rotary_selector_item->base.obj == (Evas_Object *)elm_object_accessibility_currently_highlighted_get() && + strcmp(rotary_selector_item->text2, text)) + { + efl_access_state_changed_signal_emit(rotary_selector_item->base.obj, EFL_ACCESS_STATE_TYPE_HIGHLIGHTED, EINA_TRUE); + } + // _item_text_copy(&(rotary_selector_item->text2), text); } else { - ERR("Not supported part name [%s]", part_name); + LOGE("Not supported part name [%s]", part_name); return; } @@ -3790,7 +4449,7 @@ eext_rotary_selector_item_part_text_get(const Eext_Object_Item *item, const char if (!rotary_selector_item) { - ERR("item is NULL!!"); + LOGE("item is NULL!!"); return NULL; } if (!strcmp(part_name, "selector,main_text")) @@ -3812,22 +4471,22 @@ eext_rotary_selector_item_domain_translatable_part_text_set(Eext_Object_Item *it if (!rotary_selector_item) { - ERR("rotary_selector_item is NULL!!"); + LOGE("rotary_selector_item is NULL!!"); return; } if (!part_name) { - ERR("part_name is NULL!!"); + LOGE("part_name is NULL!!"); return; } if (!domain) { - ERR("domain is NULL!!"); + LOGE("domain is NULL!!"); return; } if (!text) { - ERR("text is NULL!!"); + LOGE("text is NULL!!"); return; } @@ -3835,7 +4494,7 @@ eext_rotary_selector_item_domain_translatable_part_text_set(Eext_Object_Item *it rsd = _eext_rotary_selector_data_get(rotary_selector_item->rotary_selector); if (!rsd) { - ERR("rsd is NULL!!"); + LOGE("rsd is NULL!!"); return; } @@ -3846,12 +4505,21 @@ eext_rotary_selector_item_domain_translatable_part_text_set(Eext_Object_Item *it } else if (!strcmp(part_name, "selector,sub_text")) { + //ONEUI1.5(20180706): Support accessibility for sub_text toggle item case + if (elm_atspi_bridge_utils_is_screen_reader_enabled() && + rotary_selector_item->text2 != NULL && + rotary_selector_item->base.obj == (Evas_Object *)elm_object_accessibility_currently_highlighted_get() && + strcmp(rotary_selector_item->text2, text)) + { + efl_access_state_changed_signal_emit(rotary_selector_item->base.obj, EFL_ACCESS_STATE_TYPE_HIGHLIGHTED, EINA_TRUE); + } + // _item_text_copy(&(rotary_selector_item->domain), domain); _item_text_copy(&(rotary_selector_item->text2), text); } else { - ERR("Not supported part name [%s]", part_name); + LOGE("Not supported part name [%s]", part_name); return; } @@ -3868,29 +4536,29 @@ eext_rotary_selector_item_part_content_set(Eext_Object_Item *item, const char *p Eext_Rotary_Selector_Item *rotary_selector_item = (Eext_Rotary_Selector_Item *)item; if (!rotary_selector_item) { - ERR("rotary_selector_item is NULL!!"); + LOGE("rotary_selector_item is NULL!!"); return; } if (!part_name) { - ERR("part_name is NULL!!"); + LOGE("part_name is NULL!!"); return; } if (!content) { - ERR("content is NULL!!"); + LOGE("content is NULL!!"); return; } if (state != EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL) { - ERR("Not implemented!!"); + LOGE("Not implemented!!"); return; } Eext_Rotary_Selector_Data *rsd = NULL; rsd = _eext_rotary_selector_data_get(rotary_selector_item->rotary_selector); if (!rsd) { - ERR("rsd is NULL!!"); + LOGE("rsd is NULL!!"); return; } // for Accessibility @@ -3925,7 +4593,7 @@ eext_rotary_selector_item_part_content_set(Eext_Object_Item *item, const char *p } else { - ERR("Not supported part name!!"); + LOGE("Not supported part name!!"); return; } @@ -3939,17 +4607,17 @@ eext_rotary_selector_item_part_content_get(const Eext_Object_Item *item, const c if (!rotary_selector_item) { - ERR("rotary_selector_item is NULL!!"); + LOGE("rotary_selector_item is NULL!!"); return NULL; } if (!part_name) { - ERR("part_name is NULL!!"); + LOGE("part_name is NULL!!"); return NULL; } if (state != EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL) { - ERR("Not implemented!!"); + LOGE("Not implemented!!"); return NULL; } @@ -3967,7 +4635,7 @@ eext_rotary_selector_item_part_content_get(const Eext_Object_Item *item, const c } else { - ERR("Not supported part name!!"); + LOGE("Not supported part name!!"); return NULL; } @@ -3981,29 +4649,29 @@ eext_rotary_selector_part_content_set(Evas_Object *obj, const char *part_name, E if (!obj) { - ERR("obj is NULL!!"); + LOGE("obj is NULL!!"); return; } if (!part_name) { - ERR("part_name is NULL!!"); + LOGE("part_name is NULL!!"); return; } if (!content) { - ERR("content is NULL!!"); + LOGE("content is NULL!!"); return; } if (strcmp(part_name, "selector,bg_image")) { - ERR("Not supported part name!!!"); + LOGE("Not supported part name!!!"); return; } if (state != EEXT_ROTARY_SELECTOR_SELECTOR_STATE_NORMAL) { - ERR("Not implemented!!"); + LOGE("Not implemented!!"); return; } @@ -4011,7 +4679,7 @@ eext_rotary_selector_part_content_set(Evas_Object *obj, const char *part_name, E rsd = _eext_rotary_selector_data_get(obj); if (!rsd) { - ERR("rsd is NULL!!"); + LOGE("rsd is NULL!!"); return; } @@ -4025,23 +4693,23 @@ eext_rotary_selector_part_content_get(const Evas_Object *obj, const char *part_n //Supported part names : "selector,bg_image" if (!obj) { - ERR("obj is NULL!!"); + LOGE("obj is NULL!!"); return NULL; } if (!part_name) { - ERR("part_name is NULL!!"); + LOGE("part_name is NULL!!"); return NULL; } if (strcmp(part_name, "selector,bg_image")) { - ERR("Not supported part name!!!"); + LOGE("Not supported part name!!!"); return NULL; } if (state != EEXT_ROTARY_SELECTOR_SELECTOR_STATE_NORMAL) { - ERR("Not implemented!!"); + LOGE("Not implemented!!"); return NULL; } @@ -4049,7 +4717,7 @@ eext_rotary_selector_part_content_get(const Evas_Object *obj, const char *part_n rsd = _eext_rotary_selector_data_get((Evas_Object *)obj); if (!rsd) { - ERR("rsd is NULL!!"); + LOGE("rsd is NULL!!"); return NULL; } @@ -4064,12 +4732,12 @@ eext_rotary_selector_item_part_color_set(Eext_Object_Item *item, const char *par if (!rotary_selector_item) { - ERR("rotary_selector_item is NULL!!"); + LOGE("rotary_selector_item is NULL!!"); return; } if (!part_name) { - ERR("part_name is NULL!!"); + LOGE("part_name is NULL!!"); return; } @@ -4165,7 +4833,7 @@ eext_rotary_selector_item_part_color_set(Eext_Object_Item *item, const char *par } else { - ERR("Not supported part name [%s]", part_name); + LOGE("Not supported part name [%s]", part_name); return; } @@ -4179,12 +4847,12 @@ eext_rotary_selector_item_part_color_get(const Eext_Object_Item *item, const cha if (!rotary_selector_item) { - ERR("rotary_selector_item is NULL!!"); + LOGE("rotary_selector_item is NULL!!"); return; } if (!part_name) { - ERR("part_name is NULL!!"); + LOGE("part_name is NULL!!"); return; } @@ -4234,7 +4902,7 @@ eext_rotary_selector_item_part_color_get(const Eext_Object_Item *item, const cha } else { - ERR("Not supported part name [%s]", part_name); + LOGE("Not supported part name [%s]", part_name); return; } } @@ -4248,12 +4916,12 @@ eext_rotary_selector_part_color_set(Evas_Object *obj, const char *part_name, Eex if (!rsd) { - ERR("rsd is NULL!!"); + LOGE("rsd is NULL!!"); return; } if (!part_name) { - ERR("part_name is NULL!!"); + LOGE("part_name is NULL!!"); return; } @@ -4282,7 +4950,7 @@ eext_rotary_selector_part_color_set(Evas_Object *obj, const char *part_name, Eex } else { - ERR("Not supported part name [%s]", part_name); + LOGE("Not supported part name [%s]", part_name); return; } @@ -4297,12 +4965,12 @@ eext_rotary_selector_part_color_get(const Evas_Object *obj, const char *part_nam if (!rsd) { - ERR("rsd is NULL!!"); + LOGE("rsd is NULL!!"); return; } if (!part_name) { - ERR("part_name is NULL!!"); + LOGE("part_name is NULL!!"); return; } @@ -4320,7 +4988,7 @@ eext_rotary_selector_part_color_get(const Evas_Object *obj, const char *part_nam } else { - ERR("Not supported part name [%s]", part_name); + LOGE("Not supported part name [%s]", part_name); return; } } @@ -4333,14 +5001,14 @@ eext_rotary_selector_selected_item_set(Evas_Object *obj, Eext_Object_Item *item) if (!rotary_selector_item) { - ERR("rotary_selector_item is NULL!!"); + LOGE("rotary_selector_item is NULL!!"); return; } rsd = _eext_rotary_selector_data_get(obj); if (!rsd) { - ERR("rsd is NULL!!"); + LOGE("rsd is NULL!!"); return; } if (rsd->item_update_animator) @@ -4358,7 +5026,7 @@ eext_rotary_selector_selected_item_set(Evas_Object *obj, Eext_Object_Item *item) _item_update_animation_run(rsd); } - INF("selected item index(%d)", rsd->selected_index); + LOGI("selected item index(%d)", rsd->selected_index); } EAPI Eext_Object_Item* @@ -4367,7 +5035,7 @@ eext_rotary_selector_selected_item_get(const Evas_Object *obj) Eext_Rotary_Selector_Data *rsd = _eext_rotary_selector_data_get((Evas_Object *)obj); if (!rsd) { - ERR("rsd is NULL!!"); + LOGE("rsd is NULL!!"); return NULL; } @@ -4380,7 +5048,7 @@ eext_rotary_selector_items_get(const Evas_Object *obj) Eext_Rotary_Selector_Data *rsd = _eext_rotary_selector_data_get((Evas_Object *)obj); if (!rsd) { - ERR("rsd is NULL!!"); + LOGE("rsd is NULL!!"); return NULL; } @@ -4393,7 +5061,7 @@ eext_rotary_selector_editing_enabled_get(const Evas_Object *obj) Eext_Rotary_Selector_Data *rsd = _eext_rotary_selector_data_get(obj); if (!rsd) { - ERR("rsd is NULL!!"); + LOGE("rsd is NULL!!"); return EINA_FALSE; } return rsd->edit_mode_enabled; @@ -4405,7 +5073,7 @@ eext_rotary_selector_editing_enabled_set(Evas_Object *obj, Eina_Bool enabled) Eext_Rotary_Selector_Data *rsd = _eext_rotary_selector_data_get(obj); if (!rsd) { - ERR("rsd is NULL!!"); + LOGE("rsd is NULL!!"); return; } rsd->edit_mode_enabled = enabled; @@ -4417,7 +5085,7 @@ eext_rotary_selector_add_item_enabled_get(const Evas_Object *obj) Eext_Rotary_Selector_Data *rsd = _eext_rotary_selector_data_get(obj); if (!rsd) { - ERR("rsd is NULL!!"); + LOGE("rsd is NULL!!"); return EINA_FALSE; } return rsd->add_enabled; @@ -4429,7 +5097,7 @@ eext_rotary_selector_add_item_enabled_set(Evas_Object *obj, Eina_Bool enabled) Eext_Rotary_Selector_Data *rsd = _eext_rotary_selector_data_get(obj); if (!rsd) { - ERR("rsd is NULL!!"); + LOGE("rsd is NULL!!"); return; } @@ -4460,7 +5128,7 @@ eext_rotary_selector_item_delete_enabled_get(const Eext_Object_Item *item) if (!rotary_selector_item) { - ERR("rotary_selector_item is NULL!!"); + LOGE("rotary_selector_item is NULL!!"); return EINA_FALSE; } @@ -4474,7 +5142,7 @@ eext_rotary_selector_item_delete_enabled_set(Eext_Object_Item *item, Eina_Bool e if (!rotary_selector_item) { - ERR("rotary_selector_item is NULL!!"); + LOGE("rotary_selector_item is NULL!!"); return; } @@ -4482,6 +5150,38 @@ eext_rotary_selector_item_delete_enabled_set(Eext_Object_Item *item, Eina_Bool e } // ----------------------------------------- Accessibility API --------------------------------------// +static void +_accessibility_rotary_highlighted_cb(void *data, Evas_Object *obj, void *event_info) +{ + Eext_Rotary_Selector_Data *rsd = data; + if (!rsd) return; + rsd->highlighted = EINA_TRUE; + rsd->rot_highlighted = EINA_TRUE; +} + +static void +_accessibility_rotary_unhighlighted_cb(void *data, Evas_Object *obj, void *event_info) +{ + Eext_Rotary_Selector_Data *rsd = data; + if (!rsd) return; + rsd->highlighted = EINA_FALSE; + rsd->rot_highlighted = EINA_FALSE; +} + +//ONEUI1.5(20180709): On double tap and hold, mouse down, up are sent in access mode +static void +_accessibility_theme_changed_cb(void *data, Evas_Object *obj, void *event_info) +{ + //for accessibility + if (elm_atspi_bridge_utils_is_screen_reader_enabled()) + { + elm_object_signal_emit(obj, "elm,action,access_on", "elm"); + } + // +} +// + + static void _accessibility_item_btn_highlighted_cb(void *data, Evas_Object *obj, void *event_info) { @@ -4561,24 +5261,51 @@ _rotary_selector_moreoption_opened_cb(void *data, Evas_Object *obj, void *event_ rsd = data; if (!rsd) { - ERR("rsd is NULL!!"); + LOGE("rsd is NULL!!"); return; } rsd->is_first_rotary_control = EINA_TRUE; } - -static void -_accessibility_item_btn_clicked_cb(void *data, Evas_Object *obj, void *event_info) +static char * +_accessibility_item_name_set_cb(void *data, Evas_Object *obj) { - INF("called!!"); + Eext_Rotary_Selector_Item *item = (Eext_Rotary_Selector_Item*)data; + Eext_Rotary_Selector_Data *rsd = _eext_rotary_selector_data_get(item->rotary_selector); - Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data; - if (rsd) + char buf[255] = ""; + if (rsd && item->text1) + { + strncat(buf, elm_object_part_text_get(elm_object_part_content_get(rsd->rotary_selector, "content"), "selector,main_text"), sizeof(buf) - strlen(buf) - 1); + } + if (rsd && item->text2) + { + strncat(buf, " ", sizeof(buf) - strlen(buf) - 1); + strncat(buf, elm_object_part_text_get(elm_object_part_content_get(rsd->rotary_selector, "content"), "selector,sub_text"), sizeof(buf) - strlen(buf) - 1); + } + //ONEUI1.5(20180516): speak add_item main title when screen-reader + if (rsd && rsd->add_item && item->index == rsd->add_item->index) + { + strncat(buf, " ", sizeof(buf) - strlen(buf) - 1); + strncat(buf, elm_object_part_text_get(elm_object_part_content_get(rsd->rotary_selector, "content"), "selector,main_text"), sizeof(buf) - strlen(buf) - 1); + } + // + if (rsd && rsd->edit_mode_enabled && rsd->editing) { - evas_object_smart_callback_call(rsd->rotary_selector, "item,clicked", (void*)_item_get(rsd, rsd->selected_index)); + if (item->text1) strncpy(buf, item->text1, sizeof(buf) - strlen(buf) - 1); + if (item->text2) + { + strncat(buf, " ", sizeof(buf) - strlen(buf) - 1); + strncat(buf, item->text2, sizeof(buf) - strlen(buf) - 1); + } + if (item->delete_enabled) + { + strncat(buf, " ", sizeof(buf) - strlen(buf) - 1); + strncat(buf, _("WDS_ACCS_TBBODY_DOUBLE_TAP_TO_REMOVE"), sizeof(buf) - strlen(buf) - 1); + } } + return strdup(buf); } static void @@ -4602,28 +5329,39 @@ _rotary_selector_screen_reader_changed(void *data, Evas_Object *obj, void *event EINA_LIST_FOREACH(rsd->item_list, l, item) { evas_object_freeze_events_set(item->base.obj, EINA_FALSE); - evas_object_smart_callback_add(item->base.obj, "clicked",_accessibility_item_btn_clicked_cb, (Eext_Rotary_Selector_Data*)rsd); + //ONEUI1.5(20180709): On double tap and hold, mouse down, up are sent in access mode + elm_object_signal_emit(item->base.obj, "elm,action,access_on", "elm"); + // evas_object_smart_callback_add(item->base.obj, "atspi,highlighted", _accessibility_item_btn_highlighted_cb, (Eext_Rotary_Selector_Data*)rsd); - elm_atspi_accessible_gesture_cb_set(item->base.obj, _accessibility_item_gesutre_cb, (Eext_Rotary_Selector_Data*)rsd); + evas_object_smart_callback_add(item->base.obj, "theme,changed", _accessibility_theme_changed_cb, (Eext_Rotary_Selector_Data*)rsd); + elm_atspi_accessible_gesture_cb_set(item->base.obj, _accessibility_item_gesture_cb, (Eext_Rotary_Selector_Data*)rsd); if (prev_item) { _accessibility_rotary_selector_item_relationship_set(prev_item->base.obj, item->base.obj); } + _accessibility_item_name_set(rsd, item); prev_item = item; } _accessibility_item_chain_end_set(rsd); rsd->is_first_rotary_control = EINA_TRUE; + elm_gesture_layer_cb_set(rsd->gesture_layer, ELM_GESTURE_N_FLICKS, + ELM_GESTURE_STATE_END, _on_flick_end_cb, rsd); } else { EINA_LIST_FOREACH(rsd->item_list, l, item) { evas_object_freeze_events_set(item->base.obj, EINA_TRUE); - evas_object_smart_callback_del(item->base.obj, "clicked",_accessibility_item_btn_clicked_cb); + //ONEUI1.5(20180709): On double tap and hold, mouse down, up are sent in access mode + elm_object_signal_emit(item->base.obj, "elm,action,access_off", "elm"); + // evas_object_smart_callback_del(item->base.obj, "atspi,highlighted", _accessibility_item_btn_highlighted_cb); + evas_object_smart_callback_del(item->base.obj, "theme,changed", _accessibility_theme_changed_cb); elm_atspi_accessible_gesture_cb_set(item->base.obj, NULL, NULL); } evas_object_smart_callback_del(rsd->rotary_selector, "more,option,opened", _rotary_selector_moreoption_opened_cb); + elm_gesture_layer_cb_del(rsd->gesture_layer, ELM_GESTURE_N_FLICKS, + ELM_GESTURE_STATE_END, _on_flick_end_cb, rsd); } } @@ -4635,12 +5373,11 @@ _accessibility_rotary_selector_item_relationship_set(Evas_Object* obj, Evas_Obje } static Eina_Bool -_accessibility_item_gesutre_cb(void *data, Elm_Atspi_Gesture_Info gesture_info, Evas_Object *obj) +_accessibility_item_gesture_cb(void *data, Elm_Atspi_Gesture_Info gesture_info, Evas_Object *obj) { Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data*)data; if (!rsd) return EINA_FALSE; - if (rsd->previous_page_animator || rsd->next_page_animator) return EINA_FALSE; @@ -4654,12 +5391,37 @@ _accessibility_item_gesutre_cb(void *data, Elm_Atspi_Gesture_Info gesture_info, if (!item) return EINA_FALSE; + LOGI("Gesture_type = %d x_beg = %d, x_end=%d y_beg=%d y_end=%d",gesture_info.type, + gesture_info.x_beg, gesture_info.x_end, gesture_info.y_beg, gesture_info.y_end); + + int first_index = rsd->current_page*_ROTARY_SELECTOR_PAGE_ITEM_MAX; + int last_index = 0; + int previous_item_index = rsd->selected_index; + if (rsd->current_page == 0) + { + last_index = _ROTARY_SELECTOR_PAGE_ITEM_MAX - 1; + } + else + { + last_index = (rsd->current_page + 1) * _ROTARY_SELECTOR_PAGE_ITEM_MAX - 1; + } + if (last_index > rsd->item_count - 1) + { + last_index = rsd->item_count - 1; + } switch (gesture_info.type) { case ELM_ATSPI_GESTURE_ONE_FINGER_FLICK_LEFT: if (item->index % (_ROTARY_SELECTOR_PAGE_ITEM_MAX) == 0 && item->index - 1 > 0) { rsd->selected_index = item->index - 1; + //ONEUI1.5(20180712):Prevent same page transition more safety + if ((rsd->selected_index / _ROTARY_SELECTOR_PAGE_ITEM_MAX) == rsd->current_page) + { + _item_select(rsd, rsd->selected_index); + return EINA_TRUE; + } + // _page_animation_run(rsd, EINA_FALSE); _selector_update(rsd, EINA_TRUE, EINA_TRUE, EINA_TRUE); Eext_Rotary_Selector_Item *_item = _item_get(rsd, rsd->selected_index); @@ -4669,11 +5431,18 @@ _accessibility_item_gesutre_cb(void *data, Elm_Atspi_Gesture_Info gesture_info, return EINA_TRUE; } } - break; + break; case ELM_ATSPI_GESTURE_ONE_FINGER_FLICK_RIGHT: if (item->index % (_ROTARY_SELECTOR_PAGE_ITEM_MAX) == _ROTARY_SELECTOR_PAGE_ITEM_MAX - 1 && rsd->selected_index < rsd->item_count - 1) { rsd->selected_index = item->index + 1; + //ONEUI1.5(20180712):Prevent same page transition more safety + if ((rsd->selected_index / _ROTARY_SELECTOR_PAGE_ITEM_MAX) == rsd->current_page) + { + _item_select(rsd, rsd->selected_index); + return EINA_TRUE; + } + // _page_animation_run(rsd, EINA_TRUE); _selector_update(rsd, EINA_TRUE, EINA_TRUE, EINA_TRUE); Eext_Rotary_Selector_Item *_item = _item_get(rsd, rsd->selected_index); @@ -4683,9 +5452,67 @@ _accessibility_item_gesutre_cb(void *data, Elm_Atspi_Gesture_Info gesture_info, return EINA_TRUE; } } + break; + //ONEUI1.5(20180614): Edit mode screen reader support + case ELM_ATSPI_GESTURE_ONE_FINGER_DOUBLE_TAP: + { + Eext_Rotary_Selector_Item *_item = _item_get(rsd, rsd->selected_index); + + if (_item) + { + if (rsd->editing) + { + if (_item != rsd->add_item && _item->delete_enabled) _delete_item(rsd, _item); + return EINA_TRUE; + } + //ONEUI1.5(20180615): Clicked signal not sent issue fix + else + { + if (_item != rsd->add_item) + evas_object_smart_callback_call(rsd->rotary_selector, "item,clicked", (void*)_item); + else + evas_object_smart_callback_call(rsd->rotary_selector, + "add_item,clicked", NULL); + } + // + } + } + break; + case ELM_ATSPI_GESTURE_TWO_FINGERS_FLICK_RIGHT: + if (rsd->current_page > 0) + { + rsd->selected_index = first_index - 1; + _item_selected_signal_send(rsd, previous_item_index, rsd->selected_index); + _page_animation_run(rsd, EINA_FALSE); + _selector_update(rsd, EINA_TRUE, EINA_TRUE, EINA_TRUE); + evas_object_smart_callback_call(rsd->rotary_selector, "item,selected", (void*)_item_get(rsd, rsd->selected_index)); + return EINA_TRUE; + } + break; + case ELM_ATSPI_GESTURE_TWO_FINGERS_FLICK_LEFT: + if (rsd->current_page < ((rsd->item_count - 1) / _ROTARY_SELECTOR_PAGE_ITEM_MAX)) + { + rsd->selected_index = last_index + 1; + _item_selected_signal_send(rsd, previous_item_index, rsd->selected_index); + _page_animation_run(rsd, EINA_TRUE); + _selector_update(rsd, EINA_TRUE, EINA_TRUE, EINA_TRUE); + evas_object_smart_callback_call(rsd->rotary_selector, "item,selected", (void*)_item_get(rsd, rsd->selected_index)); + return EINA_TRUE; + } + break; + //ONEUI1.5(20180704):Consume hover and tap event to avoid highlight while dnd + case ELM_ATSPI_GESTURE_ONE_FINGER_HOVER: + if (rsd->editing) + return EINA_TRUE; break; - default: + case ELM_ATSPI_GESTURE_ONE_FINGER_SINGLE_TAP: + if (rsd->editing && gesture_info.state == EFL_ACCESS_GESTURE_STATE_ABORT) + return EINA_TRUE; + break; + // + default: break; + // } return EINA_FALSE; } @@ -4695,17 +5522,16 @@ _accessibility_item_name_set(Eext_Rotary_Selector_Data *rsd, Eext_Rotary_Selecto { if (!rsd || !it) return; - char buf[255] = ""; - if (rsd && it->text1) - { - strncat(buf, elm_object_part_text_get(elm_object_part_content_get(rsd->rotary_selector, "content"), "selector,main_text"), sizeof(buf) - strlen(buf) - 1); - } - if (rsd && it->text2) + Eina_List *l = NULL; + Eext_Rotary_Selector_Item *_item = NULL; + int i = 0; + EINA_LIST_FOREACH(rsd->item_list, l, _item) { - strncat(buf, " ", sizeof(buf) - strlen(buf) - 1); - strncat(buf, elm_object_part_text_get(elm_object_part_content_get(rsd->rotary_selector, "content"), "selector,sub_text"), sizeof(buf) - strlen(buf) - 1); + if (_item == it) + break; + i++; } - elm_atspi_accessible_name_set(it->base.obj, buf); + elm_atspi_accessible_name_cb_set(it->base.obj, _accessibility_item_name_set_cb, (Eext_Rotary_Selector_Item*)it); elm_atspi_accessible_reading_info_type_set(it->base.obj, ELM_ACCESSIBLE_READING_INFO_TYPE_NAME); } @@ -4723,7 +5549,8 @@ static void _accessibility_item_chain_end_set(Eext_Rotary_Selector_Data *rsd) if (l_count == 1) { Eext_Rotary_Selector_Item *_item = eina_list_nth(rsd->item_list, 0); - elm_atspi_accessible_attribute_append(_item->base.obj, "relation_chain_end", "prev,next,end"); + if (_item) + elm_atspi_accessible_attribute_append(_item->base.obj, "relation_chain_end", "prev,next,end"); } else { @@ -4736,8 +5563,10 @@ static void _accessibility_item_chain_end_set(Eext_Rotary_Selector_Data *rsd) { elm_atspi_accessible_attribute_append(_item->base.obj, "relation_chain_end", "not,end"); } - elm_atspi_accessible_attribute_append(first_item->base.obj, "relation_chain_end", "prev,end"); - elm_atspi_accessible_attribute_append(last_item->base.obj, "relation_chain_end", "next,end"); + if (first_item) + elm_atspi_accessible_attribute_append(first_item->base.obj, "relation_chain_end", "prev,end"); + if (last_item) + elm_atspi_accessible_attribute_append(last_item->base.obj, "relation_chain_end", "next,end"); } } //