hermet pushed a commit to branch master.
commit 1dcd32068b6690c4b474dd79aa82fa34e566eae6
Author: ChunEon Park <[email protected]>
Date: Thu Sep 12 23:24:02 2013 +0900
elementary - introduces 3 apis elm_object_item_track/untrack/track_get().
---
ChangeLog | 5 ++
NEWS | 1 +
src/examples/Makefile.am | 6 ++-
src/lib/elm_main.c | 19 +++++++
src/lib/elm_object_item.h | 73 ++++++++++++++++++++++++++
src/lib/elm_widget.c | 129 ++++++++++++++++++++++++++++++++++++++++++++++
src/lib/elm_widget.h | 5 ++
7 files changed, 236 insertions(+), 2 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 973c714..4eced13 100644
--- a/ChangeLog
+++ b/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/NEWS b/NEWS
index 029433f..78c1369 100644
--- a/NEWS
+++ b/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/src/examples/Makefile.am b/src/examples/Makefile.am
index 07b29de..32beda8 100644
--- a/src/examples/Makefile.am
+++ b/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/src/lib/elm_main.c b/src/lib/elm_main.c
index 17654c6..f3c9a1f 100644
--- a/src/lib/elm_main.c
+++ b/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/src/lib/elm_object_item.h b/src/lib/elm_object_item.h
index 8a0ccde..cce8f8d 100644
--- a/src/lib/elm_object_item.h
+++ b/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/src/lib/elm_widget.c b/src/lib/elm_widget.c
index c94f894..1aa2bbc 100644
--- a/src/lib/elm_widget.c
+++ b/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/src/lib/elm_widget.h b/src/lib/elm_widget.h
index 48d8736..6b65601 100644
--- a/src/lib/elm_widget.h
+++ b/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().
--
------------------------------------------------------------------------------
How ServiceNow helps IT people transform IT departments:
1. Consolidate legacy IT systems to a single system of record for IT
2. Standardize and globalize service processes across IT
3. Implement zero-touch automation to replace manual, redundant tasks
http://pubads.g.doubleclick.net/gampad/clk?id=51271111&iu=/4140/ostg.clktrk