Make Evas.SO iterator a generic Eo iterator and move to efl.eo

This commit is contained in:
Kai Huuhko 2015-03-09 19:36:42 +02:00
parent 16f04ee2ec
commit fbc22d850d
5 changed files with 47 additions and 32 deletions

View File

@ -34,7 +34,8 @@ from cpython cimport PyObject, Py_INCREF, Py_DECREF, PyUnicode_AsUTF8String
from libc.stdint cimport uintptr_t
from efl.eina cimport Eina_Bool, \
Eina_Hash, eina_hash_string_superfast_new, eina_hash_add, eina_hash_del, \
eina_hash_find, EINA_LOG_DOM_DBG, EINA_LOG_DOM_INFO
eina_hash_find, EINA_LOG_DOM_DBG, EINA_LOG_DOM_INFO, \
Eina_Iterator, eina_iterator_next, eina_iterator_free
from efl.c_eo cimport Eo as cEo, eo_init, eo_shutdown, eo_del, eo_do, \
eo_do_ret, eo_class_name_get, eo_class_get, eo_base_class_get,\
eo_key_data_set, eo_key_data_get, eo_key_data_del, \
@ -42,7 +43,8 @@ from efl.c_eo cimport Eo as cEo, eo_init, eo_shutdown, eo_del, eo_do, \
eo_parent_get, eo_parent_set, Eo_Event_Description, \
eo_event_freeze, eo_event_thaw, eo_event_freeze_count_get, \
eo_event_global_freeze, eo_event_global_thaw, \
eo_event_global_freeze_count_get, EO_CALLBACK_STOP
eo_event_global_freeze_count_get, EO_CALLBACK_STOP, \
eo_children_iterator_new
from efl.utils.logger cimport add_logger
@ -200,6 +202,25 @@ cdef Eina_Bool _eo_event_del_cb(void *data, cEo *obj,
return EO_CALLBACK_STOP
cdef class EoIterator:
def __iter__(self):
return self
def __next__(self):
cdef:
void* tmp
Eina_Bool result
if not eina_iterator_next(self.itr, &tmp):
raise StopIteration
return object_from_instance(<cEo *>tmp)
def __dealloc__(self):
eina_iterator_free(self.itr)
cdef class Eo(object):
"""
@ -248,6 +269,12 @@ cdef class Eo(object):
setattr(self, k, v)
return 1
def __iter__(self):
cdef:
void *tmp = NULL
eo_do_ret(self.obj, tmp, eo_children_iterator_new())
return EoIterator.create(<Eina_Iterator *>tmp)
def delete(self):
"""Delete the object and free internal resources.
@ -300,7 +327,7 @@ cdef class Eo(object):
:return: the freeze count
:rtype: int
"""
cdef int fcount = 0
fcount = <int>eo_do_ret(self.obj, fcount, eo_event_freeze_count_get())

View File

@ -17,7 +17,7 @@
from efl.utils.conversions cimport eina_list_objects_to_python_list
from efl.c_eo cimport eo_do, eo_do_ret, eo_key_data_del, eo_key_data_set, eo_key_data_get
from efl.eo cimport Eo
from efl.eo cimport Eo, EoIterator
from cpython cimport PyMem_Malloc, PyMethod_New, Py_INCREF, Py_DECREF
@ -548,30 +548,6 @@ cdef class Smart(object):
pass
cdef class SmartObjectIterator:
cdef Eina_Iterator *itr
def __cinit__(self, SmartObject obj):
self.itr = evas_object_smart_iterator_new(obj.obj)
def __iter__(self):
return self
def __next__(self):
cdef:
void* tmp
Eina_Bool result
if not eina_iterator_next(self.itr, &tmp):
raise StopIteration
return <Object>tmp
def __dealloc__(self):
eina_iterator_free(self.itr)
cdef class SmartObject(Object):
"""
@ -648,7 +624,7 @@ cdef class SmartObject(Object):
return 1
def __iter__(self):
return SmartObjectIterator(self)
return EoIterator.create(evas_object_smart_iterator_new(self.obj))
# property parent:
# def __get__(self):

View File

@ -4,6 +4,7 @@
import os
from random import randint
from efl.eo import Eo
from efl.evas import SmartObject, Smart, EXPAND_BOTH, FILL_BOTH, Rectangle, \
Line, FilledImage, Polygon, Text
from efl import elementary
@ -54,13 +55,13 @@ class MySmart(Smart):
@staticmethod
def show(smart_object):
print("my show")
for o in smart_object.members:
for o in smart_object:
o.show()
@staticmethod
def hide(smart_object):
print("my hide")
for o in smart_object.members:
for o in smart_object:
o.hide()
@staticmethod

View File

@ -15,7 +15,7 @@
# You should have received a copy of the GNU Lesser General Public License
# along with this Python-EFL. If not, see <http://www.gnu.org/licenses/>.
from efl.eina cimport Eina_Bool
from efl.eina cimport Eina_Bool, Eina_Iterator
cdef extern from "Eo.h":
@ -126,3 +126,5 @@ cdef extern from "Eo.h":
void eo_event_callback_add(const Eo_Event_Description *desc, Eo_Event_Cb cb, const void *data)
void eo_event_callback_del(const Eo_Event_Description *desc, Eo_Event_Cb cb, const void *data)
Eina_Iterator * eo_children_iterator_new()

View File

@ -15,6 +15,7 @@
# You should have received a copy of the GNU Lesser General Public License
# along with this Python-EFL. If not, see <http://www.gnu.org/licenses/>.
from efl.eina cimport Eina_Iterator
from efl.c_eo cimport Eo as cEo
cdef:
@ -27,6 +28,14 @@ cdef:
int _set_properties_from_keyword_args(self, dict kwargs) except 0
#_add_obj(self, Eo_Class *klass, cEo *parent)
class EoIterator:
cdef Eina_Iterator *itr
@staticmethod
cdef inline create(Eina_Iterator *itr):
cdef EoIterator obj = EoIterator.__new__(EoIterator)
obj.itr = itr
return obj
int PY_REFCOUNT(object o)