kuuko pushed a commit to branch master.

http://git.enlightenment.org/bindings/python/python-efl.git/commit/?id=523fe8ad4dc3e271586ade9972faec24a69e0a2c

commit 523fe8ad4dc3e271586ade9972faec24a69e0a2c
Author: Kai Huuhko <kai.huu...@gmail.com>
Date:   Tue Feb 2 21:23:02 2016 +0200

    Elm.MultiButtonEntry: Fix filter callback
---
 efl/elementary/multibuttonentry.pxi          | 31 ++++++----------------------
 efl/elementary/multibuttonentry_cdef.pxi     |  2 +-
 examples/elementary/test_multibuttonentry.py | 15 +++++++-------
 3 files changed, 14 insertions(+), 34 deletions(-)

diff --git a/efl/elementary/multibuttonentry.pxi 
b/efl/elementary/multibuttonentry.pxi
index 13c28e3..8c6e272 100644
--- a/efl/elementary/multibuttonentry.pxi
+++ b/efl/elementary/multibuttonentry.pxi
@@ -18,45 +18,26 @@
 
 include "multibuttonentry_cdef.pxi"
 
-class MultiButtonEntryFilterOut(Exception):
-    """An exception you may raise in an item filter callback if you wish to 
prevent addition of the item"""
-    pass
-
 cdef Eina_Bool _multibuttonentry_filter_callback(Evas_Object *obj, \
-    char *item_label, void *item_data, void *data) with gil:
+    const char *item_label, void *item_data, void *data) with gil:
 
     cdef:
         MultiButtonEntry mbe = object_from_instance(obj)
-        object ret
+        bint ret
         list callbacks = mbe._item_filters
 
     for func, args, kargs in callbacks:
         try:
-            # raise MultiButtonEntryFilterOut -> cancels item add
-            # ret is None -> no change, continue to next filter
-            # ret is not None -> change label to value of ret, continue to 
next filter
             ret = func(mbe, _ctouni(item_label), *args, **kargs)
-        except MultiButtonEntryFilterOut:
-            #free(item_label) # FIXME: This will result in a double free, find 
out if it's bad elm documentation
-                              #        or wrong ref handling on our side.
-
-            #item_label = NULL
-            return 0
         except Exception:
             traceback.print_exc()
             continue
 
         if ret:
-            if not isinstance(ret, basestring):
-                EINA_LOG_DOM_WARN(PY_EFL_ELM_LOG_DOMAIN,
-                    "Ignoring invalid return value from MultiButtonEntry item 
filter callback!", NULL)
-                continue
-            if isinstance(ret, unicode): ret = PyUnicode_AsUTF8String(ret)
-            #free(item_label) # FIXME: This will result in a double free, find 
out if it's bad elm documentation
-                              #        or wrong ref handling on our side.
-
-            item_label = strdup(ret) # Elm will manage the string
-                                     # FIXME: This doesn't apply, why?
+            continue
+        else:
+            return 0 # This emulates the behavior of C code where callbacks
+                     # are iterated until EINA_FALSE is returned by user
 
     return 1
 
diff --git a/efl/elementary/multibuttonentry_cdef.pxi 
b/efl/elementary/multibuttonentry_cdef.pxi
index 5b2aa34..f8b8218 100644
--- a/efl/elementary/multibuttonentry_cdef.pxi
+++ b/efl/elementary/multibuttonentry_cdef.pxi
@@ -1,6 +1,6 @@
 cdef extern from "Elementary.h":
 
-    ctypedef Eina_Bool (*Elm_Multibuttonentry_Item_Filter_Cb)(Evas_Object 
*obj, char *item_label, void *item_data, void *data)
+    ctypedef Eina_Bool (*Elm_Multibuttonentry_Item_Filter_Cb)(Evas_Object 
*obj, const char *item_label, void *item_data, void *data)
     ctypedef char * (*Elm_Multibuttonentry_Format_Cb)(int count, void *data)
 
     Evas_Object             *elm_multibuttonentry_add(Evas_Object *parent)
diff --git a/examples/elementary/test_multibuttonentry.py 
b/examples/elementary/test_multibuttonentry.py
index 989598f..59681c4 100644
--- a/examples/elementary/test_multibuttonentry.py
+++ b/examples/elementary/test_multibuttonentry.py
@@ -6,7 +6,7 @@ from efl import elementary
 from efl.elementary import StandardWindow
 from efl.elementary import Box
 from efl.elementary import Button
-from efl.elementary import MultiButtonEntry, MultiButtonEntryFilterOut
+from efl.elementary import MultiButtonEntry
 from efl.elementary import Scroller, ELM_SCROLLER_POLICY_OFF, 
ELM_SCROLLER_POLICY_AUTO
 
 SCROLL_POLICY_VERT = ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_AUTO
@@ -55,13 +55,13 @@ def cb_btn_clear2(btn, mbe):
 
 def cb_filter1(mbe, text):
     print(text)
+    return True
 
 def cb_filter2(mbe, text):
-    return text[:-2]
-
-def cb_filter3(mbe, text):
-    print(text)
-    #raise MultiButtonEntryFilterOut
+    if text == "nope":
+        return False
+    else:
+        return True
 
 def cb_print(btn, mbe):
     for i in mbe.items:
@@ -86,10 +86,9 @@ def multibuttonentry_clicked(obj, item=None):
     mbe.callback_item_selected_add(cb_item_selected)
     mbe.callback_item_clicked_add(cb_item_clicked)
     mbe.callback_item_longpressed_add(cb_item_longpressed)
-    mbe.part_text_set("guide", "Tap to add recipient")
+    mbe.part_text_set("guide", "Tap to add recipient. Type \"nope\" to test 
filter rejection.")
     mbe.filter_append(cb_filter1)
     mbe.filter_append(cb_filter2)
-    mbe.filter_append(cb_filter3)
     mbe.show()
 
     sc = Scroller(win, bounce=(False, True), policy=SCROLL_POLICY_VERT,

-- 


Reply via email to