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),
     ]
 

-- 


Reply via email to