43 lines
1.5 KiB
Python
43 lines
1.5 KiB
Python
from typing import Iterable, cast
|
|
|
|
from rich.segment import Segment
|
|
from rich.style import Style
|
|
|
|
from textual.color import Color
|
|
|
|
|
|
def _apply_opacity(
|
|
segments: Iterable[Segment],
|
|
base_background: Color,
|
|
opacity: float,
|
|
) -> Iterable[Segment]:
|
|
"""Takes an iterable of foreground Segments and blends them into the supplied
|
|
background color, yielding copies of the Segments with blended foreground and
|
|
background colors applied.
|
|
|
|
Args:
|
|
segments: The segments in the foreground.
|
|
base_background: The background color to blend foreground into.
|
|
opacity: The blending factor. A value of 1.0 means output segments will
|
|
have identical foreground and background colors to input segments.
|
|
"""
|
|
_Segment = Segment
|
|
from_rich_color = Color.from_rich_color
|
|
from_color = Style.from_color
|
|
blend = base_background.blend
|
|
styled_segments = cast("Iterable[tuple[str, Style, object]]", segments)
|
|
for text, style, _ in styled_segments:
|
|
blended_style = style
|
|
|
|
if style.color is not None:
|
|
color = from_rich_color(style.color)
|
|
blended_foreground = blend(color, opacity)
|
|
blended_style += from_color(color=blended_foreground.rich_color)
|
|
|
|
if style.bgcolor is not None:
|
|
bgcolor = from_rich_color(style.bgcolor)
|
|
blended_background = blend(bgcolor, opacity)
|
|
blended_style += from_color(bgcolor=blended_background.rich_color)
|
|
|
|
yield _Segment(text, blended_style)
|