davemds pushed a commit to branch master.

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

commit ea6004462081c109ab6903794520560ceda0917e
Author: Dave Andreoli <[email protected]>
Date:   Sat Jan 17 20:05:40 2015 +0100

    Just for fun: port of the Transit Bezier test
    
    ...for fun and to prove the python-efl power,
    the test is half the size of the C version
---
 examples/elementary/test.py                |   1 +
 examples/elementary/test_transit_bezier.py | 162 +++++++++++++++++++++++++++++
 2 files changed, 163 insertions(+)

diff --git a/examples/elementary/test.py b/examples/elementary/test.py
index 858b5b8..8b6c117 100755
--- a/examples/elementary/test.py
+++ b/examples/elementary/test.py
@@ -123,6 +123,7 @@ items = [
         ("Transit Resizable", "test_transit", "transit7_clicked"),
         ("Transit Custom", "test_transit", "transit8_clicked"),
         ("Transit Chain", "test_transit", "transit9_clicked"),
+        ("Transit Bezier", "test_transit_bezier", "transit_bezier_clicked"),
     ]),
     ("Entries", [
         ("Entry", "test_entry", "entry_clicked"),
diff --git a/examples/elementary/test_transit_bezier.py 
b/examples/elementary/test_transit_bezier.py
new file mode 100644
index 0000000..4c37d04
--- /dev/null
+++ b/examples/elementary/test_transit_bezier.py
@@ -0,0 +1,162 @@
+#!/usr/bin/env python
+# encoding: utf-8
+
+import os
+
+from efl.evas import Line
+from efl import elementary
+from efl.elementary.button import Button
+from efl.elementary.window import Window, ELM_WIN_BASIC
+from efl.elementary.background import Background
+from efl.elementary.image import Image
+from efl.elementary.label import Label
+from efl.elementary.transit import Transit, ELM_TRANSIT_TWEEN_MODE_BEZIER_CURVE
+
+script_path = os.path.dirname(os.path.abspath(__file__))
+img_path = os.path.join(script_path, "images")
+
+SEGMENT_MAX = 200
+BTN_SIZE = 50
+WIN_W, WIN_H = 400, 400 + BTN_SIZE
+CTRL_W, CTRL_H = 15, 15
+
+ctrl_pt1 = None
+ctrl_pt2 = None
+label = None
+bezier_lines = []
+
+def clamp(minimum, x, maximum):
+    return max(minimum, min(x, maximum))
+
+def v_get():
+    x, y, w, h = ctrl_pt1.geometry
+    v1 = float((x - (w/2))) / WIN_W;
+    v2 = 1 - float((y - (h/2))) / (WIN_H - BTN_SIZE)
+
+    x, y, w, h = ctrl_pt2.geometry
+    v3 = float((x - (w/2))) / WIN_W;
+    v4 = 1 - float((y - (h/2))) / (WIN_H - BTN_SIZE)
+
+    return (v1, v2, v3, v4)
+
+def update_curve():
+    v1, v2, v3, v4 = v_get()
+    label.text = "<align=left><b>Control Points:</b></br>" \
+                 "x1: %0.2f   y1: %0.2f</br>" \
+                 "x2: %0.2f   y2: %0.2f</align>" % (v1, v2, v3, v4)
+
+    prev_x, prev_y = 0, WIN_H - BTN_SIZE - 1
+    for i, line in enumerate(bezier_lines):
+        progress = float(i) / float((SEGMENT_MAX - 1))
+
+        tx = (3 * progress * pow(1 - progress, 2) * v1) + \
+             (3 * pow(progress, 2) * (1 - progress) * v3) + \
+             (pow(progress, 3) * 1)
+        ty = (3 * progress * pow((1 - progress), 2) * v2) + \
+             (3 * pow(progress, 2) * (1 - progress) * v4) + \
+             (pow(progress, 3) * 1)
+
+        cur_x = int(tx * WIN_W)
+        cur_y = (WIN_H - BTN_SIZE - 1) - (int(ty * (WIN_H - BTN_SIZE)))
+        line.xy = prev_x, prev_y, cur_x, cur_y
+        prev_x, prev_y = cur_x, cur_y
+
+def ctrl_pt_mouse_down_cb(obj, event):
+    obj.data["dragging"] = True
+
+def ctrl_pt_mouse_up_cb(obj, event):
+    obj.data["dragging"] = False
+
+def ctrl_pt_mouse_move_cb(obj, event):
+    if obj.data["dragging"]:
+        x = (event.position.canvas.x - (CTRL_W/2))
+        y = (event.position.canvas.y - (CTRL_H/2))
+        x = clamp(-(CTRL_W/2), x, WIN_W - (CTRL_W/2))
+        y = clamp(-(CTRL_H/2), y, WIN_H - (CTRL_H/2))
+
+        obj.move(x,y)
+        obj.data["line"].end = x + (CTRL_W/2), y + (CTRL_H/2)
+        update_curve()
+
+def transit_del_cb(obj):
+    for w in ctrl_pt1, ctrl_pt2, ctrl_pt1.data["line"], ctrl_pt2.data["line"]:
+        w.show()
+
+def btn_clicked_cb(btn):
+    v1, v2, v3, v4 = v_get()
+    transit = Transit(duration=1.0, auto_reverse=True,
+                      tween_mode=ELM_TRANSIT_TWEEN_MODE_BEZIER_CURVE,
+                      tween_mode_factor_n=[v1, v2, v3, v4])
+    transit.object_add(btn)
+    transit.effect_translation_add(0, 0, (WIN_W - BTN_SIZE), 0)
+    transit.del_cb_set(transit_del_cb)
+    transit.go()
+
+    for w in ctrl_pt1, ctrl_pt2, ctrl_pt1.data["line"], ctrl_pt2.data["line"]:
+        w.hide()
+
+def transit_bezier_clicked(obj, item=None):
+    global ctrl_pt1, ctrl_pt2, label, bezier_lines
+
+    win = Window("transit_bezier", ELM_WIN_BASIC, title="Transit Bezier",
+                 autodel=True, size=(WIN_W, WIN_H))
+
+    # BG. Fix window size
+    bg = Background(win, size_hint_min=(WIN_W, WIN_H))
+    win.resize_object_add(bg)
+    bg.show()
+
+    # Control Point 1
+    line = Line(win.evas, anti_alias=True, pass_events=True,
+                color=(0, 174, 219, 255),
+                xy=(0, WIN_W, 100 + (CTRL_W/2) , 300 + (CTRL_H/2)))
+    ctrl_pt1 = Image(win, file=os.path.join(img_path, "bubble.png"),
+                     size=(CTRL_W,CTRL_H), pos=(100,300))
+    ctrl_pt1.on_mouse_down_add(ctrl_pt_mouse_down_cb)
+    ctrl_pt1.on_mouse_up_add(ctrl_pt_mouse_up_cb)
+    ctrl_pt1.on_mouse_move_add(ctrl_pt_mouse_move_cb)
+    ctrl_pt1.data["dragging"] = False
+    ctrl_pt1.data["line"] = line
+    ctrl_pt1.show()
+    line.show()
+
+    # Control Point 2
+    line = Line(win.evas, anti_alias=True, pass_events=True,
+                color=(219, 174, 0, 255),
+                xy=(WIN_W, 0, 300 + (CTRL_W/2), 100 + (CTRL_H/2)))
+    ctrl_pt2 = Image(win, file=os.path.join(img_path, "bubble.png"),
+                     size=(CTRL_W,CTRL_H), pos=(300,100))
+    ctrl_pt2.on_mouse_down_add(ctrl_pt_mouse_down_cb)
+    ctrl_pt2.on_mouse_up_add(ctrl_pt_mouse_up_cb)
+    ctrl_pt2.on_mouse_move_add(ctrl_pt_mouse_move_cb)
+    ctrl_pt2.data["dragging"] = False
+    ctrl_pt2.data["line"] = line
+    ctrl_pt2.show()
+    line.show()
+
+    # Bezier Lines
+    for i in range(SEGMENT_MAX):
+        line = Line(win.evas, color=(255, 50, 50, 255), anti_alias=True,
+                    pass_events=True)
+        bezier_lines.append(line)
+        line.show()
+
+    # Label
+    label = Label(win, size=(WIN_W, 50), pass_events=True)
+    label.show()
+
+    # Button
+    btn = Button(win, text="Go", size=(BTN_SIZE,BTN_SIZE),
+                 pos=(0, WIN_H - BTN_SIZE))
+    btn.callback_clicked_add(btn_clicked_cb)
+    btn.show()
+
+    update_curve()
+    win.show()
+
+
+if __name__ == "__main__":
+    elementary.init()
+    transit_bezier_clicked(None)
+    elementary.run()
+    elementary.shutdown()

-- 


Reply via email to