Python-EFL: new 1.9 API Multibuttonentry.format_function_set()

Sadly this add 2 new points of reference leaks :(
This commit is contained in:
Davide Andreoli 2014-02-27 22:38:04 +01:00
parent c2a34f20ad
commit 32448918f6
4 changed files with 69 additions and 3 deletions

9
TODO
View File

@ -3,8 +3,13 @@ BUGS
====
* EdjeEdit: PartState API does not work
* Elm.Map: overlays_show segfaults, scrollers in examples are jumpy
* Entry.markup_filter_append() and Fileselector.custom_filter_append() are
leaking badly, fix and check all other place that have the same issue.
* Elementary: when we use custom function callbacks we usually leak some
reference around, some examples:
- Entry.markup_filter_append()
- Fileselector.custom_filter_append()
- Multibuttonentry.format_function_set()
- Multibuttonentry.filter_append()
- Multibuttonentry.filterprepend()
Failing unit tests
------------------

View File

@ -1,10 +1,11 @@
from efl.evas cimport Eina_Bool, const_Eina_List, Evas_Object, const_Evas_Object, Evas_Smart_Cb
from object_item cimport Elm_Object_Item, const_Elm_Object_Item, ObjectItem
from libc.string cimport const_char
from libc.string cimport const_char, const_void
cdef extern from "Elementary.h":
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)
Evas_Object *elm_multibuttonentry_entry_get(const_Evas_Object *obj)
@ -28,3 +29,4 @@ cdef extern from "Elementary.h":
# TODO: void elm_multibuttonentry_item_filter_remove(Evas_Object *obj, Elm_Multibuttonentry_Item_Filter_Cb func, void *data)
void elm_multibuttonentry_editable_set(Evas_Object *obj, Eina_Bool editable)
Eina_Bool elm_multibuttonentry_editable_get(const_Evas_Object *obj)
void elm_multibuttonentry_format_function_set(Evas_Object *obj, Elm_Multibuttonentry_Format_Cb f_func, const_void *data)

View File

@ -92,6 +92,18 @@ cdef Eina_Bool _multibuttonentry_filter_callback(Evas_Object *obj, \
return ret
cdef char * _multibuttonentry_format_cb(int count, void *data) with gil:
(callback, a, ka) = <object>data
try:
ret = callback(count, *a, **ka)
except:
traceback.print_exc()
# TODO leak here
return strdup(ret)
cdef class MultiButtonEntryItem(ObjectItem):
"""An item for the MultiButtonEntry widget."""
@ -432,6 +444,32 @@ cdef class MultiButtonEntry(Object):
def editable_get(self):
return bool(elm_multibuttonentry_editable_get(self.obj))
def format_function_set(self, func, *args, **kwargs):
"""format_function_set(func, *args, **kwargs)
Set a function to format the string that will be used to display
the hidden items counter.
:param func: The actual format function.
signature: (int count, args, kwargs)->string
:type func: callable
.. note:: Setting ``func`` to `None` will restore the default format.
.. versionadded:: 1.9
"""
if func is None:
elm_multibuttonentry_format_function_set(self.obj, NULL, NULL)
return
cbdata = (func, args, kwargs)
elm_multibuttonentry_format_function_set(self.obj,
_multibuttonentry_format_cb,
<void *>cbdata)
# TODO leak here
Py_INCREF(cbdata)
def callback_item_selected_add(self, func, *args, **kwargs):
self._callback_add("item,selected", func, *args, **kwargs)

View File

@ -61,6 +61,10 @@ def cb_print(btn, mbe):
for i in mbe.items:
print(i.text)
def custom_format_func(count):
return "+ {} rabbits".format(count)
def multibuttonentry_clicked(obj, item=None):
win = StandardWindow("multibuttonentry", "MultiButtonEntry test",
autodel=True, size=(320, 320))
@ -148,6 +152,23 @@ def multibuttonentry_clicked(obj, item=None):
hbox.pack_end(bt)
bt.show()
hbox = Box(win, horizontal=True, size_hint_weight=EXPAND_HORIZ)
vbox.pack_end(hbox)
hbox.show()
bt = Button(win, text="Change format function",
size_hint_align=FILL_HORIZ, size_hint_weight=EXPAND_HORIZ)
bt.callback_clicked_add(lambda b: mbe.format_function_set(custom_format_func))
hbox.pack_end(bt)
bt.show()
bt = Button(win, text="Unset format function",
size_hint_align=FILL_HORIZ, size_hint_weight=EXPAND_HORIZ)
bt.callback_clicked_add(lambda b: mbe.format_function_set(None))
hbox.pack_end(bt)
bt.show()
mbe.focus = True
win.show()