Evas.Textgrid: Fix memleak
Had to change the type of cellrows from list to custom tuple-like type.
This commit is contained in:
parent
fb34f48c9d
commit
acf2d33969
|
@ -42,6 +42,14 @@ cdef class TextgridCell(object):
|
|||
self.fg_extended, self.bg_extended,
|
||||
self.double_width)
|
||||
|
||||
@staticmethod
|
||||
cdef TextgridCell create(Evas_Textgrid_Cell *cell):
|
||||
if cell == NULL:
|
||||
raise ValueError("Invalid pointer for evas textgrid cell!")
|
||||
cdef TextgridCell ret = TextgridCell.__new__(TextgridCell)
|
||||
ret.cell = cell
|
||||
return ret
|
||||
|
||||
property codepoint:
|
||||
"""the UNICODE value of the character
|
||||
|
||||
|
@ -167,6 +175,35 @@ cdef class TextgridCell(object):
|
|||
def __get__(self):
|
||||
return <bint>self.cell.double_width
|
||||
|
||||
|
||||
cdef class TextgridCellRow:
|
||||
|
||||
cdef:
|
||||
Evas_Textgrid_Cell *row
|
||||
unsigned int rowsize
|
||||
|
||||
@staticmethod
|
||||
cdef TextgridCellRow create(Evas_Textgrid_Cell *row, unsigned int rowsize):
|
||||
if row == NULL:
|
||||
raise ValueError("Invalid pointer for evas textgrid cell row!")
|
||||
cdef TextgridCellRow ret = TextgridCellRow.__new__(TextgridCellRow)
|
||||
ret.row = row
|
||||
ret.rowsize = rowsize
|
||||
return ret
|
||||
|
||||
def __len__(self):
|
||||
return self.rowsize
|
||||
|
||||
def __getitem__(self, x):
|
||||
if x > self.rowsize - 1:
|
||||
raise IndexError
|
||||
if x < 0:
|
||||
x = self.rowsize - x
|
||||
if x < 0:
|
||||
raise IndexError
|
||||
return TextgridCell.create(&self.row[x])
|
||||
|
||||
|
||||
cdef class Textgrid(Object):
|
||||
"""
|
||||
|
||||
|
@ -343,13 +380,13 @@ cdef class Textgrid(Object):
|
|||
def __get__(self):
|
||||
return evas_object_textgrid_supported_font_styles_get(self.obj)
|
||||
|
||||
def cellrow_set(self, int y, list row not None):
|
||||
def cellrow_set(self, int y, TextgridCellRow row not None):
|
||||
"""Set the string at the given row.
|
||||
|
||||
:param y: The row index of the grid.
|
||||
:type y: int
|
||||
:param row: The string as a sequence of :class:`TextgridCell`.
|
||||
:type row: list
|
||||
:type row: :class:`TextgridCellRow`
|
||||
|
||||
This method allows returning cells to the textgrid, retrieved with
|
||||
:py:meth:`cellrow_get`.
|
||||
|
@ -361,26 +398,14 @@ cdef class Textgrid(Object):
|
|||
:py:meth:`update_add`
|
||||
|
||||
"""
|
||||
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
|
||||
|
||||
evas_object_textgrid_cellrow_set(self.obj, y, crow[0])
|
||||
evas_object_textgrid_cellrow_set(self.obj, y, row.row)
|
||||
|
||||
def cellrow_get(self, int y):
|
||||
"""Get the string at the given row.
|
||||
|
||||
:param int y: The row index of the grid.
|
||||
:return: A list of :class:`TextgridCell`
|
||||
:rtype: list
|
||||
:rtype: :class:`TextgridCellRow`
|
||||
|
||||
This method returns a list of cells in the line **y** of
|
||||
the textgrid object. If **y** is not between 0 and the number
|
||||
|
@ -393,21 +418,8 @@ cdef class Textgrid(Object):
|
|||
:py:meth:`update_add`
|
||||
|
||||
"""
|
||||
cdef:
|
||||
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(self.size[0]):
|
||||
cell = TextgridCell.__new__(TextgridCell)
|
||||
cell.cell = &row[i]
|
||||
ret.append(cell)
|
||||
|
||||
return ret
|
||||
return TextgridCellRow.create(
|
||||
evas_object_textgrid_cellrow_get(self.obj, y), self.size[0])
|
||||
|
||||
def update_add(self, int x, int y, int w, int h):
|
||||
"""Indicate for evas that part of a textgrid region (cells) has been updated.
|
||||
|
|
|
@ -5,34 +5,46 @@ from efl import evas
|
|||
from efl.evas import Textgrid, EVAS_TEXTGRID_PALETTE_STANDARD
|
||||
from efl import elementary
|
||||
from efl.elementary.window import StandardWindow
|
||||
from efl.elementary.background import Background
|
||||
|
||||
if "unichr" not in dir(__builtins__):
|
||||
unichr = chr
|
||||
|
||||
|
||||
def evas_textgrid_clicked(obj, item=None):
|
||||
win = StandardWindow("evastextgrid", "Evas Textgrid Test", autodel=True,
|
||||
size=(320, 320))
|
||||
win = StandardWindow(
|
||||
"evastextgrid", "Evas Textgrid Test", autodel=True)
|
||||
if obj is None:
|
||||
win.callback_delete_request_add(lambda o: elementary.exit())
|
||||
|
||||
tg = 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_TEXTGRID_PALETTE_STANDARD, 0, 0, 0, 0, 255)
|
||||
tg.palette_set(EVAS_TEXTGRID_PALETTE_STANDARD, 1, 255, 255, 255, 255)
|
||||
W = 80
|
||||
H = 26
|
||||
|
||||
row = tg.cellrow_get(0)
|
||||
for cell in row:
|
||||
cell.codepoint="ö"
|
||||
cell.fg = 1
|
||||
cell.bg = 0
|
||||
tg.cellrow_set(0, row)
|
||||
tg = Textgrid(
|
||||
win.evas, size_hint_weight=(1.0, 1.0), size=(W, H),
|
||||
font=("monospace", 14))
|
||||
win.resize_object_add(tg)
|
||||
tg.palette_set(EVAS_TEXTGRID_PALETTE_STANDARD, 0, 0, 0, 0, 255)
|
||||
|
||||
win.size_step = tg.cell_size
|
||||
|
||||
# XXX: Add 1 to size, else the last row/col won't fit. Unknown reason.
|
||||
win.size = (W * tg.cell_size[0] + 1, H * tg.cell_size[1] + 1)
|
||||
|
||||
for i in range(H):
|
||||
ci = i + 1
|
||||
cv = ci * 9
|
||||
tg.palette_set(
|
||||
EVAS_TEXTGRID_PALETTE_STANDARD, ci, cv, cv, cv, 255)
|
||||
row = tg.cellrow_get(i)
|
||||
if row is not None:
|
||||
for cell in row:
|
||||
cell.codepoint = unichr(1000 + i)
|
||||
cell.bg = 0
|
||||
cell.fg = ci
|
||||
tg.cellrow_set(i, row)
|
||||
|
||||
tg.show()
|
||||
tg.update_add(0, 0, 10, 1)
|
||||
|
||||
rowback = tg.cellrow_get(0)
|
||||
tg.update_add(0, 0, 80, 26)
|
||||
|
||||
win.show()
|
||||
|
||||
|
@ -46,4 +58,3 @@ if __name__ == "__main__":
|
|||
elementary.run()
|
||||
elementary.shutdown()
|
||||
evas.shutdown()
|
||||
|
||||
|
|
Loading…
Reference in New Issue