Fix combined updates

This commit is contained in:
Will McGugan
2022-05-30 20:36:12 +01:00
parent 8f5ce16870
commit 25e790f48d
3 changed files with 15 additions and 13 deletions

View File

@@ -555,7 +555,7 @@ class Compositor:
]
return segment_lines
def render(self, full: bool = False) -> RenderableType:
def render(self, full: bool = False) -> RenderableType | None:
"""Render a layout.
Returns:
@@ -571,17 +571,19 @@ class Compositor:
self._dirty_regions.clear()
if screen_region in update_regions:
# If one of the updates is the entire screen, then we only need one update
update_regions.clear()
full = True
if update_regions:
if full:
crop = screen_region
spans = []
is_rendered_line = lambda y: True
elif update_regions:
# Create a crop regions that surrounds all updates
crop = Region.from_union(list(update_regions)).intersection(screen_region)
spans = list(self._regions_to_spans(update_regions))
is_rendered_line = {y for y, _, _ in spans}.__contains__
else:
crop = screen_region
spans = []
is_rendered_line = lambda y: True
return None
divide = Segment.divide
@@ -622,7 +624,10 @@ class Compositor:
if chops_line[cut] is None:
chops_line[cut] = segments
if update_regions:
if full:
render_lines = self._assemble_chops(chops)
return LayoutUpdate(render_lines, screen_region)
else:
crop_y, crop_y2 = crop.y_extents
render_lines = self._assemble_chops(chops[crop_y:crop_y2])
render_spans = [
@@ -631,10 +636,6 @@ class Compositor:
]
return SpansUpdate(render_spans, crop_y2)
else:
render_lines = self._assemble_chops(chops)
return LayoutUpdate(render_lines, screen_region)
def __rich_console__(
self, console: Console, options: ConsoleOptions
) -> RenderResult:

View File

@@ -888,12 +888,14 @@ class App(Generic[ReturnType], DOMNode):
stylesheet.update(self.app, animate=animate)
self.refresh(layout=True)
def _display(self, renderable: RenderableType) -> None:
def _display(self, renderable: RenderableType | None) -> None:
"""Display a renderable within a sync.
Args:
renderable (RenderableType): A Rich renderable.
"""
if renderable is None:
return
if self._running and not self._closed and not self.is_headless:
console = self.console
self._begin_update()

View File

@@ -185,7 +185,6 @@ class Screen(Widget):
message.prevent_default()
self._layout_required = True
self.check_idle()
self._refresh_layout()
def _screen_resized(self, size: Size):
"""Called by App when the screen is resized."""