kuuko pushed a commit to branch master.
commit 10635266ff0002a2406f387d490b1806cd0ba094
Author: Kai Huuhko <[email protected]>
Date: Sat Apr 13 22:53:21 2013 +0000
Evas: Add Table.
---
doc/evas/class-table.rst | 4 +
doc/evas/evas.rst | 1 +
efl/evas/efl.evas.pyx | 1 +
efl/evas/object_table.pxi | 272 ++++++++++++++++++++++++++++++++++++++++++++++
include/efl.evas.pxd | 26 ++++-
5 files changed, 303 insertions(+), 1 deletion(-)
diff --git a/doc/evas/class-table.rst b/doc/evas/class-table.rst
new file mode 100644
index 0000000..19a7936
--- /dev/null
+++ b/doc/evas/class-table.rst
@@ -0,0 +1,4 @@
+:class:`efl.evas.Table` Class
+=============================
+
+.. autoclass:: efl.evas.Table
diff --git a/doc/evas/evas.rst b/doc/evas/evas.rst
index d3e1d97..f1a86d9 100644
--- a/doc/evas/evas.rst
+++ b/doc/evas/evas.rst
@@ -214,6 +214,7 @@ Reference
class-object-textblock
class-object-box
class-object-smart
+ class-table
class-textgrid
class-map
diff --git a/efl/evas/efl.evas.pyx b/efl/evas/efl.evas.pyx
index 32d28c9..6a92bc1 100644
--- a/efl/evas/efl.evas.pyx
+++ b/efl/evas/efl.evas.pyx
@@ -321,6 +321,7 @@ include "efl.evas_object_text.pxi"
include "efl.evas_object_textblock.pxi"
include "efl.evas_object_box.pxi"
include "object_textgrid.pxi"
+include "object_table.pxi"
init()
diff --git a/efl/evas/object_table.pxi b/efl/evas/object_table.pxi
new file mode 100644
index 0000000..c72d3c9
--- /dev/null
+++ b/efl/evas/object_table.pxi
@@ -0,0 +1,272 @@
+# Copyright (C) 2007-2013 various contributors (see AUTHORS)
+#
+# This file is part of Python-EFL.
+#
+# Python-EFL is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# Python-EFL is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with this Python-EFL. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""
+
+.. _Evas_Object_Table_Homogeneous_Mode:
+
+.. rubric:: Table homogeneous mode
+
+How to pack items into cells in a table.
+
+EVAS_OBJECT_TABLE_HOMOGENEOUS_NONE = 0,
+EVAS_OBJECT_TABLE_HOMOGENEOUS_TABLE = 1,
+EVAS_OBJECT_TABLE_HOMOGENEOUS_ITEM = 2
+
+"""
+
+from efl.eo cimport _object_list_to_python
+
+cdef class Table(Object):
+
+ def __init__(self, Canvas canvas not None):
+ self._set_obj(evas_object_table_add(canvas.obj))
+
+ @classmethod
+ def add_to(cls, Object parent):
+ """Create a table that is child of a given parent.
+
+ :param parent:
+ :type parent: Object
+
+ """
+ Object._set_obj(cls, evas_object_table_add_to(parent.obj))
+
+ property homogeneous:
+ """Set how this table should layout children.
+
+ :todo: consider aspect hint and respect it.
+
+ EVAS_OBJECT_TABLE_HOMOGENEOUS_NONE
+ If table does not use homogeneous mode then columns and rows will
+ be calculated based on hints of individual cells. This operation
+ mode is more flexible, but more complex and heavy to calculate as
+ well. **Weight** properties are handled as a boolean expand.
Negative
+ alignment will be considered as 0.5. This is the default.
+
+ :todo: EVAS_OBJECT_TABLE_HOMOGENEOUS_NONE should balance weight.
+
+ EVAS_OBJECT_TABLE_HOMOGENEOUS_TABLE
+ When homogeneous is relative to table the own table size is divided
+ equally among children, filling the whole table area. That is, if
+ table has ``WIDTH`` and ``COLUMNS``, each cell will get ``WIDTH /
+ COLUMNS`` pixels. If children have minimum size that is larger
+ than this amount (including padding), then it will overflow and be
+ aligned respecting the alignment hint, possible overlapping sibling
+ cells. **Weight** hint is used as a boolean, if greater than zero
it
+ will make the child expand in that axis, taking as much space as
+ possible (bounded to maximum size hint). Negative alignment will be
+ considered as 0.5.
+
+ EVAS_OBJECT_TABLE_HOMOGENEOUS_ITEM
+ When homogeneous is relative to item it means the greatest minimum
+ cell size will be used. That is, if no element is set to expand,
+ the table will have its contents to a minimum size, the bounding
+ box of all these children will be aligned relatively to the table
+ object using evas_object_table_align_get(). If the table area is
+ too small to hold this minimum bounding box, then the objects will
+ keep their size and the bounding box will overflow the box area,
+ still respecting the alignment. **Weight** hint is used as a
+ boolean, if greater than zero it will make that cell expand in that
+ axis, toggling the **expand mode**, which makes the table behave
+ much like **EVAS_OBJECT_TABLE_HOMOGENEOUS_TABLE**, except that the
+ bounding box will overflow and items will not overlap siblings. If
+ no minimum size is provided at all then the table will fallback to
+ expand mode as well.
+
+ :type: Evas_Object_Table_Homogeneous_Mode
+
+ """
+ def __set__(self, value):
+ self.homogeneous_set(value)
+
+ def __get__(self):
+ return self.homogeneous_get()
+
+ cpdef homogeneous_set(self, Evas_Object_Table_Homogeneous_Mode
homogeneous):
+ evas_object_table_homogeneous_set(self.obj, homogeneous)
+
+ cpdef homogeneous_get(self):
+ return evas_object_table_homogeneous_get(self.obj)
+
+ property padding:
+ """Padding between cells.
+
+ :type: (int **horizontal**, int **vertical**)
+
+ """
+ def __set__(self, value):
+ self.padding_set(*value)
+
+ def __get__(self):
+ return self.padding_get()
+
+ cpdef padding_set(self, Evas_Coord horizontal, Evas_Coord vertical):
+ evas_object_table_padding_set(self.obj, horizontal, vertical)
+
+ cpdef padding_get(self):
+ cdef Evas_Coord horizontal, vertical
+ evas_object_table_padding_get(self.obj, &horizontal, &vertical)
+ return (horizontal, vertical)
+
+ property align:
+ """Set the alignment of the whole bounding box of contents.
+
+ :type: (double **horizontal**, double **vertical**)
+
+ """
+
+ cpdef align_set(self, double horizontal, double vertical):
+ evas_object_table_align_set(self.obj, horizontal, vertical)
+
+ cpdef align_get(self):
+ cdef double horizontal, vertical
+ evas_object_table_align_get(self.obj, &horizontal, &vertical)
+ return (horizontal, vertical)
+
+ property mirrored:
+ """Sets the mirrored mode of the table. In mirrored mode the table
items go
+ from right to left instead of left to right. That is, 1,1 is top
right, not
+ top left.
+
+ :type: bool
+
+ """
+ def __set__(self, value):
+ self.mirrored_set(value)
+
+ def __get__(self):
+ return self.mirrored_get()
+
+ cpdef mirrored_set(self, bint mirrored):
+ evas_object_table_mirrored_set(self.obj, mirrored)
+
+ cpdef mirrored_get(self):
+ return bool(evas_object_table_mirrored_get(self.obj))
+
+ def pack_get(self, Object child):
+ """pack_get(Object child)
+
+ Get packing location of a child of table
+
+ :param child: The child object to add.
+ :param col: pointer to store relative-horizontal position to place
child.
+ :param row: pointer to store relative-vertical position to place child.
+ :param colspan: pointer to store how many relative-horizontal position
to use for this child.
+ :param rowspan: pointer to store how many relative-vertical position
to use for this child.
+
+ :raise RuntimeError: when the packing location cannot be fetched.
+
+ """
+ cdef unsigned short col, row, colspan, rowspan
+ if not evas_object_table_pack_get(self.obj, child.obj, &col, &row,
&colspan, &rowspan):
+ raise RuntimeError("Could not get packing location.")
+ else:
+ return (col, row, colspan, rowspan)
+
+ def pack(self, Object child, unsigned short col, unsigned short row,
unsigned short colspan, unsigned short rowspan):
+ """pack(Object child, unsigned short col, unsigned short row, unsigned
short colspan, unsigned short rowspan)
+
+ Add a new child to a table object or set its current packing.
+
+ :param child: The child object to add.
+ :param col: relative-horizontal position to place child.
+ :param row: relative-vertical position to place child.
+ :param colspan: how many relative-horizontal position to use for this
child.
+ :param rowspan: how many relative-vertical position to use for this
child.
+
+ :raise RuntimeError: when the child cannot be packed to the table.
+
+ """
+ if not evas_object_table_pack(self.obj, child.obj, col, row, colspan,
rowspan):
+ raise RuntimeError("Could not pack the child to the table.")
+
+ def unpack(self, Object child):
+ """unpack(Object child)
+
+ Remove child from table.
+
+ .. note::
+
+ Removing a child will immediately call a walk over children in
order
+ to recalculate numbers of columns and rows. If you plan to remove
+ all children, use evas_object_table_clear() instead.
+
+ :raise RuntimeError: when the child cannot be removed from the table.
+
+ """
+ if not evas_object_table_unpack(self.obj, child.obj):
+ raise RuntimeError("Could not remove child from the table.")
+
+ def clear(self, clear):
+ """clear(clear)
+
+ Faster way to remove all child objects from a table object.
+
+ :param clear: if True, it will delete just removed children.
+
+ """
+ evas_object_table_clear(self.obj, clear)
+
+ property col_row_size:
+ """Get the number of columns and rows this table takes.
+
+ .. note::
+
+ columns and rows are virtual entities, one can specify a table
+ with a single object that takes 4 columns and 5 rows. The only
+ difference for a single cell table is that paddings will be
+ accounted proportionally.
+
+ """
+ def __get__(self):
+ return self.col_row_size_get()
+
+ cpdef col_row_size_get(self):
+ cdef int cols, rows
+ evas_object_table_col_row_size_get(self.obj, &cols, &rows)
+ return (cols, rows)
+
+ def children_get(self):
+ """children_get() -> list
+
+ Get the list of children for the table.
+
+ :type: list of Objects
+
+ """
+ cdef:
+ Eina_List *lst = evas_object_table_children_get(self.obj)
+ list ret = _object_list_to_python(lst)
+ eina_list_free(lst)
+ return ret
+
+ def child_get(self, int col, int row):
+ """child_get(int col, int row) -> Object
+
+ Get the child of the table at the given coordinates
+
+ :param col:
+ :type col: int
+ :param row:
+ :type row: int
+
+ .. note:: This does not take into account col/row spanning
+
+ """
+ return object_from_instance(evas_object_table_child_get(self.obj, col,
row))
diff --git a/include/efl.evas.pxd b/include/efl.evas.pxd
index 3a168a2..c6e0e78 100644
--- a/include/efl.evas.pxd
+++ b/include/efl.evas.pxd
@@ -25,7 +25,7 @@ from efl.evas.enums cimport Evas_Event_Flags,
Evas_Button_Flags, \
Evas_Text_Style_Type, Evas_Textblock_Text_Type, \
Evas_Textgrid_Palette, Evas_Textgrid_Font_Style, \
Evas_Fill_Spread, Evas_Image_Scale_Hint, Evas_Image_Content_Hint, \
- Evas_Image_Animated_Loop_Hint
+ Evas_Image_Animated_Loop_Hint, Evas_Object_Table_Homogeneous_Mode
cdef extern from "Evas.h":
####################################################################
@@ -807,6 +807,30 @@ cdef extern from "Evas.h":
Evas_Textgrid_Cell *evas_object_textgrid_cellrow_get(const_Evas_Object
*obj, int y)
void evas_object_textgrid_update_add(Evas_Object *obj, int x, int y, int
w, int h)
+ ####################################################################
+ # Table
+ #
+
+ Evas_Object *evas_object_table_add(Evas *evas)
+ Evas_Object *evas_object_table_add_to(Evas_Object
*parent)
+ void
evas_object_table_homogeneous_set(Evas_Object *o,
Evas_Object_Table_Homogeneous_Mode homogeneous)
+ Evas_Object_Table_Homogeneous_Mode
evas_object_table_homogeneous_get(const_Evas_Object *o)
+ void
evas_object_table_padding_set(Evas_Object *o, Evas_Coord horizontal, Evas_Coord
vertical)
+ void
evas_object_table_padding_get(const_Evas_Object *o, Evas_Coord *horizontal,
Evas_Coord *vertical)
+ void evas_object_table_align_set(Evas_Object
*o, double horizontal, double vertical)
+ void
evas_object_table_align_get(const_Evas_Object *o, double *horizontal, double
*vertical)
+ void
evas_object_table_mirrored_set(Evas_Object *o, Eina_Bool mirrored)
+ Eina_Bool
evas_object_table_mirrored_get(const_Evas_Object *o)
+ Eina_Bool
evas_object_table_pack_get(const_Evas_Object *o, Evas_Object *child, unsigned
short *col, unsigned short *row, unsigned short *colspan, unsigned short
*rowspan)
+ Eina_Bool evas_object_table_pack(Evas_Object *o,
Evas_Object *child, unsigned short col, unsigned short row, unsigned short
colspan, unsigned short rowspan)
+ Eina_Bool evas_object_table_unpack(Evas_Object
*o, Evas_Object *child)
+ void evas_object_table_clear(Evas_Object *o,
Eina_Bool clear)
+ void
evas_object_table_col_row_size_get(const_Evas_Object *o, int *cols, int *rows)
+ # FIXME: Not needed?: Eina_Iterator
*evas_object_table_iterator_new(const_Evas_Object *o)
+ # FIXME: Not needed?: Eina_Accessor
*evas_object_table_accessor_new(const_Evas_Object *o)
+ Eina_List
*evas_object_table_children_get(const_Evas_Object *o)
+ Evas_Object
*evas_object_table_child_get(const_Evas_Object *o, unsigned short col, unsigned
short row)
+
####################################################################
# Python classes
--
------------------------------------------------------------------------------
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