diff --git a/src/textual/app.py b/src/textual/app.py index 21c1f479f..b0695f530 100644 --- a/src/textual/app.py +++ b/src/textual/app.py @@ -540,7 +540,7 @@ class App(Generic[ReturnType], DOMNode): severity, ) except Exception as error: - self.on_exception(error) + self._handle_exception(error) def action_screenshot(self, path: str | None = None) -> None: """Action to save a screenshot.""" @@ -964,9 +964,9 @@ class App(Generic[ReturnType], DOMNode): if self.mouse_over != widget: try: if self.mouse_over is not None: - await self.mouse_over.forward_event(events.Leave(self)) + await self.mouse_over._forward_event(events.Leave(self)) if widget is not None: - await widget.forward_event(events.Enter(self)) + await widget._forward_event(events.Enter(self)) finally: self.mouse_over = widget @@ -1005,7 +1005,7 @@ class App(Generic[ReturnType], DOMNode): self._exit_renderables.extend(pre_rendered) self._close_messages_no_wait() - def on_exception(self, error: Exception) -> None: + def _handle_exception(self, error: Exception) -> None: """Called with an unhandled exception. Args: @@ -1071,7 +1071,7 @@ class App(Generic[ReturnType], DOMNode): self.CSS, path=app_css_path, is_default_css=False ) except Exception as error: - self.on_exception(error) + self._handle_exception(error) self._print_error_renderables() return @@ -1094,7 +1094,7 @@ class App(Generic[ReturnType], DOMNode): await ready_callback() await process_messages() await self.animator.stop() - await self.close_all() + await self._close_all() self._running = True try: @@ -1120,7 +1120,7 @@ class App(Generic[ReturnType], DOMNode): finally: driver.stop_application_mode() except Exception as error: - self.on_exception(error) + self._handle_exception(error) finally: self._running = False self._print_error_renderables() @@ -1221,7 +1221,7 @@ class App(Generic[ReturnType], DOMNode): async def _disconnect_devtools(self): await self.devtools.disconnect() - def start_widget(self, parent: Widget, widget: Widget) -> None: + def _start_widget(self, parent: Widget, widget: Widget) -> None: """Start a widget (run it's task) so that it can receive messages. Args: @@ -1235,7 +1235,7 @@ class App(Generic[ReturnType], DOMNode): def is_mounted(self, widget: Widget) -> bool: return widget in self._registry - async def close_all(self) -> None: + async def _close_all(self) -> None: while self._registry: child = self._registry.pop() await child._close_messages() @@ -1279,7 +1279,7 @@ class App(Generic[ReturnType], DOMNode): try: console.print(renderable) except Exception as error: - self.on_exception(error) + self._handle_exception(error) finally: self._end_update() console.file.flush() @@ -1348,16 +1348,16 @@ class App(Generic[ReturnType], DOMNode): if isinstance(event, events.Key) and self.focused is not None: # Key events are sent direct to focused widget if self.bindings.allow_forward(event.key): - await self.focused.forward_event(event) + await self.focused._forward_event(event) else: # Key has allow_forward=False which disallows forward to focused widget await super().on_event(event) else: # Forward the event to the view - await self.screen.forward_event(event) + await self.screen._forward_event(event) elif isinstance(event, events.Paste): if self.focused is not None: - await self.focused.forward_event(event) + await self.focused._forward_event(event) else: await super().on_event(event) @@ -1514,7 +1514,7 @@ class App(Generic[ReturnType], DOMNode): async def action_toggle_class(self, selector: str, class_name: str) -> None: self.screen.query(selector).toggle_class(class_name) - def on_terminal_supports_synchronized_output( + def _on_terminal_supports_synchronized_output( self, message: messages.TerminalSupportsSynchronizedOutput ) -> None: log("[b green]SynchronizedOutput mode is supported") diff --git a/src/textual/message_pump.py b/src/textual/message_pump.py index 7830ba168..b814e1a7d 100644 --- a/src/textual/message_pump.py +++ b/src/textual/message_pump.py @@ -327,7 +327,7 @@ class MessagePump(metaclass=MessagePumpMeta): except CancelledError: raise except Exception as error: - self.app.on_exception(error) + self.app._handle_exception(error) break finally: self._message_queue.task_done() @@ -340,7 +340,7 @@ class MessagePump(metaclass=MessagePumpMeta): try: await invoke(method, event) except Exception as error: - self.app.on_exception(error) + self.app._handle_exception(error) break log("CLOSED", self) diff --git a/src/textual/screen.py b/src/textual/screen.py index afeffdc46..6280f1d1b 100644 --- a/src/textual/screen.py +++ b/src/textual/screen.py @@ -218,7 +218,7 @@ class Screen(Widget): ) ) except Exception as error: - self.app.on_exception(error) + self.app._handle_exception(error) return display_update = self._compositor.render(full=full) if display_update is not None: @@ -277,9 +277,9 @@ class Screen(Widget): style=event.style, ) mouse_event.set_forwarded() - await widget.forward_event(mouse_event) + await widget._forward_event(mouse_event) - async def forward_event(self, event: events.Event) -> None: + async def _forward_event(self, event: events.Event) -> None: if event.is_forwarded: return event.set_forwarded() @@ -307,7 +307,7 @@ class Screen(Widget): event.set_forwarded() await self.post_message(event) else: - await widget.forward_event(event.offset(-region.x, -region.y)) + await widget._forward_event(event.offset(-region.x, -region.y)) elif isinstance(event, (events.MouseScrollDown, events.MouseScrollUp)): try: @@ -319,6 +319,6 @@ class Screen(Widget): if scroll_widget is self: await self.post_message(event) else: - await scroll_widget.forward_event(event) + await scroll_widget._forward_event(event) else: await self.post_message(event) diff --git a/src/textual/timer.py b/src/textual/timer.py index 824c9b356..32edb3886 100644 --- a/src/textual/timer.py +++ b/src/textual/timer.py @@ -158,7 +158,7 @@ class Timer: await invoke(self._callback) except Exception as error: app = active_app.get() - app.on_exception(error) + app._handle_exception(error) else: event = events.Timer( self.sender, diff --git a/src/textual/widget.py b/src/textual/widget.py index 2555a8584..a42f5c833 100644 --- a/src/textual/widget.py +++ b/src/textual/widget.py @@ -430,7 +430,7 @@ class Widget(DOMNode): if self._scrollbar_corner is not None: return self._scrollbar_corner self._scrollbar_corner = ScrollBarCorner() - self.app.start_widget(self, self._scrollbar_corner) + self.app._start_widget(self, self._scrollbar_corner) return self._scrollbar_corner @property @@ -447,7 +447,7 @@ class Widget(DOMNode): self._vertical_scrollbar = scroll_bar = ScrollBar( vertical=True, name="vertical", thickness=self.scrollbar_size_vertical ) - self.app.start_widget(self, scroll_bar) + self.app._start_widget(self, scroll_bar) return scroll_bar @property @@ -465,7 +465,7 @@ class Widget(DOMNode): vertical=False, name="horizontal", thickness=self.scrollbar_size_horizontal ) - self.app.start_widget(self, scroll_bar) + self.app._start_widget(self, scroll_bar) return scroll_bar def _refresh_scrollbars(self) -> None: @@ -1338,7 +1338,7 @@ class Widget(DOMNode): offset_x, offset_y = self.screen.get_offset(self) return self.screen.get_style_at(x + offset_x, y + offset_y) - async def forward_event(self, event: events.Event) -> None: + async def _forward_event(self, event: events.Event) -> None: event.set_forwarded() await self.post_message(event) diff --git a/tests/utilities/test_app.py b/tests/utilities/test_app.py index 64eb637cb..946fc8ddb 100644 --- a/tests/utilities/test_app.py +++ b/tests/utilities/test_app.py @@ -160,7 +160,7 @@ class AppTest(App): await let_asyncio_process_some_events() - def on_exception(self, error: Exception) -> None: + def _handle_exception(self, error: Exception) -> None: # In tests we want the errors to be raised, rather than printed to a Console raise error