davemds pushed a commit to branch master.

commit 7925fc70569b0274f421ab9740328bbec75c9189
Author: davemds <[email protected]>
Date:   Mon Aug 12 20:56:45 2013 +0200

    Python-EFL: some works on the photocam widget
    
    * implemented a proper test
    * implemented remote url feature
    * fixed file_set error raise
    * implemented all the missing legacy setter/getters
---
 efl/elementary/image.pyx             |   5 +-
 efl/elementary/photocam.pxd          |   8 ++
 efl/elementary/photocam.pyx          | 127 +++++++++++++++++++++++++++++-
 examples/elementary/test.py          |   1 +
 examples/elementary/test_photocam.py | 148 +++++++++++++++++++++++++++++++++++
 5 files changed, 285 insertions(+), 4 deletions(-)

diff --git a/efl/elementary/image.pyx b/efl/elementary/image.pyx
index afdcf23..7d7d48a 100644
--- a/efl/elementary/image.pyx
+++ b/efl/elementary/image.pyx
@@ -47,7 +47,10 @@ Signals that you can add callbacks for are:
     typed object onto the object in question -- the
     event info argument is the path to that image file
 - ``"clicked"`` - This is called when a user has clicked the image
-
+- ``"download,start"`` - remote url download has started
+- ``"download,progress"`` - url download in progress
+- ``"download,end"`` - remote url download has finished
+- ``"download,error"`` - remote url download has finished with errors
 
 Enumerations
 ------------
diff --git a/efl/elementary/photocam.pxd b/efl/elementary/photocam.pxd
index 9cf7f97..a315625 100644
--- a/efl/elementary/photocam.pxd
+++ b/efl/elementary/photocam.pxd
@@ -4,6 +4,14 @@ from enums cimport Elm_Photocam_Zoom_Mode
 from libc.string cimport const_char
 
 cdef extern from "Elementary.h":
+    ctypedef struct Elm_Photocam_Progress:
+        double now
+        double total
+
+    ctypedef struct Elm_Photocam_Error:
+        int status
+        Eina_Bool open_error
+
     Evas_Object             *elm_photocam_add(Evas_Object *parent)
     Evas_Load_Error          elm_photocam_file_set(Evas_Object *obj, 
const_char *file)
     const_char *             elm_photocam_file_get(Evas_Object *obj)
diff --git a/efl/elementary/photocam.pyx b/efl/elementary/photocam.pyx
index 8a04d4f..616cd0d 100644
--- a/efl/elementary/photocam.pyx
+++ b/efl/elementary/photocam.pyx
@@ -50,6 +50,10 @@ Signals that you can add callbacks for are:
 - "scroll,anim,stop" - scrolling animation has stopped
 - "scroll,drag,start" - dragging the contents around has started
 - "scroll,drag,stop" - dragging the contents around has stopped
+- "download,start" - remote url download has started
+- "download,progress" - url download in progress
+- "download,end" - remote url download has finished
+- "download,error" - remote url download has finished with errors
 
 
 Enumerations
@@ -93,6 +97,50 @@ ELM_PHOTOCAM_ZOOM_MODE_AUTO_FILL = 
enums.ELM_PHOTOCAM_ZOOM_MODE_AUTO_FILL
 ELM_PHOTOCAM_ZOOM_MODE_AUTO_FIT_IN = enums.ELM_PHOTOCAM_ZOOM_MODE_AUTO_FIT_IN
 ELM_PHOTOCAM_ZOOM_MODE_LAST = enums.ELM_PHOTOCAM_ZOOM_MODE_LAST
 
+
+class PhotocamProgressInfo(object):
+    """
+
+    The info sent in the callback for the "download,progress" signals emitted
+    by Photocam while downloading remote urls.
+
+    :var now: The amount of data received so far.
+    :var total: The total amount of data to download.
+
+    """
+    def __init__(self):
+        self.now = 0
+        self.total = 0
+
+def _photocam_download_progress_conv(long addr):
+    cdef Elm_Photocam_Progress *pp = <Elm_Photocam_Progress *>addr
+    ppi = PhotocamProgressInfo()
+    ppi.now = pp.now
+    ppi.total = pp.total
+    return ppi
+
+class PhotocamErrorInfo(object):
+    """
+
+    The info sent in the callback for the "download,error" signals emitted
+    by Photocam when fail to download remote urls.
+
+    :var status: The http error code (such as 401)
+    :var open_error: TODOC
+
+    """
+    def __init__(self):
+        self.status = 0
+        self.open_error = False
+
+def _photocam_download_error_conv(long addr):
+    cdef Elm_Photocam_Error *pe = <Elm_Photocam_Error *>addr
+    pei = PhotocamErrorInfo()
+    pei.status = pe.status
+    pei.open_error = pe.open_error
+    return pei
+
+
 cdef class Photocam(Object):
 
     """This is the class that actually implements the widget."""
@@ -116,13 +164,18 @@ cdef class Photocam(Object):
         """
         def __set__(self, file):
             if isinstance(file, unicode): file = PyUnicode_AsUTF8String(file)
-            # TODO: Check if Evas_Load_Error is being used correctly here
-            if not elm_photocam_file_set(self.obj,
-                <const_char *>file if file is not None else NULL):
+            if elm_photocam_file_set(self.obj,
+                <const_char *>file if file is not None else NULL) != 0:
                     raise RuntimeError("Could not set file")
+
         def __get__(self):
             return _ctouni(elm_photocam_file_get(self.obj))
 
+    def file_set(self, file):
+        self.file = file
+    def file_get(self):
+        return _ctouni(elm_photocam_file_get(self.obj))
+
     property zoom:
         """The zoom level of the photo
 
@@ -140,6 +193,11 @@ cdef class Photocam(Object):
         def __get__(self):
             return elm_photocam_zoom_get(self.obj)
 
+    def zoom_set(self, zoom):
+        elm_photocam_zoom_set(self.obj, zoom)
+    def zoom_get(self):
+        return elm_photocam_zoom_get(self.obj)
+
     property zoom_mode:
         """Set the zoom mode
 
@@ -162,6 +220,11 @@ cdef class Photocam(Object):
         def __get__(self):
             return elm_photocam_zoom_mode_get(self.obj)
 
+    def zoom_mode_set(self, mode):
+        elm_photocam_zoom_mode_set(self.obj, mode)
+    def zoom_mode_get(self):
+        return elm_photocam_zoom_mode_get(self.obj)
+
     property image_size:
         """Get the current image pixel width and height
 
@@ -177,6 +240,11 @@ cdef class Photocam(Object):
             elm_photocam_image_size_get(self.obj, &w, &h)
             return (w, h)
 
+    def image_size_get(self):
+        cdef int w, h
+        elm_photocam_image_size_get(self.obj, &w, &h)
+        return (w, h)
+
     property image_region:
         """Get the region of the image that is currently shown
 
@@ -191,6 +259,11 @@ cdef class Photocam(Object):
             elm_photocam_image_region_get(self.obj, &x, &y, &w, &h)
             return (x, y, w, h)
 
+    def image_region_get(self):
+        cdef int x, y, w, h
+        elm_photocam_image_region_get(self.obj, &x, &y, &w, &h)
+        return (x, y, w, h)
+
     def image_region_show(self, x, y, w, h):
         """image_region_show(int x, int y, int w, int h)
 
@@ -245,6 +318,11 @@ cdef class Photocam(Object):
         def __get__(self):
             return bool(elm_photocam_paused_get(self.obj))
 
+    def paused_set(self, paused):
+        elm_photocam_paused_set(self.obj, paused)
+    def paused_get(self):
+        return bool(elm_photocam_paused_get(self.obj))
+
     property internal_image:
         """Get the internal low-res image used for photocam
 
@@ -261,6 +339,9 @@ cdef class Photocam(Object):
             img.obj = obj
             return img
 
+    def internal_image_get(self):
+        return self.internal_image
+
     property bounce:
         """Photocam scrolling bouncing.
 
@@ -275,6 +356,13 @@ cdef class Photocam(Object):
             elm_scroller_bounce_get(self.obj, &h_bounce, &v_bounce)
             return (h_bounce, v_bounce)
 
+    def bounce_set(self, h_bounce, v_bounce):
+        elm_scroller_bounce_set(self.obj, h_bounce, v_bounce)
+    def bounce_get(self):
+        cdef Eina_Bool h_bounce, v_bounce
+        elm_scroller_bounce_get(self.obj, &h_bounce, &v_bounce)
+        return (h_bounce, v_bounce)
+
     property gesture_enabled:
         """Set the gesture state for photocam.
 
@@ -289,6 +377,11 @@ cdef class Photocam(Object):
         def __get__(self):
             return bool(elm_photocam_gesture_enabled_get(self.obj))
 
+    def gesture_enabled_set(self, gesture):
+        elm_photocam_gesture_enabled_set(self.obj, gesture)
+    def gesture_enabled_get(self):
+        return bool(elm_photocam_gesture_enabled_get(self.obj))
+
     def callback_clicked_add(self, func, *args, **kwargs):
         """This is called when a user has clicked the photo without dragging
         around."""
@@ -405,5 +498,33 @@ cdef class Photocam(Object):
     def callback_scroll_drag_stop_del(self, func):
         self._callback_del("scroll,drag,stop", func)
 
+    def callback_download_start_add(self, func, *args, **kwargs):
+        """This is called when you set a remote url and the download start"""
+        self._callback_add("download,start", func, *args, **kwargs)
+
+    def callback_download_start_del(self, func):
+        self._callback_del("download,start", func)
+
+    def callback_download_progress_add(self, func, *args, **kwargs):
+        """This is called while a remote image download is in progress"""
+        self._callback_add_full("download,progress", 
_photocam_download_progress_conv, func, *args, **kwargs)
+
+    def callback_download_progress_del(self, func):
+        self._callback_del_full("download,progress", 
_photocam_download_progress_conv, func)
+
+    def callback_download_done_add(self, func, *args, **kwargs):
+        """This is called when you set a remote url and the download finish"""
+        self._callback_add("download,done", func, *args, **kwargs)
+
+    def callback_download_done_del(self, func):
+        self._callback_del("download,end", func)
+
+    def callback_download_error_add(self, func, *args, **kwargs):
+        """This is called in case a download has errors"""
+        self._callback_add_full("download,error", 
_photocam_download_error_conv, func, *args, **kwargs)
+
+    def callback_download_error_del(self, func):
+        self._callback_add_full("download,error", 
_photocam_download_error_conv, func)
+
 
 _object_mapping_register("elm_photocam", Photocam)
diff --git a/examples/elementary/test.py b/examples/elementary/test.py
index e80c394..8d49e93 100755
--- a/examples/elementary/test.py
+++ b/examples/elementary/test.py
@@ -90,6 +90,7 @@ items = [
             ("Icon Transparent", "test_icon", "icon_transparent_clicked"),
             ("Image", "test_image", "image_clicked"),
             ("Photo", "test_photo", "photo_clicked"),
+            ("Photocam", "test_photocam", "photocam_clicked"),
             ("Slideshow", "test_slideshow", "slideshow_clicked"),
             ("Thumb", "test_thumb", "thumb_clicked"),
             ("Video", "test_video", "video_clicked"),
diff --git a/examples/elementary/test_photocam.py 
b/examples/elementary/test_photocam.py
new file mode 100644
index 0000000..f724009
--- /dev/null
+++ b/examples/elementary/test_photocam.py
@@ -0,0 +1,148 @@
+#!/usr/bin/env python
+# encoding: utf-8
+
+from efl import evas
+from efl import elementary
+from efl.elementary.window import StandardWindow
+from efl.elementary.box import Box
+from efl.elementary.button import Button
+from efl.elementary.photocam import Photocam
+from efl.elementary.progressbar import Progressbar
+from efl.elementary.separator import Separator
+from efl.elementary.table import Table
+from efl.elementary.fileselector_button import FileselectorButton
+
+
+
+remote_url = 
"http://eoimages.gsfc.nasa.gov/images/imagerecords/73000/73751/world.topo.bathy.200407.3x21600x10800.jpg";
+
+
+def _cb_zoom_in(bt, pc):
+    pc.zoom_mode = elementary.ELM_PHOTOCAM_ZOOM_MODE_MANUAL
+    zoom = pc.zoom - 0.5
+    if zoom >= (1.0 / 32.0):
+        pc.zoom = zoom
+
+def _cb_zoom_out(bt, pc):
+    pc.zoom_mode = elementary.ELM_PHOTOCAM_ZOOM_MODE_MANUAL
+    zoom = pc.zoom + 0.5
+    if zoom <= 256.0:
+        pc.zoom = zoom
+
+
+def _cb_pc_download_start(im, pb):
+    print("CB DOWNLOAD START")
+    pb.value = 0.0
+    pb.show()
+
+def _cb_pc_download_done(im, pb):
+    print("CB DOWNLOAD DONE")
+    pb.hide()
+
+def _cb_pc_download_progress(im, progress, pb):
+    if progress.total > 0:
+        print("CB DOWNLOAD PROGRESS [now: %.0f, total: %.0f, %.2f %%]" %
+             (progress.now, progress.total, progress.now / progress.total * 
100))
+        pb.value = progress.now / progress.total
+
+def _cb_pc_download_error(im, info, pb):
+    print("CB DOWNLOAD ERROR [status %s, open_error: %s]" % (info.status, 
info.open_error))
+    pb.hide()
+
+
+def photocam_clicked(obj):
+    win = StandardWindow("photocam", "Photocam test")
+    win.autodel_set(True)
+    if obj is None:
+        win.callback_delete_request_add(lambda o: elementary.exit())
+
+    # Photocam widget
+    pc = Photocam(win)
+    pc.size_hint_weight = evas.EVAS_HINT_EXPAND, evas.EVAS_HINT_EXPAND
+    win.resize_object_add(pc)
+    pc.show()
+
+    # table for buttons
+    tb = Table(win);
+    tb.size_hint_weight = evas.EVAS_HINT_EXPAND, evas.EVAS_HINT_EXPAND
+    win.resize_object_add(tb)
+    tb.show()
+
+    # zoom out btn
+    bt = Button(win)
+    bt.text = "Z -"
+    bt.size_hint_weight = evas.EVAS_HINT_EXPAND, evas.EVAS_HINT_EXPAND
+    bt.size_hint_align = 0.1, 0.1
+    bt.callback_clicked_add(_cb_zoom_out, pc)
+    tb.pack(bt, 0, 0, 1, 1)
+    bt.show()
+
+    # select file btn
+    bt = FileselectorButton(win)
+    bt.text = "Select Photo File"
+    bt.size_hint_weight = evas.EVAS_HINT_EXPAND, evas.EVAS_HINT_EXPAND
+    bt.size_hint_align = 0.5, 0.1
+    bt.callback_file_chosen_add(lambda fs, path: pc.file_set(path))
+    tb.pack(bt, 1, 0, 1, 1)
+    bt.show()
+
+    # zoom in btn
+    bt = Button(win)
+    bt.text = "Z +"
+    bt.size_hint_weight = evas.EVAS_HINT_EXPAND, evas.EVAS_HINT_EXPAND
+    bt.size_hint_align = 0.9, 0.1
+    bt.callback_clicked_add(_cb_zoom_in, pc)
+    tb.pack(bt, 2, 0, 1, 1)
+    bt.show()
+
+    # progressbar for remote loading
+    pb = Progressbar(win)
+    pb.unit_format = "loading %.2f %%"
+    pb.size_hint_weight = evas.EVAS_HINT_EXPAND, evas.EVAS_HINT_EXPAND
+    pb.size_hint_align = evas.EVAS_HINT_FILL, evas.EVAS_HINT_FILL
+    tb.pack(pb, 1, 1, 1, 1)
+
+    # Fit btn
+    bt = Button(win);
+    bt.text = "Fit"
+    bt.size_hint_weight = evas.EVAS_HINT_EXPAND, evas.EVAS_HINT_EXPAND
+    bt.size_hint_align = 0.1, 0.9
+    bt.callback_clicked_add(lambda b: 
pc.zoom_mode_set(elementary.ELM_PHOTOCAM_ZOOM_MODE_AUTO_FIT))
+    tb.pack(bt, 0, 2, 1, 1)
+    bt.show()
+
+    # load remote url
+    bt = Button(win)
+    bt.text = "Load remote URL (27MB)"
+    bt.size_hint_weight = evas.EVAS_HINT_EXPAND, evas.EVAS_HINT_EXPAND
+    bt.size_hint_align = 0.5, 0.9
+    bt.callback_clicked_add(lambda b: pc.file_set(remote_url))
+    tb.pack(bt, 1, 2, 1, 1)
+    bt.show()
+
+    pc.callback_download_start_add(_cb_pc_download_start, pb)
+    pc.callback_download_done_add(_cb_pc_download_done, pb)
+    pc.callback_download_progress_add(_cb_pc_download_progress, pb)
+    pc.callback_download_error_add(_cb_pc_download_error, pb)
+
+    # Fill btn
+    bt = Button(win);
+    bt.text = "Fill"
+    bt.size_hint_weight = evas.EVAS_HINT_EXPAND, evas.EVAS_HINT_EXPAND
+    bt.size_hint_align = 0.9, 0.9
+    bt.callback_clicked_add(lambda b: 
pc.zoom_mode_set(elementary.ELM_PHOTOCAM_ZOOM_MODE_AUTO_FILL))
+    tb.pack(bt, 2, 2, 1, 1)
+    bt.show()
+
+    # show the win
+    win.resize(600, 600)
+    win.show()
+
+
+if __name__ == "__main__":
+    elementary.init()
+
+    photocam_clicked(None)
+
+    elementary.run()
+    elementary.shutdown()

-- 

------------------------------------------------------------------------------
Get 100% visibility into Java/.NET code with AppDynamics Lite!
It's a free troubleshooting tool designed for production.
Get down to code-level detail for bottlenecks, with <2% overhead. 
Download for free and get started troubleshooting in minutes. 
http://pubads.g.doubleclick.net/gampad/clk?id=48897031&iu=/4140/ostg.clktrk

Reply via email to