mirror of
https://github.com/Textualize/textual.git
synced 2025-10-17 02:38:12 +03:00
Fix combined updates
This commit is contained in:
@@ -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:
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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."""
|
||||
|
||||
Reference in New Issue
Block a user