kuuko pushed a commit to branch master.

commit 4b9cacd74e144847dd1ab79a342e8c4462b3effa
Author: Kai Huuhko <[email protected]>
Date:   Mon Apr 8 17:49:28 2013 +0000

    Evas: Fix Textgrid and add tests.
---
 TODO                                      |  1 -
 efl/evas/object_textgrid.pxi              | 70 +++++++++++++++++++++----------
 examples/elementary/test_evas_textgrid.py | 49 ++++++++++++++++++++++
 include/efl.pxd                           |  2 +-
 tests/evas/test_11_object_textgrid.py     | 41 ++++++++++++++++++
 5 files changed, 139 insertions(+), 24 deletions(-)

diff --git a/TODO b/TODO
index 2d80e31..41f297c 100644
--- a/TODO
+++ b/TODO
@@ -36,7 +36,6 @@ TODO
 * Add more documentation for the use of callbacks
 * Document our use of exceptions
 * Split Evas to individual modules?
-* Tests for evas.Textgrid
 * update links and text on: 
http://www.freedesktop.org/wiki/Software/DBusBindings
 
 
diff --git a/efl/evas/object_textgrid.pxi b/efl/evas/object_textgrid.pxi
index f10e728..f41d01b 100644
--- a/efl/evas/object_textgrid.pxi
+++ b/efl/evas/object_textgrid.pxi
@@ -59,18 +59,31 @@ cdef class TextgridCell(object):
 
     """
 
-    cdef Evas_Textgrid_Cell cell
+    cdef Evas_Textgrid_Cell *cell
 
-    def __cinit__(self, Evas_Textgrid_Cell cell):
-        self.cell = cell
+    def __str__(self):
+        return "%s" % (self.codepoint,)
+
+    def __repr__(self):
+        return "%s(codepoint = %s, fg = %s, bg = %s, bold = %s, \
+            italic = %s, underline = %s, strikethrough = %s, \
+            fg_extended = %s, bg_extended = %s, double_width = %s)" % (
+            type(self).__name__, self.codepoint,
+            self.fg, self.bg, self.bold, self.italic,
+            self.underline, self.strikethrough,
+            self.fg_extended, self.bg_extended,
+            self.double_width)
 
     property codepoint:
         """the UNICODE value of the character"""
-        def __set__(self, Eina_Unicode value):
-            self.cell.codepoint = value
+        def __set__(self, value):
+            if not isinstance(value, unicode):
+                value = value.decode("UTF-8")
+
+            self.cell.codepoint = <Py_UCS4>value
 
         def __get__(self):
-            return self.cell.codepoint
+            return <unicode><Py_UCS4>self.cell.codepoint
 
     property fg:
         """the index of the palette for the foreground color"""
@@ -94,7 +107,7 @@ cdef class TextgridCell(object):
             self.cell.bold = value
 
         def __get__(self):
-            return self.cell.bold
+            return <bint>self.cell.bold
 
     property italic:
         """whether the character is oblique"""
@@ -102,7 +115,7 @@ cdef class TextgridCell(object):
             self.cell.italic = value
 
         def __get__(self):
-            return self.cell.italic
+            return <bint>self.cell.italic
 
     property underline:
         """whether the character is underlined"""
@@ -110,7 +123,7 @@ cdef class TextgridCell(object):
             self.cell.underline = value
 
         def __get__(self):
-            return self.cell.underline
+            return <bint>self.cell.underline
 
     property strikethrough:
         """whether the character is strikethrough'ed"""
@@ -118,7 +131,7 @@ cdef class TextgridCell(object):
             self.cell.strikethrough = value
 
         def __get__(self):
-            return self.cell.strikethrough
+            return <bint>self.cell.strikethrough
 
     property fg_extended:
         """whether the extended palette is used for the foreground color"""
@@ -126,7 +139,7 @@ cdef class TextgridCell(object):
             self.cell.fg_extended = value
 
         def __get__(self):
-            return self.cell.fg_extended
+            return <bint>self.cell.fg_extended
 
     property bg_extended:
         """whether the extended palette is used for the background color"""
@@ -134,7 +147,7 @@ cdef class TextgridCell(object):
             self.cell.bg_extended = value
 
         def __get__(self):
-            return self.cell.bg_extended
+            return <bint>self.cell.bg_extended
 
     property double_width:
         """if the codepoint is merged with the following cell to the right 
visually (cells must be in pairs with 2nd cell being a duplicate in all ways 
except codepoint is 0)"""
@@ -142,9 +155,7 @@ cdef class TextgridCell(object):
             self.cell.double_width = value
 
         def __get__(self):
-            return self.cell.double_width
-
-
+            return <bint>self.cell.double_width
 
 cdef class Textgrid(Object):
 
@@ -239,7 +250,7 @@ cdef class Textgrid(Object):
 
         """
         def __set__(self, value):
-            cdef Evas_Font_Size font_size
+            cdef int font_size
             font_name, font_size = value
             a1 = font_name
             if isinstance(a1, unicode): a1 = a1.encode("UTF-8")
@@ -372,10 +383,21 @@ cdef class Textgrid(Object):
         @since 1.7
 
         """
-        cdef TextgridCell cell = row[0]
-        evas_object_textgrid_cellrow_set(self.obj, y, &cell.cell)
+        cdef:
+            TextgridCell cell
+            Evas_Textgrid_Cell **crow
+            int rlen = len(row)
+            int i
+
+        crow = <Evas_Textgrid_Cell **>malloc(rlen * sizeof(Evas_Textgrid_Cell 
*))
+
+        for i in range(rlen):
+            cell = row[i]
+            crow[i] = cell.cell
 
-    def cellrow_get(self, int y, int w):
+        evas_object_textgrid_cellrow_set(self.obj, y, crow[0])
+
+    def cellrow_get(self, int y):
         """
 
         Get the string at the given row of the given textgrid object.
@@ -398,10 +420,14 @@ cdef class Textgrid(Object):
             Evas_Textgrid_Cell *row = 
evas_object_textgrid_cellrow_get(self.obj, y)
             int i
             list ret = []
+            TextgridCell cell
+
+        if row == NULL:
+            return None
 
-        for i in range(w):
+        for i in range(self.size[0]):
             cell = TextgridCell.__new__(TextgridCell)
-            cell.cell = row[i]
+            cell.cell = &row[i]
             ret.append(cell)
 
         return ret
@@ -421,7 +447,7 @@ cdef class Textgrid(Object):
         as an example::
 
             cells = tg.cellrow_get(row)
-            for i in range(0, width):
+            for i in range(width):
                 cells[i].codepoint = 'E'
             tg.cellrow_set(row, cells)
             tg.update_add(0, row, width, 1)
diff --git a/examples/elementary/test_evas_textgrid.py 
b/examples/elementary/test_evas_textgrid.py
new file mode 100644
index 0000000..b1698dc
--- /dev/null
+++ b/examples/elementary/test_evas_textgrid.py
@@ -0,0 +1,49 @@
+#!/usr/bin/env python
+# encoding: utf-8
+
+from efl import evas
+from efl import elementary
+from efl.elementary.window import StandardWindow
+from efl.elementary.background import Background
+
+
+def evas_textgrid_clicked(obj, item=None):
+    win = StandardWindow("evasobjects", "Evas Objects Test")
+    win.autodel_set(True)
+    win.resize(320, 320)
+    if obj is None:
+        win.callback_delete_request_add(lambda o: elementary.exit())
+
+    tg = evas.Textgrid(win.evas)
+    tg.size = 15, 1
+    tg.size_hint_weight_set(1.0, 1.0)
+    win.resize_object_add(tg)
+    tg.font = "Courier", 20
+    tg.palette_set(evas.EVAS_TEXTGRID_PALETTE_STANDARD, 0, 0, 0, 0, 255)
+    tg.palette_set(evas.EVAS_TEXTGRID_PALETTE_STANDARD, 1, 255, 255, 255, 255)
+
+    row = tg.cellrow_get(0)
+    for cell in row:
+        cell.codepoint="ö"
+        cell.fg = 1
+        cell.bg = 0
+    tg.cellrow_set(0, row)
+
+    tg.show()
+    tg.update_add(0, 0, 10, 1)
+
+    rowback = tg.cellrow_get(0)
+
+    win.show()
+
+
+if __name__ == "__main__":
+    evas.init()
+    elementary.init()
+
+    evas_textgrid_clicked(None)
+
+    elementary.run()
+    elementary.shutdown()
+    evas.shutdown()
+
diff --git a/include/efl.pxd b/include/efl.pxd
index 5663e10..bcf63da 100644
--- a/include/efl.pxd
+++ b/include/efl.pxd
@@ -61,7 +61,7 @@ cdef extern from "Eina.h":
     ctypedef const_char Eina_Stringshare
     # This is actually either wchar_t or uint32_t, Cython
     # should use an appropriate integer automatically
-    ctypedef int Eina_Unicode
+    ctypedef Py_UCS4 Eina_Unicode
 
     ####################################################################
     # Structures
diff --git a/tests/evas/test_11_object_textgrid.py 
b/tests/evas/test_11_object_textgrid.py
new file mode 100644
index 0000000..9a9d6d8
--- /dev/null
+++ b/tests/evas/test_11_object_textgrid.py
@@ -0,0 +1,41 @@
+#!/usr/bin/env python
+#coding=UTF-8
+
+from efl.evas import Canvas, Textgrid, TextgridCell
+import unittest
+
+
+class TestTextgridBasics(unittest.TestCase):
+    def setUp(self):
+        self.canvas = Canvas(
+            method="buffer",
+            size=(400, 500),
+            viewport=(0, 0, 400, 500)
+        )
+        self.canvas.engine_info_set(self.canvas.engine_info_get())
+
+    def tearDown(self):
+        self.canvas.delete()
+        del self.canvas
+
+    def testTextgridConstructor(self):
+        tg = Textgrid(self.canvas)
+        self.assertEqual(type(tg), Textgrid)
+
+    def testTextgrid(self):
+        tg = Textgrid(self.canvas)
+        tg.size = 10, 10
+        row = tg.cellrow_get(0)
+        for cell in row:
+            cell.codepoint = "ö"
+            cell.bold = True
+        tg.cellrow_set(0, row)
+        tg.update_add(0, 0, 10, 1)
+        rowback = tg.cellrow_get(0)
+        print(tg.cell_size)
+        self.assertEqual(row[0].codepoint, rowback[0].codepoint)
+
+
+if __name__ == '__main__':
+    unittest.main(verbosity=2)
+    evas.shutdown()

-- 

------------------------------------------------------------------------------
Precog is a next-generation analytics platform capable of advanced
analytics on semi-structured data. The platform includes APIs for building
apps and a phenomenal toolset for data science. Developers can use
our toolset for easy data analysis & visualization. Get a free account!
http://www2.precog.com/precogplatform/slashdotnewsletter

Reply via email to