Edje: Convert access_part_list to an iterator

This commit is contained in:
Jean-Philippe Andre 2016-04-21 15:39:31 +09:00
parent 07a996e6cc
commit 27573e6e0b
3 changed files with 82 additions and 19 deletions

View File

@ -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"

View File

@ -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 {

View File

@ -4942,21 +4942,76 @@ _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_Iterator iterator;
Eo *object;
Edje *ed;
unsigned index;
};
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 = it->ed->table_parts[it->index];
if (rp->part->access)
{
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;
if ((!ed)) return NULL;
unsigned int i;
for (i = 0; i < ed->table_parts_size; i++)
{
Edje_Real_Part *rp;
rp = ed->table_parts[i];
if (rp->part->access)
access_parts = eina_list_append(access_parts, rp->part->name);
}
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;
}