diff --git a/src/textual/app.py b/src/textual/app.py index 207d480cb..79421fa72 100644 --- a/src/textual/app.py +++ b/src/textual/app.py @@ -538,7 +538,7 @@ class App(Generic[ReturnType], DOMNode): DevtoolsLog(output, caller=_textual_calling_frame) ) 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.""" @@ -963,9 +963,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 @@ -1004,7 +1004,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: @@ -1061,7 +1061,7 @@ class App(Generic[ReturnType], DOMNode): css, path=path, is_default_css=True, tie_breaker=tie_breaker ) except Exception as error: - self.on_exception(error) + self._handle_exception(error) self._print_error_renderables() return @@ -1084,7 +1084,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: @@ -1110,7 +1110,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() @@ -1218,7 +1218,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: @@ -1232,7 +1232,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() @@ -1276,7 +1276,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() @@ -1345,16 +1345,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) @@ -1511,7 +1511,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 e7eeb4c18..b65886fae 100644 --- a/src/textual/message_pump.py +++ b/src/textual/message_pump.py @@ -351,7 +351,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() @@ -364,7 +364,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 303c76ea0..7f695d1a6 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 3f0e2f2bb..6e1c61f77 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: @@ -1335,7 +1335,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 e23952b23..5a9c956f7 100644 --- a/tests/utilities/test_app.py +++ b/tests/utilities/test_app.py @@ -169,7 +169,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