Let us walk on the 3-isogeny graph
Loading...
Searching...
No Matches
live_render.py
Go to the documentation of this file.
1import sys
2from typing import Optional, Tuple
3
4if sys.version_info >= (3, 8):
5 from typing import Literal
6else:
7 from pip._vendor.typing_extensions import Literal # pragma: no cover
8
9
10from ._loop import loop_last
11from .console import Console, ConsoleOptions, RenderableType, RenderResult
12from .control import Control
13from .segment import ControlType, Segment
14from .style import StyleType
15from .text import Text
16
17VerticalOverflowMethod = Literal["crop", "ellipsis", "visible"]
18
19
21 """Creates a renderable that may be updated.
22
23 Args:
24 renderable (RenderableType): Any renderable object.
25 style (StyleType, optional): An optional style to apply to the renderable. Defaults to "".
26 """
27
29 self,
30 renderable: RenderableType,
31 style: StyleType = "",
32 vertical_overflow: VerticalOverflowMethod = "ellipsis",
33 ) -> None:
34 self.renderable = renderable
35 self.style = style
36 self.vertical_overflow = vertical_overflow
37 self._shape: Optional[Tuple[int, int]] = None
38
39 def set_renderable(self, renderable: RenderableType) -> None:
40 """Set a new renderable.
41
42 Args:
43 renderable (RenderableType): Any renderable object, including str.
44 """
45 self.renderable = renderable
46
47 def position_cursor(self) -> Control:
48 """Get control codes to move cursor to beginning of live render.
49
50 Returns:
51 Control: A control instance that may be printed.
52 """
53 if self._shape is not None:
54 _, height = self._shape
55 return Control(
58 *(
59 (
62 )
63 * (height - 1)
64 )
65 )
66 return Control()
67
68 def restore_cursor(self) -> Control:
69 """Get control codes to clear the render and restore the cursor to its previous position.
70
71 Returns:
72 Control: A Control instance that may be printed.
73 """
74 if self._shape is not None:
75 _, height = self._shape
76 return Control(
79 )
80 return Control()
81
83 self, console: Console, options: ConsoleOptions
84 ) -> RenderResult:
85
86 renderable = self.renderable
87 style = console.get_style(self.style)
88 lines = console.render_lines(renderable, options, style=style, pad=False)
89 shape = Segment.get_shape(lines)
90
91 _, height = shape
92 if height > options.size.height:
93 if self.vertical_overflow == "crop":
94 lines = lines[: options.size.height]
95 shape = Segment.get_shape(lines)
96 elif self.vertical_overflow == "ellipsis":
97 lines = lines[: (options.size.height - 1)]
98 overflow_text = Text(
99 "...",
100 overflow="crop",
101 justify="center",
102 end="",
103 style="live.ellipsis",
104 )
105 lines.append(list(console.render(overflow_text)))
106 shape = Segment.get_shape(lines)
107 self._shape = shape
108
109 new_line = Segment.line()
110 for last, line in loop_last(lines):
111 yield from line
112 if not last:
113 yield new_line
None set_renderable(self, RenderableType renderable)
RenderResult __rich_console__(self, Console console, ConsoleOptions options)
None __init__(self, RenderableType renderable, StyleType style="", VerticalOverflowMethod vertical_overflow="ellipsis")
for i