Elm.MultiButtonEntry: Fix filter callback

This commit is contained in:
Kai Huuhko 2016-02-02 21:23:02 +02:00
parent 3661a78c96
commit 523fe8ad4d
3 changed files with 14 additions and 34 deletions

View File

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

View File

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

View File

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