Module textual.renderables.tint

Expand source code
from __future__ import annotations

from typing import Iterable

from rich.console import ConsoleOptions, Console, RenderResult, RenderableType
from rich.segment import Segment
from rich.style import Style

from ..color import Color


class Tint:
    """Applies a color on top of an existing renderable."""

    def __init__(self, renderable: RenderableType, color: Color) -> None:
        """Wrap a renderable to apply a tint color.

        Args:
            renderable (RenderableType): A renderable.
            color (Color): A color (presumably with alpha).
        """
        self.renderable = renderable
        self.color = color

    @classmethod
    def process_segments(
        cls, segments: Iterable[Segment], color: Color
    ) -> Iterable[Segment]:
        """Apply tint to segments.

        Args:
            segments (Iterable[Segment]): Incoming segments.
            color (Color): Color of tint.

        Returns:
            Iterable[Segment]: Segments with applied tint.

        """
        from_rich_color = Color.from_rich_color
        style_from_color = Style.from_color
        _Segment = Segment

        NULL_STYLE = Style()
        for segment in segments:
            text, style, control = segment
            if control:
                yield segment
            else:
                style = style or NULL_STYLE
                yield _Segment(
                    text,
                    (
                        style
                        + style_from_color(
                            (
                                (from_rich_color(style.color) + color).rich_color
                                if style.color is not None
                                else None
                            ),
                            (
                                (from_rich_color(style.bgcolor) + color).rich_color
                                if style.bgcolor is not None
                                else None
                            ),
                        )
                    ),
                    control,
                )

    def __rich_console__(
        self, console: Console, options: ConsoleOptions
    ) -> RenderResult:
        segments = console.render(self.renderable, options)
        color = self.color
        return self.process_segments(segments, color)

Classes

class Tint (renderable: RenderableType, color: Color)

Applies a color on top of an existing renderable.

Wrap a renderable to apply a tint color.

Args

renderable : RenderableType
A renderable.
color : Color
A color (presumably with alpha).
Expand source code
class Tint:
    """Applies a color on top of an existing renderable."""

    def __init__(self, renderable: RenderableType, color: Color) -> None:
        """Wrap a renderable to apply a tint color.

        Args:
            renderable (RenderableType): A renderable.
            color (Color): A color (presumably with alpha).
        """
        self.renderable = renderable
        self.color = color

    @classmethod
    def process_segments(
        cls, segments: Iterable[Segment], color: Color
    ) -> Iterable[Segment]:
        """Apply tint to segments.

        Args:
            segments (Iterable[Segment]): Incoming segments.
            color (Color): Color of tint.

        Returns:
            Iterable[Segment]: Segments with applied tint.

        """
        from_rich_color = Color.from_rich_color
        style_from_color = Style.from_color
        _Segment = Segment

        NULL_STYLE = Style()
        for segment in segments:
            text, style, control = segment
            if control:
                yield segment
            else:
                style = style or NULL_STYLE
                yield _Segment(
                    text,
                    (
                        style
                        + style_from_color(
                            (
                                (from_rich_color(style.color) + color).rich_color
                                if style.color is not None
                                else None
                            ),
                            (
                                (from_rich_color(style.bgcolor) + color).rich_color
                                if style.bgcolor is not None
                                else None
                            ),
                        )
                    ),
                    control,
                )

    def __rich_console__(
        self, console: Console, options: ConsoleOptions
    ) -> RenderResult:
        segments = console.render(self.renderable, options)
        color = self.color
        return self.process_segments(segments, color)

Static methods

def process_segments(segments: Iterable[Segment], color: Color) ‑> Iterable[rich.segment.Segment]

Apply tint to segments.

Args

segments : Iterable[Segment]
Incoming segments.
color : Color
Color of tint.

Returns

Iterable[Segment]
Segments with applied tint.
Expand source code
@classmethod
def process_segments(
    cls, segments: Iterable[Segment], color: Color
) -> Iterable[Segment]:
    """Apply tint to segments.

    Args:
        segments (Iterable[Segment]): Incoming segments.
        color (Color): Color of tint.

    Returns:
        Iterable[Segment]: Segments with applied tint.

    """
    from_rich_color = Color.from_rich_color
    style_from_color = Style.from_color
    _Segment = Segment

    NULL_STYLE = Style()
    for segment in segments:
        text, style, control = segment
        if control:
            yield segment
        else:
            style = style or NULL_STYLE
            yield _Segment(
                text,
                (
                    style
                    + style_from_color(
                        (
                            (from_rich_color(style.color) + color).rich_color
                            if style.color is not None
                            else None
                        ),
                        (
                            (from_rich_color(style.bgcolor) + color).rich_color
                            if style.bgcolor is not None
                            else None
                        ),
                    )
                ),
                control,
            )