} 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;
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;
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;
} 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;
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;
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;
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;
};
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
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;
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;
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;
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;
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 {
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;
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
%description devel
EFL extension library providing small utility functions (devel)
-
%if 0%{?gcov:1}
%package gcov
Summary: EFL extensiona library (gcov)
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})
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);
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),
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 &&
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;
}
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;
}
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;
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;
}
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;
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);
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;
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);
#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,
circle_obj->visible = EINA_TRUE;
_eext_circle_object_changed(circle_obj);
}
- else
- {
- evas_object_show(circle_obj->main_obj);
- }
}
static 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);
}
//////////////////////////////
{
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;
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);
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);
}
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;
}
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;
}
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);
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
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
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)
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;
}
#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";
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,
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)
_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
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)
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))
_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))
}
_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);
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;
}
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;
#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
#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 && \
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;
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;
}
(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);
}
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);
}
#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);
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;
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;
}
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;
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;
}
}
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;
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;
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;
if (set == NULL)
{
- ERR("Fail to sort the fonts");
+ LOGE("Fail to sort the fonts");
return NULL;
}
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;
}
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;
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);
}
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);
}
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_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);
}
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_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);
}
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)
{
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;
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);
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);
_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);
{
if (!item) return;
+ item->color_changed = EINA_TRUE;
if (item->color_transit.animator_cb)
{
_eext_circle_object_item_color_transit_animator_del(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);
double cubic_bezier_p2_x, double cubic_bezier_p2_y)
{
Eina_Bool ret;
- double value;
if (!item) return;
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
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
#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);
}
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;
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);
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)
#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"
#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
#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)
{
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)
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;
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
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)
{
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
_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,
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
}
if ((hide_waiting_time > 0.0) &&
+ (!data->handler_drag) &&
((data->policy_v == ELM_SCROLLER_POLICY_AUTO) ||
(data->policy_h == ELM_SCROLLER_POLICY_AUTO)))
{
}
}
-//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) &&
return;
_eext_circle_object_scroller_scrollbar_update(circle_obj,
- 0.3);
+ hide_waiting_time);
}
static void
{
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,
{
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
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;
}
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);
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;
{
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);
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,
{
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;
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.
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);
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 *
_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;
}
#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; \
#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)
{
}
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);
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)
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;
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)
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);
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
{
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;
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;
}
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;
}
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;
}
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)
{
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);
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)
{
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);
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;
}
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
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);
}
}
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();
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);
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);
_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)
{
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;
}
0.25, 0.46, 0.45, 1.0);
return EINA_TRUE;
-}
\ No newline at end of file
+}
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)
{
}
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;
}
{
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);
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);
if (!main_obj)
{
- ERR("Failed to create elm_table object.");
+ LOGE("Failed to create elm_table object.");
return NULL;
}
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;
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
if (!surface)
{
- ERR("Surface is NULL... Going to remove surface render function.");
+ LOGE("Surface is NULL... Going to remove surface render function.");
return;
}
{
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;
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))
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)
{
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;
_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;
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;
if (surface->main_obj == NULL)
{
- ERR("Fail to get buffer from image object!");
+ LOGE("Fail to get buffer from image object!");
return;
}
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);
}
{
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);
}
_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;
}
_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);
_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;
_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))
_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 &&
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;
}
{
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;
}
}
{
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;
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)
{
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);
}
}
+ 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);
}
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;
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);
}
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)
_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)
parent = elm_object_parent_widget_get(parent);
if (parent == surface->parent) break;
}
-
}
}
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) &&
_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) &&
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;
}
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);
{
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;
}
{
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;
}
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;
}
{
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);
}
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
_motion_changed_cb, NULL);
if (!_motion_handler)
{
- ERR("Cannot register generic ecore event handler");
+ LOGE("Cannot register generic ecore event handler");
return EINA_FALSE;
}
}
_ecore_detent_cb, NULL);
if (!_ecore_detent_handler)
{
- ERR("Cannot register ecore detent handler");
+ LOGE("Cannot register ecore detent handler");
return EINA_FALSE;
}
}
_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;
}
}
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;
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;
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;
{
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;
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;
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;
}
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)
{
{
data = cb->data;
_callbacks = eina_list_remove(_callbacks, cb);
- INF("Removed cb from callbacks");
+ LOGI("Removed cb from callbacks");
break;
}
cb = NULL;
}
}
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;
}
{
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)
{
{
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);
}
return EINA_FALSE;
}
+#include <system_info.h>
+#include <vconf.h>
+
+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;
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)
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;
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;
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;
}
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;
}
static void
_rotary_rotate_event_free(void *udata EINA_UNUSED, void *fdata)
{
- INF("In: ddata: %p", fdata);
+ LOGI("In: ddata: %p", fdata);
free(fdata);
}
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;
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);
}
}
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;
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;
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)
{
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
{
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;
}
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;
}
#include "wearable/circle/efl_extension_circle_private.h"
#include "wearable/efl_extension_common_private.h"
+#include <efl_util.h>
+//#include <gxt_buffer.h>
+
#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);
}
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
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
layout = elm_layout_add(parent);
if (!layout)
{
- ERR("drawer layout is NULL");
+ LOGE("drawer layout is NULL");
return NULL;
}
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);
mold = (Eext_More_Option_Data *)calloc(1, sizeof(Eext_More_Option_Data));
if (!mold)
{
- ERR("mold is NULL!!");
+ LOGE("mold is NULL!!");
return NULL;
}
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;
{
if (!more_option)
{
- ERR("more_option is NULL!!");
+ LOGE("more_option is NULL!!");
return NULL;
}
_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)
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);
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");
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);
}
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)
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);
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;
}
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;
}
mold->panel = _panel_create(mold->more_option, mold);
if (!mold->panel)
{
- ERR("panel is NULL!!");
+ LOGE("panel is NULL!!");
return NULL;
}
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");
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);
}
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;
}
{
if (!obj)
{
- ERR("obj is NULL!!");
+ LOGE("obj is NULL!!");
return;
}
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;
}
}
{
if (!obj)
{
- ERR("obj is NULL!!");
+ LOGE("obj is NULL!!");
return EEXT_MORE_OPTION_DIRECTION_RIGHT; // defalut
}
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;
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);
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);
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);
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
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;
}
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;
}
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;
}
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
{
if (!obj)
{
- ERR("obj is NULL!!");
+ LOGE("obj is NULL!!");
return;
}
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);
+ }
}
}
{
if (!obj)
{
- ERR("obj is NULL!!");
+ LOGE("obj is NULL!!");
return EINA_FALSE;
}
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
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
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
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
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
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:
}
return EINA_FALSE;
}
+
static char *
_accessibility_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
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;
}
#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)
if (!pd)
{
- ERR("pd is NULL!!");
+ LOGE("pd is NULL!!");
return NULL;
}
{
if (!eext_panel)
{
- ERR("eext_panel is NULL!!");
+ LOGE("eext_panel is NULL!!");
return NULL;
}
{
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)
{
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
{
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);
}
layout = elm_layout_add(parent);
if (!layout)
{
- ERR("eext_panel is NULL!!");
+ LOGE("eext_panel is NULL!!");
return NULL;
}
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;
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;
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);
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);
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);
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;
}
}
else
{
- ERR("Not supported part name!!!");
+ LOGE("Not supported part name!!!");
return;
}
}
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;
}
}
else
{
- ERR("Not supported part name!!!");
+ LOGE("Not supported part name!!!");
return NULL;
}
}
#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 ==================================== //
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
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);
// ----------------------------------------- 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 --------------------------------------//
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;
}
_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"));
{
_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;
}
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;
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;
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)
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)
{
}
return EVAS_EVENT_FLAG_ON_HOLD;
}
+//
static void
_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);
//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);
}
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)
_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;
}
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)
{
{
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;
}
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);
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
{
}
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);
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)
{
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;
}
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;
{
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;
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);
}
}
}
#if _ROTARY_SELECTOR_DEBUG_ENABLED
- INF("pressed_item_index : %d", rsd->pressed_item_index);
+ LOGI("pressed_item_index : %d", rsd->pressed_item_index);
#endif
}
}
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;
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)
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;
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);
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
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);
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");
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;
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;
}
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;
}
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;
}
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;
}
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;
}
{
if (!rotary_selector)
{
- ERR("rotary_selector is NULL!!");
+ LOGE("rotary_selector is NULL!!");
return NULL;
}
if (rsd->acceleration)
{
- INF("rotary acceleration!!");
+ LOGI("rotary acceleration!!");
return EINA_FALSE;
}
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
//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));
//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);
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
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
//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
//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)
{
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;
}
Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
if (!rsd)
{
- ERR("rsd is NULL!!");
+ LOGE("rsd is NULL!!");
return;
}
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)
ecore_animator_del(rsd->item_update_animator);
rsd->item_update_animator = NULL;
}
-
if (rsd->editing_timer)
{
ecore_timer_del(rsd->editing_timer);
evas_object_data_del(obj, EEXT_ROTARY_SELECTOR_DATA_KEY);
free(rsd);
+ //ONEUI1.5(20180614): Edit mode screen reader support
+ rsd = NULL;
+ //
}
static void
{
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++;
}
}
_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;
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
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
{
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");
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;
}
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;
}
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
}
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
{
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++;
_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
}
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
}
_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;
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);
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);
+ //
}
//
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)
{
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) &&
{
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++;
*target = malloc(sizeof(char)*size);
if (!(*target))
{
- ERR("allocation is failed!!");
+ LOGE("allocation is failed!!");
return;
}
memset(*target, 0, size);
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;
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();
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;
}
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;
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);
}
+ //
}
//
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;
}
map = evas_map_new(4);
if (!map)
{
- ERR("map is NULL!!");
+ LOGE("map is NULL!!");
return ECORE_CALLBACK_CANCEL;
}
Evas_Object *edje = elm_layout_edje_get(rsd->rotary_selector);
if (!edje)
{
- ERR("edje is NULL!!");
+ LOGE("edje is NULL!!");
return;
}
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)
{
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++;
}
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;
}
+ //
}
}
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)
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)
}
}
+//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)
{
Evas_Object *rotary_selector = elm_layout_add(parent);
if (!rotary_selector)
{
- ERR("rotary_selector is NULL!!");
+ LOGE("rotary_selector is NULL!!");
return NULL;
}
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);
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);
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);
{
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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);
}
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;
}
}
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);
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;
}
rsd = _eext_rotary_selector_data_get(rotary_selector_item->rotary_selector);
if (!rsd)
{
- ERR("rsd is NULL!!");
+ LOGE("rsd is NULL!!");
return;
}
}
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;
}
if (!rotary_selector_item)
{
- ERR("item is NULL!!");
+ LOGE("item is NULL!!");
return NULL;
}
if (!strcmp(part_name, "selector,main_text"))
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;
}
rsd = _eext_rotary_selector_data_get(rotary_selector_item->rotary_selector);
if (!rsd)
{
- ERR("rsd is NULL!!");
+ LOGE("rsd is NULL!!");
return;
}
}
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;
}
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
}
else
{
- ERR("Not supported part name!!");
+ LOGE("Not supported part name!!");
return;
}
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;
}
}
else
{
- ERR("Not supported part name!!");
+ LOGE("Not supported part name!!");
return NULL;
}
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;
}
rsd = _eext_rotary_selector_data_get(obj);
if (!rsd)
{
- ERR("rsd is NULL!!");
+ LOGE("rsd is NULL!!");
return;
}
//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;
}
rsd = _eext_rotary_selector_data_get((Evas_Object *)obj);
if (!rsd)
{
- ERR("rsd is NULL!!");
+ LOGE("rsd is NULL!!");
return NULL;
}
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;
}
}
else
{
- ERR("Not supported part name [%s]", part_name);
+ LOGE("Not supported part name [%s]", part_name);
return;
}
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;
}
}
else
{
- ERR("Not supported part name [%s]", part_name);
+ LOGE("Not supported part name [%s]", part_name);
return;
}
}
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;
}
}
else
{
- ERR("Not supported part name [%s]", part_name);
+ LOGE("Not supported part name [%s]", part_name);
return;
}
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;
}
}
else
{
- ERR("Not supported part name [%s]", part_name);
+ LOGE("Not supported part name [%s]", part_name);
return;
}
}
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)
_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*
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;
}
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;
}
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;
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;
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;
Eext_Rotary_Selector_Data *rsd = _eext_rotary_selector_data_get(obj);
if (!rsd)
{
- ERR("rsd is NULL!!");
+ LOGE("rsd is NULL!!");
return;
}
if (!rotary_selector_item)
{
- ERR("rotary_selector_item is NULL!!");
+ LOGE("rotary_selector_item is NULL!!");
return EINA_FALSE;
}
if (!rotary_selector_item)
{
- ERR("rotary_selector_item is NULL!!");
+ LOGE("rotary_selector_item is NULL!!");
return;
}
}
// ----------------------------------------- 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)
{
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
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);
}
}
}
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;
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);
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);
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;
}
{
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);
}
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
{
{
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");
}
}
//