From 7d4db0f811d49d9364024a600c77ea42ab34d5d2 Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Sat, 1 Oct 2022 21:09:38 +0100 Subject: [PATCH] optimizations for compositor --- src/textual/_compositor.py | 22 ++++++++++++---------- src/textual/screen.py | 22 +++++++++++----------- 2 files changed, 23 insertions(+), 21 deletions(-) diff --git a/src/textual/_compositor.py b/src/textual/_compositor.py index bc64632a3..b00466f6a 100644 --- a/src/textual/_compositor.py +++ b/src/textual/_compositor.py @@ -482,7 +482,7 @@ class Compositor: @property def layers_visible(self) -> dict[int, list[tuple[Widget, Region, Region]]]: """Visible widgets and regions in layers order.""" - + screen_height = self.size.height if self._layers_visible is None: layers_visible: dict[int, list[tuple[Widget, Region, Region]]] layers_visible = {y: [] for y in range(self.size.height)} @@ -490,28 +490,30 @@ class Compositor: y: layer.append for y, layer in layers_visible.items() } intersection = Region.intersection + _range = range for widget, (region, _, clip, _, _, _) in self.layers: - cropped_region = intersection(region, clip) - _x, region_y, _width, height = cropped_region - widget_location = (widget, cropped_region, region) - for y in range(region_y, region_y + height): - layers_visible_appends[y](widget_location) + _x, y, _width, height = region + if -height <= y < screen_height: + cropped_region = intersection(region, clip) + _x, region_y, _width, region_height = cropped_region + if region_height: + widget_location = (widget, cropped_region, region) + for y in _range(region_y, region_y + region_height): + layers_visible_appends[y](widget_location) self._layers_visible = layers_visible return self._layers_visible - def __iter__(self) -> Iterator[tuple[Widget, Region, Region, Size, Size]]: + def __iter__(self) -> Iterator[tuple[Widget, Region, Size, Size]]: """Iterate map with information regarding each widget and is position Yields: Iterator[tuple[Widget, Region, Region, Size, Size]]: Iterates a tuple of - Widget, clip region, region, virtual size, and container size. + Widget, region, virtual size, and container size. """ layers = self.layers - intersection = Region.intersection for widget, (region, _order, clip, virtual_size, container_size, _) in layers: yield ( widget, - intersection(region, clip), region, virtual_size, container_size, diff --git a/src/textual/screen.py b/src/textual/screen.py index 8db9b91d7..bf96c5082 100644 --- a/src/textual/screen.py +++ b/src/textual/screen.py @@ -216,22 +216,22 @@ class Screen(Widget): # We want to send a resize event to widgets that were just added or change since last layout send_resize = shown | resized + ResizeEvent = events.Resize - for ( - widget, - _region, - unclipped_region, + _size_updated = Widget._size_updated + layers = self._compositor.layers + for widget, ( + region, + _order, + _clip, virtual_size, container_size, - ) in self._compositor: - widget._size_updated( - unclipped_region.size, virtual_size, container_size - ) + _, + ) in layers: + _size_updated(widget, region.size, virtual_size, container_size) if widget in send_resize: widget.post_message_no_wait( - events.Resize( - self, unclipped_region.size, virtual_size, container_size - ) + ResizeEvent(self, region.size, virtual_size, container_size) ) except Exception as error: