diff --git a/src/textual/_compositor.py b/src/textual/_compositor.py index 0432631fc..0f8ebc944 100644 --- a/src/textual/_compositor.py +++ b/src/textual/_compositor.py @@ -519,9 +519,10 @@ class Compositor: """ contains = Region.contains - for widget, cropped_region, region in self.layers_visible[y]: - if contains(cropped_region, x, y) and widget.visible: - return widget, region + if len(self.layers_visible) > y >= 0: + for widget, cropped_region, region in self.layers_visible[y]: + if contains(cropped_region, x, y) and widget.visible: + return widget, region raise errors.NoWidget(f"No widget under screen coordinate ({x}, {y})") def get_widgets_at(self, x: int, y: int) -> Iterable[tuple[Widget, Region]]: diff --git a/src/textual/scroll_view.py b/src/textual/scroll_view.py index 03b02a4c2..416722874 100644 --- a/src/textual/scroll_view.py +++ b/src/textual/scroll_view.py @@ -76,7 +76,7 @@ class ScrollView(Widget): self._size = size virtual_size = self.virtual_size self._scroll_update(virtual_size) - self._container_size = size - self.gutter.totals + self._container_size = size self.scroll_to(self.scroll_x, self.scroll_y, animate=False) self.refresh() diff --git a/src/textual/widget.py b/src/textual/widget.py index b6cfd79b6..8746bba5b 100644 --- a/src/textual/widget.py +++ b/src/textual/widget.py @@ -1680,21 +1680,22 @@ class Widget(DOMNode): return lines def get_style_at(self, x: int, y: int) -> Style: - """Get the Rich style at a given screen offset. + """Get the Rich style in a widget at a given relative offset. Args: - x (int): X coordinate relative to the screen. - y (int): Y coordinate relative to the screen. + x (int): X coordinate relative to the widget. + y (int): Y coordinate relative to the widget. Returns: Style: A rich Style object. """ - widget, region = self.screen.get_widget_at(x, y) + offset = Offset(x, y) + screen_offset = offset + self.region.offset + + widget, _ = self.screen.get_widget_at(*screen_offset) if widget is not self: return Style() - offset_x, offset_y = region.offset - # offset_x, offset_y = self.screen.get_offset(self) - return self.screen.get_style_at(x + offset_x, y + offset_y) + return self.screen.get_style_at(*screen_offset) async def _forward_event(self, event: events.Event) -> None: event._set_forwarded()