added start and end index to get_render_lines

This commit is contained in:
Will McGugan
2022-04-07 09:25:14 +01:00
parent 80412ccc33
commit 09580fe6d4
2 changed files with 18 additions and 10 deletions

View File

@@ -325,14 +325,14 @@ class Compositor:
return Style.null()
if widget not in self.regions:
return Style.null()
lines = widget.get_render_lines()
x -= region.x
y -= region.y
if y > len(lines):
lines = widget.get_render_lines(y, y + 1)
if not lines:
return Style.null()
line = lines[y]
end = 0
for segment in line:
for segment in lines[0]:
end += segment.cell_length
if x < end:
return segment.style or Style.null()
@@ -422,12 +422,11 @@ class Compositor:
if region in clip:
yield region, clip, widget.get_render_lines()
elif overlaps(clip, region):
lines = widget.get_render_lines()
new_x, new_y, new_width, new_height = intersection(region, clip)
delta_x = new_x - region.x
delta_y = new_y - region.y
splits = [delta_x, delta_x + new_width]
lines = lines[delta_y : delta_y + new_height]
lines = widget.get_render_lines(delta_y, delta_y + new_height)
lines = [list(divide(line, splits))[1] for line in lines]
yield region, clip, lines

View File

@@ -507,16 +507,25 @@ class Widget(DOMNode):
width, height = self.size
renderable = self.render_styled()
options = self.console.options.update_dimensions(width, height)
lines = self.console.render_lines(renderable, options)
self._render_cache = RenderCache(self.size, lines)
self._dirty_regions.clear()
def get_render_lines(self) -> Lines:
"""Get segment lines to render the widget."""
def get_render_lines(
self, start: int | None = None, end: int | None = None
) -> Lines:
"""Get segment lines to render the widget.
Args:
start (int | None, optional): line start index, or None for first line. Defaults to None.
end (int | None, optional): line end index, or None for last line. Defaults to None.
Returns:
Lines: A list of lists of segments.
"""
if self._dirty_regions:
self._render_lines()
lines = self._render_cache.lines
lines = self._render_cache.lines[start:end]
return lines
def check_layout(self) -> bool: