ai-station/.venv/lib/python3.12/site-packages/textual/widgets/_link.py

71 lines
1.9 KiB
Python

from __future__ import annotations
from textual.binding import Binding
from textual.reactive import reactive
from textual.widgets import Static
class Link(Static, can_focus=True):
"""A simple, clickable link that opens a URL."""
DEFAULT_CSS = """
Link {
width: auto;
height: auto;
min-height: 1;
color: $text-accent;
text-style: underline;
&:hover { color: $accent; }
&:focus { text-style: bold reverse; }
}
"""
BINDINGS = [Binding("enter", "open_link", "Open link")]
"""
| Key(s) | Description |
| :- | :- |
| enter | Open the link in the browser. |
"""
text: reactive[str] = reactive("", layout=True)
url: reactive[str] = reactive("")
def __init__(
self,
text: str,
*,
url: str | None = None,
tooltip: str | None = None,
name: str | None = None,
id: str | None = None,
classes: str | None = None,
disabled: bool = False,
) -> None:
"""A link widget.
Args:
text: Text of the link.
url: A URL to open, when clicked. If `None`, the `text` parameter will also be used as the url.
tooltip: Optional tooltip.
name: Name of widget.
id: ID of Widget.
classes: Space separated list of class names.
disabled: Whether the static is disabled or not.
"""
super().__init__(
text, name=name, id=id, classes=classes, disabled=disabled, markup=False
)
self.set_reactive(Link.text, text)
self.set_reactive(Link.url, text if url is None else url)
self.tooltip = tooltip
def watch_text(self, text: str) -> None:
self.update(text)
def on_click(self) -> None:
self.action_open_link()
def action_open_link(self) -> None:
if self.url:
self.app.open_url(self.url)