summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJean-Philippe Andre <jp.andre@samsung.com>2016-04-21 15:39:31 +0900
committerJean-Philippe Andre <jp.andre@samsung.com>2016-04-26 11:36:23 +0900
commit27573e6e0bfeee08d7e133382729f14ceedac44a (patch)
treec5ae6605261addf689c75b7303b0190288e01368
parent07a996e6cc1241fb189ea41849cf48c2c3379bca (diff)
downloadefl-27573e6e0bfeee08d7e133382729f14ceedac44a.tar.gz
Edje: Convert access_part_list to an iterator
-rw-r--r--src/lib/edje/Edje_Legacy.h11
-rw-r--r--src/lib/edje/edje_object.eo11
-rw-r--r--src/lib/edje/edje_util.c75
3 files changed, 80 insertions, 17 deletions
diff --git a/src/lib/edje/Edje_Legacy.h b/src/lib/edje/Edje_Legacy.h
index e361befc5f..9e6adf5efd 100644
--- a/src/lib/edje/Edje_Legacy.h
+++ b/src/lib/edje/Edje_Legacy.h
@@ -289,6 +289,17 @@ EAPI Evas_Object *edje_object_part_swallow_get(const Edje_Object *obj, const cha
*/
EAPI void edje_object_part_unswallow(Edje_Object *obj, Evas_Object *obj_swallow);
+/**
+ * @brief Retrieve a list all accessibility part names
+ *
+ * @return A list all accessibility part names on obj
+ *
+ * @since 1.7.0
+ *
+ * @ingroup Edje_Object
+ */
+EAPI Eina_List *edje_object_access_part_list_get(const Edje_Object *obj);
+
#include "edje_object.eo.legacy.h"
#include "edje_edit.eo.legacy.h"
diff --git a/src/lib/edje/edje_object.eo b/src/lib/edje/edje_object.eo
index 40e7d7b73e..a214e5db48 100644
--- a/src/lib/edje/edje_object.eo
+++ b/src/lib/edje/edje_object.eo
@@ -352,13 +352,10 @@ class Edje.Object (Evas.Smart_Clipped, Efl.File, Efl.Container)
minh: Evas.Coord; [[Pointer to a variable where to store the minimum height]]
}
}
- @property access_part_list {
- get {
- [[Retrieve a list all accessibility part names
-
- @since 1.7.0]]
- return: list<const(char)*> *; [[A list all accessibility part names on obj]]
- }
+ access_part_iterate {
+ [[Iterate over all accessibility-enabled part names.]]
+ legacy: null;
+ return: free(own(iterator<const(char)*> *), eina_iterator_free);
}
@property load_error {
get {
diff --git a/src/lib/edje/edje_util.c b/src/lib/edje/edje_util.c
index e935c8d763..8f7899f022 100644
--- a/src/lib/edje/edje_util.c
+++ b/src/lib/edje/edje_util.c
@@ -4942,22 +4942,77 @@ _edje_object_part_box_remove_all(Eo *obj EINA_UNUSED, Edje *ed, const char *part
return ret;
}
-EOLIAN Eina_List *
-_edje_object_access_part_list_get(Eo *obj EINA_UNUSED, Edje *ed)
+typedef struct _Part_Iterator Part_Iterator;
+struct _Part_Iterator
{
- Eina_List *access_parts = NULL;
-
- if ((!ed)) return NULL;
+ Eina_Iterator iterator;
+ Eo *object;
+ Edje *ed;
+ unsigned index;
+};
- unsigned int i;
- for (i = 0; i < ed->table_parts_size; i++)
+static Eina_Bool
+_part_iterator_next(Part_Iterator *it, void **data)
+{
+ for (; it->index < it->ed->table_parts_size; it->index++)
{
- Edje_Real_Part *rp;
- rp = ed->table_parts[i];
+ Edje_Real_Part *rp = it->ed->table_parts[it->index];
if (rp->part->access)
- access_parts = eina_list_append(access_parts, rp->part->name);
+ {
+ if (data) *data = (void*) rp->part->name;
+ it->index++;
+ return EINA_TRUE;
+ }
}
+ return EINA_FALSE;
+}
+
+static Eo *
+_part_iterator_get_container(Part_Iterator *it)
+{
+ return it->object;
+}
+
+static void
+_part_iterator_free(Part_Iterator *it)
+{
+ free(it);
+}
+
+EOLIAN Eina_Iterator *
+_edje_object_access_part_iterate(Eo *obj EINA_UNUSED, Edje *ed)
+{
+ Part_Iterator *it;
+
+ it = calloc(1, sizeof(*it));
+ if (!it) return NULL;
+
+ EINA_MAGIC_SET(&it->iterator, EINA_MAGIC_ITERATOR);
+
+ it->iterator.version = EINA_ITERATOR_VERSION;
+ it->iterator.next = FUNC_ITERATOR_NEXT(_part_iterator_next);
+ it->iterator.get_container = FUNC_ITERATOR_GET_CONTAINER(_part_iterator_get_container);
+ it->iterator.free = FUNC_ITERATOR_FREE(_part_iterator_free);
+ it->object = obj;
+ it->ed = ed;
+ it->index = 0;
+
+ return &it->iterator;
+}
+
+EAPI Eina_List *
+edje_object_access_part_list_get(const Edje_Object *obj)
+{
+ Eina_List *access_parts = NULL;
+ Eina_Iterator *it;
+ const char *str;
+
+ it = edje_obj_access_part_iterate((Eo *) obj);
+ EINA_ITERATOR_FOREACH(it, str)
+ access_parts = eina_list_append(access_parts, str);
+ eina_iterator_free(it);
+
return access_parts;
}