From 09580fe6d49b52a975ed3ded79c544c62c43aa63 Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Thu, 7 Apr 2022 09:25:14 +0100 Subject: [PATCH] added start and end index to get_render_lines --- src/textual/_compositor.py | 11 +++++------ src/textual/widget.py | 17 +++++++++++++---- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/textual/_compositor.py b/src/textual/_compositor.py index 6f35cac19..5b4e68776 100644 --- a/src/textual/_compositor.py +++ b/src/textual/_compositor.py @@ -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 diff --git a/src/textual/widget.py b/src/textual/widget.py index 136d300f3..8833a03d4 100644 --- a/src/textual/widget.py +++ b/src/textual/widget.py @@ -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: