From 5957b118de7e01ca23cee9bf5cc3ad66c1b9fcfd Mon Sep 17 00:00:00 2001 From: ChunEon Park Date: Thu, 12 Sep 2013 23:24:02 +0900 Subject: [PATCH] elementary - introduces 3 apis elm_object_item_track/untrack/track_get(). --- legacy/elementary/ChangeLog | 5 + legacy/elementary/NEWS | 1 + legacy/elementary/src/examples/Makefile.am | 6 +- legacy/elementary/src/lib/elm_main.c | 19 +++ legacy/elementary/src/lib/elm_object_item.h | 73 +++++++++++ legacy/elementary/src/lib/elm_widget.c | 129 ++++++++++++++++++++ legacy/elementary/src/lib/elm_widget.h | 5 + 7 files changed, 236 insertions(+), 2 deletions(-) diff --git a/legacy/elementary/ChangeLog b/legacy/elementary/ChangeLog index 973c714c9f..4eced1316e 100644 --- a/legacy/elementary/ChangeLog +++ b/legacy/elementary/ChangeLog @@ -1611,3 +1611,8 @@ 2013-09-12 Ryuan Choi (ryuan) * elc_fileselector : Added "selected,invalid" smart callbacks. + +2013-09-12 ChunEon Park (Hermet) + + * elm_object_item : Introduces new APIs, elm_object_item_track(), + elm_object_item_untrack(), elm_object_item_track_get(). diff --git a/legacy/elementary/NEWS b/legacy/elementary/NEWS index 029433f872..78c1369a82 100644 --- a/legacy/elementary/NEWS +++ b/legacy/elementary/NEWS @@ -89,6 +89,7 @@ Additions: * Add elm_table_child_get(). * Add support for flip focus direction. * Add "selected,invalid" smart callback for fileselector. + * elm_object_item : Introduces new APIs, elm_object_item_track(), elm_object_item_untrack(), elm_object_item_track_get(). Improvements: diff --git a/legacy/elementary/src/examples/Makefile.am b/legacy/elementary/src/examples/Makefile.am index 07b29dee77..32beda884f 100644 --- a/legacy/elementary/src/examples/Makefile.am +++ b/legacy/elementary/src/examples/Makefile.am @@ -148,7 +148,8 @@ transit_example_03.c \ transit_example_04.c \ web_example_01.c \ web_example_02.c \ -win_example.c +win_example.c \ +track_example_01.c .edc.edj: $(EDJE_CC) $(EDJE_FLAGS) $< $@ @@ -286,7 +287,8 @@ transit_example_03 \ transit_example_04 \ web_example_01 \ web_example_02 \ -win_example +win_example \ +track_example_01.c if ELEMENTARY_WINDOWS_BUILD efl_thread_1_SOURCES = efl_thread_win32_1.c diff --git a/legacy/elementary/src/lib/elm_main.c b/legacy/elementary/src/lib/elm_main.c index 17654c6c04..f3c9a1fb68 100644 --- a/legacy/elementary/src/lib/elm_main.c +++ b/legacy/elementary/src/lib/elm_main.c @@ -1899,3 +1899,22 @@ elm_object_item_cursor_engine_only_get(const Elm_Object_Item *it) { return elm_widget_item_cursor_engine_only_get(it); } + +EAPI Evas_Object * +elm_object_item_track(Elm_Object_Item *it) +{ + return elm_widget_item_track((Elm_Widget_Item *)it); +} + +void +elm_object_item_untrack(Elm_Object_Item *it) +{ + elm_widget_item_untrack((Elm_Widget_Item *)it); +} + +int +elm_object_item_track_get(const Elm_Object_Item *it) +{ + return elm_widget_item_track_get((Elm_Widget_Item *)it); +} + diff --git a/legacy/elementary/src/lib/elm_object_item.h b/legacy/elementary/src/lib/elm_object_item.h index 8a0ccde906..cce8f8dfc8 100644 --- a/legacy/elementary/src/lib/elm_object_item.h +++ b/legacy/elementary/src/lib/elm_object_item.h @@ -652,3 +652,76 @@ EAPI void elm_object_item_cursor_engine_only_set(Elm_Obj * @ingroup General */ EAPI Eina_Bool elm_object_item_cursor_engine_only_get(const Elm_Object_Item *it); + +/** + * This returns track object of the item. + * + * @param it The Elementary Object Item to be tracked. + * @return The track object. + * + * @note This gets a rectangle object that represents the object item's internal + * object. If you wanna check the geometry, visibility of the item, you + * can call the evas apis such as evas_object_geometry_get(), + * evas_object_visible_get() to the track object. Note that all of the + * widget items may/may not have the internal object so this api may + * return @c NULL if the widget item doesn't have it. Additionally, the + * widget item is managed/controlled by the widget, the widget item could + * be changed(moved, resized even deleted) anytime by it's own widget's + * decision. So please dont' change the track object as well as don't + * keep the track object in your side as possible but get the track object + * at the moment you need to refer. Otherwise, you need to add some + * callbacks to the track object to track it's attributes changes. + * + * @warning After use the track object, please call the + * elm_object_item_untrack() paired to elm_object_item_track() + * definitely to free the track object properly. Don't delete the + * track object. + * + * @see elm_object_item_untrack() + * @see elm_object_item_track_get() + * + * @since 1.8 + * + * @ingroup General + */ +EAPI Evas_Object *elm_object_item_track(Elm_Object_Item *it); + +/** + * This retrieve the track object of the item. + * + * @param it The Elementary Object Item that returned track object. + * + * @note This retrieves the track object that was returned from + * elm_object_item_track(). + * + * @see elm_object_item_track() + * @see elm_object_item_track_get() + * + * @since 1.8 + * + * @ingroup General + */ +EAPI void elm_object_item_untrack(Elm_Object_Item *it); + +/** + * Get the track object reference count. + * + * @param it The Elementary Object Item that returned track object. + * + * @note This gets the reference count for the track object. Whenever you call + * the elm_object_item_track(), the reference count will be increased by + * one. Likely the referece count will be decreased again when you call + * the elm_object_item_untrack(). Unless the reference count reaches to + * zero, the track object won't be deleted. So please be sure to call + * elm_object_item_untrack() paired to the elm_object_item_track() call + * count. + * + * @see elm_object_item_track() + * @see elm_object_item_track_get() + * + * @since 1.8 + * + * @ingroup General + */ +EAPI int elm_object_item_track_get(const Elm_Object_Item *it); + diff --git a/legacy/elementary/src/lib/elm_widget.c b/legacy/elementary/src/lib/elm_widget.c index c94f894da0..1aa2bbcb22 100644 --- a/legacy/elementary/src/lib/elm_widget.c +++ b/legacy/elementary/src/lib/elm_widget.c @@ -4867,6 +4867,68 @@ _elm_widget_orientation_set(Eo *obj __UNUSED__, void *_pd, va_list *list) if (ret) *ret = EINA_TRUE; } +static void +_track_obj_del(void *data, Evas *e, Evas_Object *obj, void *event_info); + +static void +_track_obj_update(Evas_Object *track, Evas_Object *obj) +{ + //Geometry + Evas_Coord x, y, w, h; + evas_object_geometry_get(obj, &x, &y, &w, &h); + evas_object_move(track, x, y); + evas_object_resize(track, w, h); + + //Visibility + if (evas_object_visible_get(obj)) evas_object_show(track); + else evas_object_hide(track); +} + +static void +_track_obj_view_update(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + Evas_Object *track = data; + _track_obj_update(track, obj); +} + +static void +_track_obj_view_del(void *data, Evas *e EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Elm_Widget_Item *item = data; + + while (evas_object_ref_get(item->track_obj) > 0) + evas_object_unref(item->track_obj); + + evas_object_event_callback_del(item->track_obj, EVAS_CALLBACK_DEL, + _track_obj_del); + evas_object_del(item->track_obj); + item->track_obj = NULL; +} + +static void +_track_obj_del(void *data, Evas *e EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Elm_Widget_Item *item = data; + item->track_obj = NULL; + + if (!item->view) return; + + evas_object_event_callback_del(item->view, EVAS_CALLBACK_RESIZE, + _track_obj_view_update); + evas_object_event_callback_del(item->view, EVAS_CALLBACK_MOVE, + _track_obj_view_update); + evas_object_event_callback_del(item->view, EVAS_CALLBACK_SHOW, + _track_obj_view_update); + evas_object_event_callback_del(item->view, EVAS_CALLBACK_HIDE, + _track_obj_view_update); + evas_object_event_callback_del(item->view, EVAS_CALLBACK_DEL, + _track_obj_view_del); +} + + /** * @internal * @@ -4923,6 +4985,13 @@ _elm_widget_item_free(Elm_Widget_Item *item) if (item->access_info) eina_stringshare_del(item->access_info); + if (item->track_obj) + { + evas_object_event_callback_del(item->track_obj, EVAS_CALLBACK_DEL, + _track_obj_del); + evas_object_del(item->track_obj); + } + EINA_LIST_FREE(item->signals, wisd) { eina_stringshare_del(wisd->emission); @@ -5204,6 +5273,66 @@ _elm_widget_item_domain_part_text_translatable_set(Elm_Widget_Item *item, item->on_translate = EINA_FALSE; } +EAPI Evas_Object * +elm_widget_item_track(Elm_Widget_Item *item) +{ + ELM_WIDGET_ITEM_CHECK_OR_RETURN(item, NULL); + + if (item->track_obj) + { + evas_object_ref(item->track_obj); + return item->track_obj; + } + + if (!item->view) return NULL; + + Evas_Object *track = + evas_object_rectangle_add(evas_object_evas_get(item->widget)); + evas_object_color_set(track, 0, 0, 0, 0); + evas_object_pass_events_set(track, EINA_TRUE); + _track_obj_update(track, item->view); + evas_object_event_callback_add(track, EVAS_CALLBACK_DEL, _track_obj_del, + item); + + evas_object_event_callback_add(item->view, EVAS_CALLBACK_RESIZE, + _track_obj_view_update, track); + evas_object_event_callback_add(item->view, EVAS_CALLBACK_MOVE, + _track_obj_view_update, track); + evas_object_event_callback_add(item->view, EVAS_CALLBACK_SHOW, + _track_obj_view_update, track); + evas_object_event_callback_add(item->view, EVAS_CALLBACK_HIDE, + _track_obj_view_update, track); + evas_object_event_callback_add(item->view, EVAS_CALLBACK_DEL, + _track_obj_view_del, item); + + evas_object_ref(track); + + item->track_obj = track; + + return track; +} + +void +elm_widget_item_untrack(Elm_Widget_Item *item) +{ + ELM_WIDGET_ITEM_CHECK_OR_RETURN(item); + + if (!item->track_obj) return; + evas_object_unref(item->track_obj); + + if (evas_object_ref_get(item->track_obj) == 0) + evas_object_del(item->track_obj); +} + +int +elm_widget_item_track_get(const Elm_Widget_Item *item) +{ + ELM_WIDGET_ITEM_CHECK_OR_RETURN(item, 0); + + if (!item->track_obj) return 0; + return evas_object_ref_get(item->track_obj); +} + typedef struct _Elm_Widget_Item_Tooltip Elm_Widget_Item_Tooltip; struct _Elm_Widget_Item_Tooltip diff --git a/legacy/elementary/src/lib/elm_widget.h b/legacy/elementary/src/lib/elm_widget.h index 48d8736652..6b65601136 100644 --- a/legacy/elementary/src/lib/elm_widget.h +++ b/legacy/elementary/src/lib/elm_widget.h @@ -579,6 +579,7 @@ struct _Elm_Widget_Item Eina_List *access_order; Eina_Inlist *translate_strings; Eina_List *signals; + Evas_Object *track_obj; Eina_Bool disabled : 1; Eina_Bool on_translate : 1; @@ -772,6 +773,10 @@ EAPI const char * _elm_widget_item_translatable_part_text_get(const Elm_Widg EAPI void _elm_widget_item_translate(Elm_Widget_Item *item); EAPI void _elm_widget_item_domain_part_text_translatable_set(Elm_Widget_Item *item, const char *part, const char *domain, Eina_Bool translatable); +EAPI Evas_Object *elm_widget_item_track(Elm_Widget_Item *item); +EAPI void elm_widget_item_untrack(Elm_Widget_Item *item); +EAPI int elm_widget_item_track_get(const Elm_Widget_Item *item); + /** * Function to operate on a given widget's scrollabe children when necessary. * @warning free the returned list with eina_list_free().