ai-station/.venv/lib/python3.12/site-packages/textual/renderables/styled.py

51 lines
1.9 KiB
Python
Raw Normal View History

2025-12-25 14:54:33 +00:00
from typing import TYPE_CHECKING
from rich.measure import Measurement
from rich.segment import Segment
if TYPE_CHECKING:
from rich.console import Console, ConsoleOptions, RenderableType, RenderResult
from rich.style import StyleType
class Styled:
"""A renderable which allows you to apply a style before and after another renderable.
This can be used to layer styles on top of each other, like a style sandwich. This is used,
for example, in the DataTable to layer default CSS styles + user renderables (e.g. Text objects
stored in the cells of the table) + CSS component styles on top of each other."""
def __init__(
self,
renderable: "RenderableType",
pre_style: "StyleType",
post_style: "StyleType",
) -> None:
"""Construct a Styled.
Args:
renderable (RenderableType): Any renderable.
pre_style (StyleType): A style to apply across the entire renderable.
Will be applied before the styles from the renderable itself.
post_style (StyleType): A style to apply across the entire renderable.
Will be applied after the styles from the renderable itself.
"""
self.renderable = renderable
self.pre_style = pre_style
self.post_style = post_style
def __rich_console__(
self, console: "Console", options: "ConsoleOptions"
) -> "RenderResult":
pre_style = console.get_style(self.pre_style)
post_style = console.get_style(self.post_style)
rendered_segments = console.render(self.renderable, options)
segments = Segment.apply_style(
rendered_segments, style=pre_style, post_style=post_style
)
return segments
def __rich_measure__(
self, console: "Console", options: "ConsoleOptions"
) -> Measurement:
return Measurement.get(console, options, self.renderable)