kuuko pushed a commit to branch master. http://git.enlightenment.org/bindings/python/python-efl.git/commit/?id=d4308079740bc175077c6d8fccbc214f1107abec
commit d4308079740bc175077c6d8fccbc214f1107abec Author: Kai Huuhko <kai.huu...@gmail.com> Date: Wed Oct 2 19:34:47 2013 +0300 Elementary: Add custom effects for transit. --- efl/elementary/transit.pxd | 6 +- efl/elementary/transit.pyx | 87 ++++++++++++++++++++++++----- examples/elementary/test_transit.py | 106 ++++++++++++++++-------------------- 3 files changed, 122 insertions(+), 77 deletions(-) diff --git a/efl/elementary/transit.pxd b/efl/elementary/transit.pxd index 364df02..b7091e7 100644 --- a/efl/elementary/transit.pxd +++ b/efl/elementary/transit.pxd @@ -6,7 +6,7 @@ cdef extern from "Elementary.h": ctypedef struct Elm_Transit ctypedef Elm_Transit const_Elm_Transit "const Elm_Transit" - ctypedef struct Elm_Transit_Effect + ctypedef void Elm_Transit_Effect ctypedef void (*Elm_Transit_Effect_Transition_Cb)(Elm_Transit_Effect *effect, Elm_Transit *transit, double progress) ctypedef void (*Elm_Transit_Effect_End_Cb) (Elm_Transit_Effect *effect, Elm_Transit *transit) @@ -14,8 +14,8 @@ cdef extern from "Elementary.h": Elm_Transit *elm_transit_add() void elm_transit_del(Elm_Transit *transit) - # TODO: void elm_transit_effect_add(Elm_Transit *transit, Elm_Transit_Effect_Transition_Cb transition_cb, Elm_Transit_Effect *effect, Elm_Transit_Effect_End_Cb end_cb) - # TODO: void elm_transit_effect_del(Elm_Transit *transit, Elm_Transit_Effect_Transition_Cb transition_cb, Elm_Transit_Effect *effect) + void elm_transit_effect_add(Elm_Transit *transit, Elm_Transit_Effect_Transition_Cb transition_cb, Elm_Transit_Effect *effect, Elm_Transit_Effect_End_Cb end_cb) + void elm_transit_effect_del(Elm_Transit *transit, Elm_Transit_Effect_Transition_Cb transition_cb, Elm_Transit_Effect *effect) void elm_transit_object_add(Elm_Transit *transit, Evas_Object *obj) void elm_transit_object_remove(Elm_Transit *transit, Evas_Object *obj) const_Eina_List *elm_transit_objects_get(Elm_Transit *transit) diff --git a/efl/elementary/transit.pyx b/efl/elementary/transit.pyx index d87e5c2..a8172e2 100644 --- a/efl/elementary/transit.pyx +++ b/efl/elementary/transit.pyx @@ -166,6 +166,61 @@ ELM_TRANSIT_TWEEN_MODE_ACCELERATE = enums.ELM_TRANSIT_TWEEN_MODE_ACCELERATE import traceback +cdef class TransitCustomEffect: + """ + + A prototype class for a Transit widgets custom effect. + + Inherit this class and override methods to create your custom effect. + + """ + cdef Transit transit + + def __cinit__(self): + Py_INCREF(self) + + def transition_cb(self, transit, progress): + """transition_cb(Transit transit, float progress) + + A callback method that must be overridden to implement the + effect. + + Called in a loop until the effect is finished. + + """ + pass + + def end_cb(self, transit): + """end_cb(Transit transit) + + A callback method that can be overridden, called when the effect + is deleted. + + """ + pass + +cdef void elm_transit_effect_transition_cb(Elm_Transit_Effect *effect, Elm_Transit *transit, double progress) with gil: + cdef: + TransitCustomEffect fect = <TransitCustomEffect?>effect + Transit tsit = fect.transit + + try: + fect.transition_cb(tsit, progress) + except: + traceback.print_exc() + +cdef void elm_transit_effect_end_cb(Elm_Transit_Effect *effect, Elm_Transit *transit) with gil: + cdef: + TransitCustomEffect fect = <TransitCustomEffect?>effect + Transit tsit = fect.transit + + try: + fect.end_cb(tsit) + except: + traceback.print_exc() + + Py_DECREF(fect) + cdef void elm_transit_del_cb(void *data, Elm_Transit *transit) with gil: cdef: Transit trans @@ -230,8 +285,11 @@ cdef class Transit(object): """ elm_transit_del(self.obj) - #def effect_add(self, Elm_Transit_Effect_Transition_Cb transition_cb, effect, Elm_Transit_Effect_End_Cb end_cb): - """Add a new effect to the transit. + # TODO: Fix the documentation + def effect_add(self, TransitCustomEffect effect): + """effect_add(TransitCustomEffect effect) + + Add a new effect to the transit. Example:: @@ -250,21 +308,19 @@ cdef class Transit(object): effect list become empty again, the ``transit`` will be killed by elm_transit_del(transit) function. - :param transition_cb: The operation function. It is called when the - animation begins, it is the function that actually performs the - animation. It is called with the ``data``, ``transit`` and the time - progression of the animation (a double value between 0.0 and - 1.0). :param effect: The context data of the effect. - :param end_cb: The function to free the context data, it will be - called at the end of the effect, it must finalize the animation - and free the ``data``. """ - #elm_transit_effect_add(self.obj, transition_cb, effect, end_cb) + effect.transit = self + elm_transit_effect_add(self.obj, + elm_transit_effect_transition_cb, + <void *>effect, + elm_transit_effect_end_cb) + + def effect_del(self, TransitCustomEffect effect): + """effect_del(TransitCustomEffect effect) - #def effect_del(self, Elm_Transit_Effect_Transition_Cb transition_cb, effect): - """Delete an added effect. + Delete an added effect. This function will remove the effect from the ``transit``, calling the data_free_cb to free the ``data``. @@ -275,11 +331,12 @@ cdef class Transit(object): .. note:: If the effect list become empty, this function will call elm_transit_del(transit), i.e., it will kill the ``transit``. - :param transition_cb: The operation function. :param effect: The context data of the effect. """ - #elm_transit_effect_del(self.obj, transition_cb, effect) + elm_transit_effect_del(self.obj, + elm_transit_effect_transition_cb, + <void *>effect) def object_add(self, evasObject obj): """object_add(evas.Object obj) diff --git a/examples/elementary/test_transit.py b/examples/elementary/test_transit.py index d01b55c..6e713e2 100644 --- a/examples/elementary/test_transit.py +++ b/examples/elementary/test_transit.py @@ -5,7 +5,7 @@ from efl.elementary.image import Image from efl.elementary.transit import Transit, ELM_TRANSIT_EFFECT_WIPE_TYPE_HIDE, \ ELM_TRANSIT_EFFECT_WIPE_DIR_RIGHT, ELM_TRANSIT_EFFECT_FLIP_AXIS_X, \ ELM_TRANSIT_EFFECT_FLIP_AXIS_Y, ELM_TRANSIT_TWEEN_MODE_ACCELERATE, \ - ELM_TRANSIT_TWEEN_MODE_DECELERATE + ELM_TRANSIT_TWEEN_MODE_DECELERATE, TransitCustomEffect from efl.elementary.box import Box from efl.elementary.frame import Frame from efl.elementary.label import Label @@ -14,43 +14,33 @@ from efl.elementary.list import List from efl.evas import EVAS_HINT_EXPAND, EVAS_HINT_FILL, EVAS_ASPECT_CONTROL_VERTICAL -# class Custom_Effect: -# _size.fr.w -# _size.fr.h -# _size.to.w -# _size.to.h +class CustomEffect(TransitCustomEffect): + def __init__(self, from_w, from_h, to_w, to_h): + self.fr_w = from_w + self.fr_h = from_h + self.to_w = to_w - from_w + self.to_h = to_h - from_h -# def custom_op(effect, transit, progress): -# if not effect: return -# elist = [] + def transition_cb(effect, transit, progress): + if not effect: return + elist = [] -# custom_effect = effect -# objs = transit.objects + custom_effect = effect + objs = transit.objects -# if progress < 0.5: -# h = custom_effect.fr.h + (custom_effect.to.h * progress * 2) -# w = custom_effect.fr.w -# else: -# h = custom_effect.fr.h + custom_effect.to.h -# w = custom_effect.fr.w + \ -# (custom_effect.to.w * (progress - 0.5) * 2) + if progress < 0.5: + h = custom_effect.fr_h + (custom_effect.to_h * progress * 2) + w = custom_effect.fr_w + else: + h = custom_effect.fr_h + custom_effect.to_h + w = custom_effect.fr_w + \ + (custom_effect.to_w * (progress - 0.5) * 2) -# for obj in objs: -# obj.resize(w, h) + for obj in objs: + obj.resize(w, h) -# def custom_context_new(Evas_Coord from_w, Evas_Coord from_h, Evas_Coord to_w, Evas_Coord to_h): -# custom_effect = Custom_Effect() - -# custom_effect.fr.w = from_w -# custom_effect.fr.h = from_h -# custom_effect.to.w = to_w - from_w -# custom_effect.to.h = to_h - from_h - -# return custom_effect - -# def custom_context_free(Elm_Transit_Effect *effect, Elm_Transit *transit __UNUSED__): -# Custom_Effect *custom_effect = effect -# free(custom_effect) + def end_cb(effect, transit): + print("Effect done") def transit_rotation_translation_color(obj): trans = Transit() @@ -348,31 +338,29 @@ def transit7_clicked(obj, item=None): bt2.callback_clicked_add(transit_resizable_flip, bt) # Custom Effect -# def transit8_clicked(obj, item=None): -# Elm_Transit_Effect *effect_context - -# win = StandardWindow("transit8", "Transit 8") -# win.autodel = True - -# bt = Button(win) -# bt.text = "Button - Custom Effect" -# bt.show() -# bt.move(50, 50) -# bt.resize(150, 150) - -# # Adding Transit -# trans = Transit() -# trans.auto_reverse = True -# trans.tween_mode = ELM_TRANSIT_TWEEN_MODE_DECELERATE -# effect_context = _custom_context_new(150, 150, 50, 50) -# trans.object_add(bt) -# trans.effect_add(trans, _custom_op, effect_context, _custom_context_free) -# trans.duration = 5.0 -# trans.repeat_times = -1 -# trans.go() - -# win.resize(400, 400) -# win.show() +def transit8_clicked(obj, item=None): + win = StandardWindow("transit8", "Transit 8") + win.autodel = True + + bt = Button(win) + bt.text = "Button - Custom Effect" + bt.show() + bt.move(50, 50) + bt.resize(150, 150) + + # Adding Transit + trans = Transit() + trans.auto_reverse = True + trans.tween_mode = ELM_TRANSIT_TWEEN_MODE_DECELERATE + #effect_context = _custom_context_new(150, 150, 50, 50) + trans.object_add(bt) + trans.effect_add(CustomEffect(150, 150, 50, 50)) + trans.duration = 5.0 + trans.repeat_times = -1 + trans.go() + + win.resize(400, 400) + win.show() # Chain Transit Effect def transit9_clicked(obj, item=None): @@ -468,7 +456,7 @@ if __name__ == "__main__": ("Transit Blend", transit5_clicked), ("Transit Fade", transit6_clicked), ("Transit Resizable", transit7_clicked), - #("Transit Custom", transit8_clicked), + ("Transit Custom", transit8_clicked), ("Transit Chain", transit9_clicked), ] --