mirror of
https://github.com/Textualize/textual.git
synced 2025-10-17 02:38:12 +03:00
Merge pull request #2325 from davep/private-event-handlers
Make textual.widgets.* event handlers private
This commit is contained in:
@@ -5,6 +5,7 @@ from __future__ import annotations
|
||||
from typing import Optional
|
||||
|
||||
from ..containers import Container
|
||||
from ..events import Mount
|
||||
from ..reactive import reactive
|
||||
from ..widget import Widget
|
||||
|
||||
@@ -58,7 +59,7 @@ class ContentSwitcher(Container):
|
||||
)
|
||||
self._initial = initial
|
||||
|
||||
def on_mount(self) -> None:
|
||||
def _on_mount(self, _: Mount) -> None:
|
||||
"""Perform the initial setup of the widget once the DOM is ready."""
|
||||
initial = self._initial
|
||||
with self.app.batch_update():
|
||||
|
||||
@@ -887,11 +887,11 @@ class DataTable(ScrollView, Generic[CellType], can_focus=True):
|
||||
return self.header_height
|
||||
return self.rows[row_key].height
|
||||
|
||||
async def on_styles_updated(self) -> None:
|
||||
async def _on_styles_updated(self) -> None:
|
||||
self._clear_caches()
|
||||
self.refresh()
|
||||
|
||||
def on_resize(self, event: events.Resize) -> None:
|
||||
def _on_resize(self, _: events.Resize) -> None:
|
||||
self._update_count += 1
|
||||
|
||||
def watch_show_cursor(self, show_cursor: bool) -> None:
|
||||
@@ -1364,7 +1364,7 @@ class DataTable(ScrollView, Generic[CellType], can_focus=True):
|
||||
self._update_count += 1
|
||||
self.refresh(layout=True)
|
||||
|
||||
def on_idle(self) -> None:
|
||||
async def _on_idle(self, _: events.Idle) -> None:
|
||||
"""Runs when the message pump is empty.
|
||||
|
||||
We use this for some expensive calculations like re-computing dimensions of the
|
||||
@@ -1904,7 +1904,7 @@ class DataTable(ScrollView, Generic[CellType], can_focus=True):
|
||||
|
||||
return self._render_line(y, scroll_x, scroll_x + width, self.rich_style)
|
||||
|
||||
def on_mouse_move(self, event: events.MouseMove):
|
||||
def _on_mouse_move(self, event: events.MouseMove):
|
||||
"""If the hover cursor is visible, display it by extracting the row
|
||||
and column metadata from the segments present in the cells."""
|
||||
self._set_hover_cursor(True)
|
||||
@@ -1916,7 +1916,7 @@ class DataTable(ScrollView, Generic[CellType], can_focus=True):
|
||||
except KeyError:
|
||||
pass
|
||||
|
||||
def on_leave(self, event: events.Leave) -> None:
|
||||
def _on_leave(self, _: events.Leave) -> None:
|
||||
self._set_hover_cursor(False)
|
||||
|
||||
def _get_fixed_offset(self) -> Spacing:
|
||||
@@ -2001,7 +2001,7 @@ class DataTable(ScrollView, Generic[CellType], can_focus=True):
|
||||
elif cursor_type == "cell":
|
||||
self.refresh_coordinate(self.hover_coordinate)
|
||||
|
||||
def on_click(self, event: events.Click) -> None:
|
||||
async def _on_click(self, event: events.Click) -> None:
|
||||
self._set_hover_cursor(True)
|
||||
meta = event.style.meta
|
||||
if not meta:
|
||||
|
||||
@@ -8,6 +8,7 @@ from typing import ClassVar, Iterable
|
||||
from rich.style import Style
|
||||
from rich.text import Text, TextType
|
||||
|
||||
from ..events import Mount
|
||||
from ..message import Message
|
||||
from ._tree import TOGGLE_STYLE, Tree, TreeNode
|
||||
|
||||
@@ -180,10 +181,10 @@ class DirectoryTree(Tree[DirEntry]):
|
||||
)
|
||||
node.expand()
|
||||
|
||||
def on_mount(self) -> None:
|
||||
def _on_mount(self, _: Mount) -> None:
|
||||
self.load_directory(self.root)
|
||||
|
||||
def on_tree_node_expanded(self, event: Tree.NodeSelected) -> None:
|
||||
def _on_tree_node_expanded(self, event: Tree.NodeSelected) -> None:
|
||||
event.stop()
|
||||
dir_entry = event.node.data
|
||||
if dir_entry is None:
|
||||
@@ -194,7 +195,7 @@ class DirectoryTree(Tree[DirEntry]):
|
||||
else:
|
||||
self.post_message(self.FileSelected(dir_entry.path))
|
||||
|
||||
def on_tree_node_selected(self, event: Tree.NodeSelected) -> None:
|
||||
def _on_tree_node_selected(self, event: Tree.NodeSelected) -> None:
|
||||
event.stop()
|
||||
dir_entry = event.node.data
|
||||
if dir_entry is None:
|
||||
|
||||
@@ -7,6 +7,7 @@ from datetime import datetime
|
||||
from rich.text import Text
|
||||
|
||||
from ..app import RenderResult
|
||||
from ..events import Mount
|
||||
from ..reactive import Reactive
|
||||
from ..widget import Widget
|
||||
|
||||
@@ -67,7 +68,7 @@ class HeaderClock(HeaderClockSpace):
|
||||
}
|
||||
"""
|
||||
|
||||
def on_mount(self) -> None:
|
||||
def _on_mount(self, _: Mount) -> None:
|
||||
self.set_interval(1, callback=self.refresh, name=f"update header clock")
|
||||
|
||||
def render(self) -> RenderResult:
|
||||
@@ -156,10 +157,10 @@ class Header(Widget):
|
||||
def watch_tall(self, tall: bool) -> None:
|
||||
self.set_class(tall, "-tall")
|
||||
|
||||
def on_click(self):
|
||||
def _on_click(self):
|
||||
self.toggle_class("-tall")
|
||||
|
||||
def on_mount(self) -> None:
|
||||
def _on_mount(self, _: Mount) -> None:
|
||||
def set_title(title: str) -> None:
|
||||
self.query_one(HeaderTitle).text = title
|
||||
|
||||
|
||||
@@ -12,6 +12,7 @@ from rich.text import Text
|
||||
from .. import events
|
||||
from .._segment_tools import line_crop
|
||||
from ..binding import Binding, BindingType
|
||||
from ..events import Blur, Focus, Mount
|
||||
from ..geometry import Size
|
||||
from ..message import Message
|
||||
from ..reactive import reactive
|
||||
@@ -299,22 +300,22 @@ class Input(Widget, can_focus=True):
|
||||
"""Toggle visibility of cursor."""
|
||||
self._cursor_visible = not self._cursor_visible
|
||||
|
||||
def on_mount(self) -> None:
|
||||
def _on_mount(self, _: Mount) -> None:
|
||||
self.blink_timer = self.set_interval(
|
||||
0.5,
|
||||
self._toggle_cursor,
|
||||
pause=not (self.cursor_blink and self.has_focus),
|
||||
)
|
||||
|
||||
def on_blur(self) -> None:
|
||||
def _on_blur(self, _: Blur) -> None:
|
||||
self.blink_timer.pause()
|
||||
|
||||
def on_focus(self) -> None:
|
||||
def _on_focus(self, _: Focus) -> None:
|
||||
self.cursor_position = len(self.value)
|
||||
if self.cursor_blink:
|
||||
self.blink_timer.resume()
|
||||
|
||||
async def on_key(self, event: events.Key) -> None:
|
||||
async def _on_key(self, event: events.Key) -> None:
|
||||
self._cursor_visible = True
|
||||
if self.cursor_blink:
|
||||
self.blink_timer.reset()
|
||||
@@ -330,12 +331,12 @@ class Input(Widget, can_focus=True):
|
||||
self.insert_text_at_cursor(event.character)
|
||||
event.prevent_default()
|
||||
|
||||
def on_paste(self, event: events.Paste) -> None:
|
||||
def _on_paste(self, event: events.Paste) -> None:
|
||||
line = event.text.splitlines()[0]
|
||||
self.insert_text_at_cursor(line)
|
||||
event.stop()
|
||||
|
||||
def on_click(self, event: events.Click) -> None:
|
||||
async def _on_click(self, event: events.Click) -> None:
|
||||
offset = event.get_content_offset(self)
|
||||
if offset is None:
|
||||
return
|
||||
|
||||
@@ -47,7 +47,7 @@ class ListItem(Widget, can_focus=False):
|
||||
self.item = item
|
||||
super().__init__()
|
||||
|
||||
def on_click(self, event: events.Click) -> None:
|
||||
async def _on_click(self, _: events.Click) -> None:
|
||||
self.post_message(self._ChildClicked(self))
|
||||
|
||||
def watch_highlighted(self, value: bool) -> None:
|
||||
|
||||
@@ -5,6 +5,7 @@ from typing import ClassVar, Optional
|
||||
from textual.await_remove import AwaitRemove
|
||||
from textual.binding import Binding, BindingType
|
||||
from textual.containers import VerticalScroll
|
||||
from textual.events import Mount
|
||||
from textual.geometry import clamp
|
||||
from textual.message import Message
|
||||
from textual.reactive import reactive
|
||||
@@ -93,7 +94,7 @@ class ListView(VerticalScroll, can_focus=True, can_focus_children=False):
|
||||
)
|
||||
self._index = initial_index
|
||||
|
||||
def on_mount(self) -> None:
|
||||
def _on_mount(self, _: Mount) -> None:
|
||||
"""Ensure the ListView is fully-settled after mounting."""
|
||||
self.index = self._index
|
||||
|
||||
@@ -196,7 +197,7 @@ class ListView(VerticalScroll, can_focus=True, can_focus_children=False):
|
||||
return
|
||||
self.index -= 1
|
||||
|
||||
def on_list_item__child_clicked(self, event: ListItem._ChildClicked) -> None:
|
||||
def _on_list_item__child_clicked(self, event: ListItem._ChildClicked) -> None:
|
||||
self.focus()
|
||||
self.index = self._nodes.index(event.item)
|
||||
self.post_message(self.Selected(self, event.item))
|
||||
|
||||
@@ -7,6 +7,7 @@ from rich.style import Style
|
||||
from rich.text import Text
|
||||
|
||||
from ..color import Gradient
|
||||
from ..events import Mount
|
||||
from ..widget import Widget
|
||||
|
||||
|
||||
@@ -22,7 +23,7 @@ class LoadingIndicator(Widget):
|
||||
}
|
||||
"""
|
||||
|
||||
def on_mount(self) -> None:
|
||||
def _on_mount(self, _: Mount) -> None:
|
||||
self._start_time = time()
|
||||
self.auto_refresh = 1 / 16
|
||||
|
||||
|
||||
@@ -13,6 +13,7 @@ from typing_extensions import TypeAlias
|
||||
|
||||
from ..app import ComposeResult
|
||||
from ..containers import Horizontal, VerticalScroll
|
||||
from ..events import Mount
|
||||
from ..message import Message
|
||||
from ..reactive import reactive, var
|
||||
from ..widget import Widget
|
||||
@@ -587,7 +588,7 @@ class Markdown(Widget):
|
||||
self.href: str = href
|
||||
"""The link that was selected."""
|
||||
|
||||
def on_mount(self) -> None:
|
||||
def _on_mount(self, _: Mount) -> None:
|
||||
if self._markdown is not None:
|
||||
self.update(self._markdown)
|
||||
|
||||
@@ -801,7 +802,7 @@ class MarkdownTableOfContents(Widget, can_focus_children=True):
|
||||
node = node.add(NUMERALS[level], expand=True)
|
||||
node.add_leaf(f"[dim]{NUMERALS[level]}[/] {name}", {"block_id": block_id})
|
||||
|
||||
async def on_tree_node_selected(self, message: Tree.NodeSelected) -> None:
|
||||
async def _on_tree_node_selected(self, message: Tree.NodeSelected) -> None:
|
||||
node_data = message.node.data
|
||||
if node_data is not None:
|
||||
await self._post_message(
|
||||
@@ -872,7 +873,7 @@ class MarkdownViewer(VerticalScroll, can_focus=True, can_focus_children=True):
|
||||
"""The table of contents widget"""
|
||||
return self.query_one(MarkdownTableOfContents)
|
||||
|
||||
async def on_mount(self) -> None:
|
||||
def _on_mount(self, _: Mount) -> None:
|
||||
if self._markdown is not None:
|
||||
self.document.update(self._markdown)
|
||||
|
||||
@@ -890,7 +891,7 @@ class MarkdownViewer(VerticalScroll, can_focus=True, can_focus_children=True):
|
||||
if self.navigator.forward():
|
||||
await self.document.load(self.navigator.location)
|
||||
|
||||
async def on_markdown_link_clicked(self, message: Markdown.LinkClicked) -> None:
|
||||
async def _on_markdown_link_clicked(self, message: Markdown.LinkClicked) -> None:
|
||||
message.stop()
|
||||
await self.go(message.href)
|
||||
|
||||
@@ -901,7 +902,7 @@ class MarkdownViewer(VerticalScroll, can_focus=True, can_focus_children=True):
|
||||
yield MarkdownTableOfContents()
|
||||
yield Markdown(parser_factory=self._parser_factory)
|
||||
|
||||
def on_markdown_table_of_contents_updated(
|
||||
def _on_markdown_table_of_contents_updated(
|
||||
self, message: Markdown.TableOfContentsUpdated
|
||||
) -> None:
|
||||
self.query_one(
|
||||
@@ -909,7 +910,7 @@ class MarkdownViewer(VerticalScroll, can_focus=True, can_focus_children=True):
|
||||
).table_of_contents = message.table_of_contents
|
||||
message.stop()
|
||||
|
||||
def on_markdown_table_of_contents_selected(
|
||||
def _on_markdown_table_of_contents_selected(
|
||||
self, message: Markdown.TableOfContentsSelected
|
||||
) -> None:
|
||||
block_selector = f"#{message.block_id}"
|
||||
|
||||
@@ -16,7 +16,7 @@ from rich.style import Style
|
||||
from typing_extensions import Literal, Self, TypeAlias
|
||||
|
||||
from ..binding import Binding, BindingType
|
||||
from ..events import Click, MouseMove
|
||||
from ..events import Click, Idle, Leave, MouseMove
|
||||
from ..geometry import Region, Size
|
||||
from ..message import Message
|
||||
from ..reactive import reactive
|
||||
@@ -363,7 +363,7 @@ class OptionList(ScrollView, can_focus=True):
|
||||
self._needs_to_scroll_to_highlight = rescroll_to_highlight
|
||||
self.check_idle()
|
||||
|
||||
def on_idle(self) -> None:
|
||||
async def _on_idle(self, _: Idle) -> None:
|
||||
"""Perform content tracking data refresh when idle."""
|
||||
self._refresh_content_tracking()
|
||||
if self._needs_to_scroll_to_highlight:
|
||||
@@ -380,11 +380,11 @@ class OptionList(ScrollView, can_focus=True):
|
||||
"""
|
||||
self._request_content_tracking_refresh()
|
||||
|
||||
def on_resize(self) -> None:
|
||||
def _on_resize(self) -> None:
|
||||
"""Refresh the layout of the renderables in the list when resized."""
|
||||
self._request_content_tracking_refresh(rescroll_to_highlight=True)
|
||||
|
||||
def on_mouse_move(self, event: MouseMove) -> None:
|
||||
def _on_mouse_move(self, event: MouseMove) -> None:
|
||||
"""React to the mouse moving.
|
||||
|
||||
Args:
|
||||
@@ -392,11 +392,11 @@ class OptionList(ScrollView, can_focus=True):
|
||||
"""
|
||||
self._mouse_hovering_over = event.style.meta.get("option")
|
||||
|
||||
def on_leave(self) -> None:
|
||||
def _on_leave(self, _: Leave) -> None:
|
||||
"""React to the mouse leaving the widget."""
|
||||
self._mouse_hovering_over = None
|
||||
|
||||
def on_click(self, event: Click) -> None:
|
||||
async def _on_click(self, event: Click) -> None:
|
||||
"""React to the mouse being clicked on an item.
|
||||
|
||||
Args:
|
||||
|
||||
@@ -156,11 +156,11 @@ class Placeholder(Widget):
|
||||
)
|
||||
return variant
|
||||
|
||||
def on_click(self) -> None:
|
||||
async def _on_click(self, _: events.Click) -> None:
|
||||
"""Click handler to cycle through the placeholder variants."""
|
||||
self.cycle_variant()
|
||||
|
||||
def on_resize(self, event: events.Resize) -> None:
|
||||
def _on_resize(self, event: events.Resize) -> None:
|
||||
"""Update the placeholder "size" variant with the new placeholder size."""
|
||||
self._renderables["size"] = self._SIZE_RENDER_TEMPLATE.format(*event.size)
|
||||
if self.variant == "size":
|
||||
|
||||
@@ -5,6 +5,7 @@ from __future__ import annotations
|
||||
import rich.repr
|
||||
|
||||
from ..containers import Container
|
||||
from ..events import Mount
|
||||
from ..message import Message
|
||||
from ._radio_button import RadioButton
|
||||
|
||||
@@ -91,7 +92,7 @@ class RadioSet(Container):
|
||||
disabled=disabled,
|
||||
)
|
||||
|
||||
def on_mount(self) -> None:
|
||||
def _on_mount(self, _: Mount) -> None:
|
||||
"""Perform some processing once mounted in the DOM."""
|
||||
|
||||
# It's possible for the user to pass in a collection of radio
|
||||
@@ -108,7 +109,7 @@ class RadioSet(Container):
|
||||
if switched_on:
|
||||
self._pressed_button = switched_on[0]
|
||||
|
||||
def on_radio_button_changed(self, event: RadioButton.Changed) -> None:
|
||||
def _on_radio_button_changed(self, event: RadioButton.Changed) -> None:
|
||||
"""Respond to the value of a button in the set being changed.
|
||||
|
||||
Args:
|
||||
|
||||
@@ -5,6 +5,7 @@ from typing import TYPE_CHECKING, ClassVar
|
||||
from rich.console import RenderableType
|
||||
|
||||
from ..binding import Binding, BindingType
|
||||
from ..events import Click
|
||||
from ..geometry import Size
|
||||
from ..message import Message
|
||||
from ..reactive import reactive
|
||||
@@ -153,7 +154,7 @@ class Switch(Widget, can_focus=True):
|
||||
def get_content_height(self, container: Size, viewport: Size, width: int) -> int:
|
||||
return 1
|
||||
|
||||
def on_click(self) -> None:
|
||||
async def _on_click(self, _: Click) -> None:
|
||||
"""Toggle the state of the switch."""
|
||||
self.toggle()
|
||||
|
||||
|
||||
@@ -11,6 +11,7 @@ from ..app import ComposeResult, RenderResult
|
||||
from ..binding import Binding, BindingType
|
||||
from ..containers import Container, Horizontal, Vertical
|
||||
from ..css.query import NoMatches
|
||||
from ..events import Mount
|
||||
from ..geometry import Offset
|
||||
from ..message import Message
|
||||
from ..reactive import reactive
|
||||
@@ -73,7 +74,7 @@ class Underline(Widget):
|
||||
background_style=Style.from_color(bar_style.bgcolor),
|
||||
)
|
||||
|
||||
def on_click(self, event: events.Click):
|
||||
def _on_click(self, event: events.Click):
|
||||
"""Catch clicks, so that the underline can activate the tabs."""
|
||||
event.stop()
|
||||
self.post_message(self.Clicked(event.screen_offset))
|
||||
@@ -379,7 +380,7 @@ class Tabs(Widget, can_focus=True):
|
||||
except NoMatches:
|
||||
return None
|
||||
|
||||
def on_mount(self) -> None:
|
||||
def _on_mount(self, _: Mount) -> None:
|
||||
"""Make the first tab active."""
|
||||
if self._first_active is not None:
|
||||
self.active = self._first_active
|
||||
|
||||
@@ -12,6 +12,7 @@ from rich.text import Text, TextType
|
||||
|
||||
from ..app import RenderResult
|
||||
from ..binding import Binding, BindingType
|
||||
from ..events import Click
|
||||
from ..geometry import Size
|
||||
from ..message import Message
|
||||
from ..reactive import reactive
|
||||
@@ -220,7 +221,7 @@ class ToggleButton(Static, can_focus=True):
|
||||
"""
|
||||
self.toggle()
|
||||
|
||||
def on_click(self) -> None:
|
||||
async def _on_click(self, _: Click) -> None:
|
||||
"""Toggle the value of the widget when clicked with the mouse."""
|
||||
self.toggle()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user