codekingpro/portable-devtools
114k
1from typing import Optional, TYPE_CHECKING2 3from .segment import Segment4from .style import StyleType5from ._loop import loop_last6 7 8if TYPE_CHECKING:9 from .console import (10 Console,11 ConsoleOptions,12 RenderResult,13 RenderableType,14 Group,15 )16 17 18class Screen:19 """A renderable that fills the terminal screen and crops excess.20 21 Args:22 renderable (RenderableType): Child renderable.23 style (StyleType, optional): Optional background style. Defaults to None.24 """25 26 renderable: "RenderableType"27 28 def __init__(29 self,30 *renderables: "RenderableType",31 style: Optional[StyleType] = None,32 application_mode: bool = False,33 ) -> None:34 from rich.console import Group35 36 self.renderable = Group(*renderables)37 self.style = style38 self.application_mode = application_mode39 40 def __rich_console__(41 self, console: "Console", options: "ConsoleOptions"42 ) -> "RenderResult":43 width, height = options.size44 style = console.get_style(self.style) if self.style else None45 render_options = options.update(width=width, height=height)46 lines = console.render_lines(47 self.renderable or "", render_options, style=style, pad=True48 )49 lines = Segment.set_shape(lines, width, height, style=style)50 new_line = Segment("\n\r") if self.application_mode else Segment.line()51 for last, line in loop_last(lines):52 yield from line53 if not last:54 yield new_line55 