kuuko pushed a commit to branch master.

commit 058777167c653237d9965565ccef8c8d004cff3c
Author: Kai Huuhko <[email protected]>
Date:   Thu Apr 18 18:30:28 2013 +0000

    Elementary: Separate GenlistItem func_data from item_data, add small
    optimizations.
---
 efl/elementary/genlist.pyx          | 233 ++++++++++++++++++------------------
 efl/elementary/object_item.pxd      |   2 +-
 examples/elementary/test_genlist.py |  14 +--
 3 files changed, 124 insertions(+), 125 deletions(-)

diff --git a/efl/elementary/genlist.pyx b/efl/elementary/genlist.pyx
index 53d20b3..1e1dd97 100644
--- a/efl/elementary/genlist.pyx
+++ b/efl/elementary/genlist.pyx
@@ -474,6 +474,8 @@ include "widget_header.pxi"
 include "callback_conversions.pxi"
 include "tooltips.pxi"
 
+from cpython cimport PyUnicode_AsUTF8String
+
 from efl.eo cimport _METHOD_DEPRECATED
 
 from object_item cimport ObjectItem, _object_item_to_python, \
@@ -516,42 +518,47 @@ ELM_SCROLLER_POLICY_AUTO = enums.ELM_SCROLLER_POLICY_AUTO
 ELM_SCROLLER_POLICY_ON = enums.ELM_SCROLLER_POLICY_ON
 ELM_SCROLLER_POLICY_OFF = enums.ELM_SCROLLER_POLICY_OFF
 
-cdef _py_elm_genlist_item_call(func, Evas_Object *obj, const_char *part, args) 
with gil:
-    try:
-        o = object_from_instance(obj)
-        return func(o, _ctouni(part), args)
-    except Exception as e:
-        traceback.print_exc()
-        return None
-
 cdef char *_py_elm_genlist_item_text_get(void *data, Evas_Object *obj, 
const_char *part) with gil:
-    cdef GenlistItem item = <object>data
-    cdef object params = item.params
-    cdef GenlistItemClass itc = params[0]
+    cdef:
+        GenlistItem item = <object>data
+        GenlistItemClass itc = item.params[0]
+        unicode u = _ctouni(part)
 
     func = itc._text_get_func
-
     if func is None:
         return NULL
 
-    ret = _py_elm_genlist_item_call(func, obj, part, params[1])
+    try:
+        o = object_from_instance(obj)
+        ret = func(o, u, item.params[1])
+    except Exception as e:
+        traceback.print_exc()
+        return NULL
+
     if ret is not None:
-        if isinstance(ret, unicode): ret = ret.encode("UTF-8")
+        if isinstance(ret, unicode): ret = PyUnicode_AsUTF8String(ret)
         return strdup(ret)
     else:
         return NULL
 
 cdef Evas_Object *_py_elm_genlist_item_content_get(void *data, Evas_Object 
*obj, const_char *part) with gil:
-    cdef GenlistItem item = <object>data
-    cdef object params = item.params
-    cdef evasObject icon
-    cdef GenlistItemClass itc = params[0]
+    cdef:
+        GenlistItem item = <object>data
+        GenlistItemClass itc = item.params[0]
+        unicode u = _ctouni(part)
+        evasObject icon
 
     func = itc._content_get_func
     if func is None:
         return NULL
 
-    ret = _py_elm_genlist_item_call(func, obj, part, params[1])
+    try:
+        o = object_from_instance(obj)
+        ret = func(o, u, item.params[1])
+    except Exception as e:
+        traceback.print_exc()
+        return NULL
+
     if ret is not None:
         try:
             icon = ret
@@ -563,36 +570,38 @@ cdef Evas_Object *_py_elm_genlist_item_content_get(void 
*data, Evas_Object *obj,
         return NULL
 
 cdef Eina_Bool _py_elm_genlist_item_state_get(void *data, Evas_Object *obj, 
const_char *part) with gil:
-    cdef GenlistItem item = <object>data
-    cdef object params = item.params
-    cdef GenlistItemClass itc = params[0]
+    cdef:
+        GenlistItem item = <object>data
+        GenlistItemClass itc = item.params[0]
+        unicode u = _ctouni(part)
 
     func = itc._state_get_func
     if func is None:
-        return False
+        return 0
 
-    ret = _py_elm_genlist_item_call(func, obj, part, params[1])
-    if ret is not None:
-        return bool(ret)
-    else:
-        return False
+    try:
+        o = object_from_instance(obj)
+        ret = func(o, u, item.params[1])
+    except Exception as e:
+        traceback.print_exc()
+        return 0
+
+    return ret if ret is not None else 0
 
 cdef void _py_elm_genlist_object_item_del(void *data, Evas_Object *obj) with 
gil:
     cdef GenlistItem item = <object>data
-    cdef object params
     cdef GenlistItemClass itc
 
     if item is None:
         return
 
-    params = item.params
-    itc = params[0]
+    itc = item.params[0]
 
     func = itc._del_func
     if func is not None:
         try:
             o = object_from_instance(obj)
-            func(o, params[1])
+            func(o, item.params[1])
         except Exception as e:
             traceback.print_exc()
     item._unset_obj()
@@ -605,7 +614,7 @@ cdef void _py_elm_genlist_item_func(void *data, Evas_Object 
*obj, void *event_in
     if func is not None:
         try:
             o = object_from_instance(obj)
-            func(item, o, item.params[1])
+            func(item, o, item.params[3])
         except Exception as e:
             traceback.print_exc()
 
@@ -870,11 +879,12 @@ cdef class GenlistItem(ObjectItem):
 
     """
 
-    cdef Elm_Genlist_Item_Class *item_class
-    cdef Elm_Object_Item *parent_item
-    cdef int flags
-    cdef Evas_Smart_Cb cb
-    cdef object comparison_func
+    cdef:
+        Elm_Genlist_Item_Class *item_class
+        Elm_Object_Item *parent_item
+        int flags
+        Evas_Smart_Cb cb
+        object comparison_func
 
     def __cinit__(self):
         self.item_class = NULL
@@ -884,10 +894,11 @@ cdef class GenlistItem(ObjectItem):
 
     def __init__(   self,
                     GenlistItemClass item_class not None,
-                    #TODO: item data separate from data?
+                    item_data=None,
                     GenlistItem parent_item=None,
-                    int flags=ELM_GENLIST_ITEM_NONE,
-                    func=None, *args):
+                    int flags=enums.ELM_GENLIST_ITEM_NONE,
+                    func=None,
+                    func_data=None):
         """Create a new GenlistItem.
 
         :param item_class: a valid instance that defines the
@@ -933,10 +944,7 @@ cdef class GenlistItem(ObjectItem):
                 raise TypeError("func is not None or callable")
             self.cb = _py_elm_genlist_item_func
 
-        if len(args) is 1:
-            args = args[0]
-
-        self.params = (item_class, args, func)
+        self.params = (item_class, item_data, func, func_data)
 
     cdef int _set_obj(self, Elm_Object_Item *item, params=None) except 0:
         assert self.item == NULL, "Object must be clean"
@@ -1179,17 +1187,19 @@ cdef class GenlistItem(ObjectItem):
 
         """
         def __get__(self):
-            return bool(elm_genlist_item_selected_get(self.item))
+            cdef bint ret = elm_genlist_item_selected_get(self.item)
+            return ret
 
-        def __set__(self, selected):
-            elm_genlist_item_selected_set(self.item, bool(selected))
+        def __set__(self, bint selected):
+            elm_genlist_item_selected_set(self.item, selected)
 
-    def selected_set(self, selected):
-        elm_genlist_item_selected_set(self.item, bool(selected))
+    def selected_set(self, bint selected):
+        elm_genlist_item_selected_set(self.item, selected)
     def selected_get(self):
-        return bool(elm_genlist_item_selected_get(self.item))
+        cdef bint ret = elm_genlist_item_selected_get(self.item)
+        return ret
 
-    def show(self, scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_IN):
+    def show(self, scrollto_type = enums.ELM_GENLIST_ITEM_SCROLLTO_IN):
         """show(int scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_IN)
 
         This causes genlist to jump to the item and show it (by
@@ -1200,7 +1210,7 @@ cdef class GenlistItem(ObjectItem):
         """
         elm_genlist_item_show(self.item, scrollto_type)
 
-    def bring_in(self, scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_IN):
+    def bring_in(self, scrollto_type = enums.ELM_GENLIST_ITEM_SCROLLTO_IN):
         """bring_in(int scrollto_type = ELM_GENLIST_ITEM_SCROLLTO_IN)
 
         This causes genlist to jump to the item and show it (by
@@ -1408,16 +1418,18 @@ cdef class GenlistItem(ObjectItem):
             cursor with elm_genlist_item_cursor_set()
 
         """
-        def __set__(self, engine_only):
-            elm_genlist_item_cursor_engine_only_set(self.item, 
bool(engine_only))
+        def __set__(self, bint engine_only):
+            elm_genlist_item_cursor_engine_only_set(self.item, engine_only)
 
         def __get__(self):
-            return elm_genlist_item_cursor_engine_only_get(self.item)
+            cdef bint ret = elm_genlist_item_cursor_engine_only_get(self.item)
+            return ret
 
-    def cursor_engine_only_set(self, engine_only):
-        elm_genlist_item_cursor_engine_only_set(self.item, bool(engine_only))
+    def cursor_engine_only_set(self, bint engine_only):
+        elm_genlist_item_cursor_engine_only_set(self.item, engine_only)
     def cursor_engine_only_get(self):
-        return elm_genlist_item_cursor_engine_only_get(self.item)
+        cdef bint ret = elm_genlist_item_cursor_engine_only_get(self.item)
+        return ret
 
     property parent:
         """This returns the item that was specified as parent of the item
@@ -1457,15 +1469,17 @@ cdef class GenlistItem(ObjectItem):
 
         """
         def __get__(self):
-            return bool(elm_genlist_item_expanded_get(self.item))
+            cdef bint ret = elm_genlist_item_expanded_get(self.item)
+            return ret
 
-        def __set__(self, expanded):
-            elm_genlist_item_expanded_set(self.item, bool(expanded))
+        def __set__(self, bint expanded):
+            elm_genlist_item_expanded_set(self.item, expanded)
 
-    def expanded_set(self, expanded):
-        elm_genlist_item_expanded_set(self.item, bool(expanded))
-    def expanded_get(self, ):
-        return bool(elm_genlist_item_expanded_get(self.item))
+    def expanded_set(self, bint expanded):
+        elm_genlist_item_expanded_set(self.item, expanded)
+    def expanded_get(self):
+        cdef bint ret = elm_genlist_item_expanded_get(self.item)
+        return ret
 
     property expanded_depth:
         """Get the depth of expanded item.
@@ -1605,12 +1619,14 @@ cdef class GenlistItem(ObjectItem):
             elm_genlist_item_flip_set(self.item, flip)
 
         def __get__(self):
-            return bool(elm_genlist_item_flip_get(self.item))
+            cdef bint ret = elm_genlist_item_flip_get(self.item)
+            return ret
 
     def flip_set(self, flip):
         elm_genlist_item_flip_set(self.item, flip)
     def flip_get(self):
-        return bool(elm_genlist_item_flip_get(self.item))
+        cdef bint ret = elm_genlist_item_flip_get(self.item)
+        return ret
 
     property select_mode:
         """Item's select mode. Possible values are:
@@ -1716,29 +1732,6 @@ cdef class GenlistWidget(Object):
     def mode_get(self):
         return elm_genlist_mode_get(self.obj)
 
-    property bounce:
-        """This will enable or disable the scroller bouncing effect for the
-        genlist. See elm_scroller_bounce_set() for details.
-
-        :type: tuple of bools
-
-        """
-        def __set__(self, value):
-            h_bounce, v_bounce = value
-            elm_scroller_bounce_set(self.obj, bool(h_bounce), bool(v_bounce))
-
-        def __get__(self):
-            cdef Eina_Bool h_bounce, v_bounce
-            elm_scroller_bounce_get(self.obj, &h_bounce, &v_bounce)
-            return (h_bounce, v_bounce)
-
-    def bounce_set(self, h_bounce, v_bounce):
-        elm_scroller_bounce_set(self.obj, bool(h_bounce), bool(v_bounce))
-    def bounce_get(self):
-        cdef Eina_Bool h_bounce, v_bounce
-        elm_scroller_bounce_get(self.obj, &h_bounce, &v_bounce)
-        return (h_bounce, v_bounce)
-
     def item_append(self,
                     GenlistItemClass item_class not None,
                     item_data,
@@ -1822,11 +1815,9 @@ cdef class GenlistWidget(Object):
     def item_insert_before( self,
                             GenlistItemClass item_class not None,
                             item_data,
-                            #API XXX: parent
                             GenlistItem before_item=None,
                             int flags=ELM_GENLIST_ITEM_NONE,
                             func=None
-                            #API XXX: *args, **kwargs
                             ):
         """item_insert_before(item_class not None, item_data, 
before_item=None, flags=ELM_GENLIST_ITEM_NONE, func=None) -> GenlistItem
 
@@ -1862,11 +1853,9 @@ cdef class GenlistWidget(Object):
     def item_insert_after(  self,
                             GenlistItemClass item_class not None,
                             item_data,
-                            #API XXX: parent
                             GenlistItem after_item=None,
                             int flags=ELM_GENLIST_ITEM_NONE,
                             func=None
-                            #API XXX: *args, **kwargs
                             ):
         """item_insert_after(item_class not None, item_data, after_item=None, 
flags=ELM_GENLIST_ITEM_NONE, func=None) -> GenlistItem
 
@@ -2075,16 +2064,18 @@ cdef class GenlistWidget(Object):
         :type: bool
 
         """
-        def __set__(self, homogeneous):
-            elm_genlist_homogeneous_set(self.obj, bool(homogeneous))
+        def __set__(self, bint homogeneous):
+            elm_genlist_homogeneous_set(self.obj, homogeneous)
 
         def __get__(self):
-            return bool(elm_genlist_homogeneous_get(self.obj))
+            cdef bint ret = elm_genlist_homogeneous_get(self.obj)
+            return ret
 
-    def homogeneous_set(self, homogeneous):
-        elm_genlist_homogeneous_set(self.obj, bool(homogeneous))
+    def homogeneous_set(self, bint homogeneous):
+        elm_genlist_homogeneous_set(self.obj, homogeneous)
     def homogeneous_get(self):
-        return bool(elm_genlist_homogeneous_get(self.obj))
+        cdef bint ret = elm_genlist_homogeneous_get(self.obj)
+        return ret
 
     property block_count:
         """This will configure the block count to tune to the target with
@@ -2177,16 +2168,18 @@ cdef class GenlistWidget(Object):
         :type: bool
 
         """
-        def __set__(self, reorder_mode):
+        def __set__(self, bint reorder_mode):
             elm_genlist_reorder_mode_set(self.obj, reorder_mode)
 
         def __get__(self):
-            return bool(elm_genlist_reorder_mode_get(self.obj))
+            cdef bint ret = elm_genlist_reorder_mode_get(self.obj)
+            return ret
 
-    def reorder_mode_set(self, reorder_mode):
+    def reorder_mode_set(self, bint reorder_mode):
         elm_genlist_reorder_mode_set(self.obj, reorder_mode)
     def reorder_mode_get(self):
-        return bool(elm_genlist_reorder_mode_get(self.obj))
+        cdef bint ret = elm_genlist_reorder_mode_get(self.obj)
+        return ret
 
     property decorate_mode:
         """Genlist decorate mode for all items.
@@ -2194,16 +2187,18 @@ cdef class GenlistWidget(Object):
         :type: bool
 
         """
-        def __set__(self, decorated):
+        def __set__(self, bint decorated):
             elm_genlist_decorate_mode_set(self.obj, decorated)
 
         def __get__(self):
-            return bool(elm_genlist_decorate_mode_get(self.obj))
+            cdef bint ret = elm_genlist_decorate_mode_get(self.obj)
+            return ret
 
-    def decorate_mode_set(self, decorated):
+    def decorate_mode_set(self, bint decorated):
         elm_genlist_decorate_mode_set(self.obj, decorated)
     def decorate_mode_get(self):
-        return bool(elm_genlist_decorate_mode_get(self.obj))
+        cdef bint ret = elm_genlist_decorate_mode_get(self.obj)
+        return ret
 
     property tree_effect_enabled:
         """Genlist tree effect.
@@ -2211,16 +2206,18 @@ cdef class GenlistWidget(Object):
         :type: bool
 
         """
-        def __set__(self, enabled):
+        def __set__(self, bint enabled):
             elm_genlist_tree_effect_enabled_set(self.obj, enabled)
 
         def __get__(self):
-            return bool(elm_genlist_tree_effect_enabled_get(self.obj))
+            cdef bint ret = elm_genlist_tree_effect_enabled_get(self.obj)
+            return ret
 
-    def tree_effect_enabled_set(self, enabled):
+    def tree_effect_enabled_set(self, bint enabled):
         elm_genlist_tree_effect_enabled_set(self.obj, enabled)
     def tree_effect_enabled_get(self):
-        return bool(elm_genlist_tree_effect_enabled_get(self.obj))
+        cdef bint ret = elm_genlist_tree_effect_enabled_get(self.obj)
+        return ret
 
     property highlight_mode:
         """Whether the item will, or will not highlighted on selection. The
@@ -2231,16 +2228,18 @@ cdef class GenlistWidget(Object):
         :type: bool
 
         """
-        def __set__(self, highlight):
+        def __set__(self, bint highlight):
             elm_genlist_highlight_mode_set(self.obj, highlight)
 
         def __get__(self):
-            return bool(elm_genlist_highlight_mode_get(self.obj))
+            cdef bint ret = elm_genlist_highlight_mode_get(self.obj)
+            return ret
 
-    def highlight_mode_set(self, highlight):
+    def highlight_mode_set(self, bint highlight):
         elm_genlist_highlight_mode_set(self.obj, highlight)
     def highlight_mode_get(self):
-        return bool(elm_genlist_highlight_mode_get(self.obj))
+        cdef bint ret = elm_genlist_highlight_mode_get(self.obj)
+        return ret
 
     property select_mode:
         """Selection mode of the Genlist widget.
diff --git a/efl/elementary/object_item.pxd b/efl/elementary/object_item.pxd
index ea31fb2..b0c029e 100644
--- a/efl/elementary/object_item.pxd
+++ b/efl/elementary/object_item.pxd
@@ -51,7 +51,7 @@ cdef void _object_item_callback(void *data, Evas_Object *obj, 
void *event_info)
 
 cdef class ObjectItem(object):
     cdef Elm_Object_Item *item
-    cdef object params
+    cdef tuple params
     cdef int _set_obj(self, Elm_Object_Item *item) except 0
 
     cpdef text_set(self, text)
diff --git a/examples/elementary/test_genlist.py 
b/examples/elementary/test_genlist.py
index 2773533..d012b30 100644
--- a/examples/elementary/test_genlist.py
+++ b/examples/elementary/test_genlist.py
@@ -447,7 +447,7 @@ def genlist4_clicked(obj, item=None):
                              state_get_func=gl_state_get)
 
     for i in range(100,-1,-1):
-        GenlistItem(itc_i, None, 0, None, i).sorted_insert(gl, gl_comp_func)
+        GenlistItem(itc_i, i).sorted_insert(gl, gl_comp_func)
 
     win.resize(320, 320)
     win.show()
@@ -478,7 +478,7 @@ def genlist5_clicked(obj, item=None):
 
     t1 = time.time()
     for i in range(item_count):
-        GenlistItem(itc_i, None, 0, None, i).append_to(gl)
+        GenlistItem(itc_i, i).append_to(gl)
     t2 = time.time()
 
     it = gl.first_item
@@ -501,7 +501,7 @@ mode_type = ["slide", "rotate"]
 
 class ItemClass10(GenlistItemClass):
     def text_get(self, obj, part, data):
-        t = data[0]
+        t = data
         if part == "elm.text.mode":
             return "Mode # %i" % (t,)
         else:
@@ -586,13 +586,13 @@ def genlist10_clicked(obj, item=None):
     itc10 = ItemClass10(item_style="default", decorate_item_style="mode")
     itc10.state_get = gl_state_get
 
-    for i in range(50):
+    for i in range(1000, 1050):
         GenlistItem(itc10,
-            #1000+i,
+            i,
             None,
             ELM_GENLIST_ITEM_NONE,
             gl_sel10,
-            (1000+i, rdg)).append_to(gl)
+            (i, rdg)).append_to(gl)
 
     bx.pack_end(gl)
 
@@ -680,7 +680,7 @@ def genlist15_clicked(obj, item=None):
     for i in range(100):
         ck = Check(gl)
         GenlistItem(itc15,
-            # tits[i], # item data
+            [i, False], # item data
             None, # parent
             ELM_GENLIST_ITEM_NONE, # flags
             gl15_sel, # func

-- 

------------------------------------------------------------------------------
Precog is a next-generation analytics platform capable of advanced
analytics on semi-structured data. The platform includes APIs for building
apps and a phenomenal toolset for data science. Developers can use
our toolset for easy data analysis & visualization. Get a free account!
http://www2.precog.com/precogplatform/slashdotnewsletter

Reply via email to