2from itertools
import chain
3from typing
import TYPE_CHECKING, Iterable, Optional
6 from typing
import Literal
10from .constrain
import Constrain
11from .jupyter
import JupyterMixin
12from .measure
import Measurement
13from .segment
import Segment
14from .style
import StyleType
17 from .console
import Console, ConsoleOptions, RenderableType, RenderResult
19AlignMethod = Literal[
"left",
"center",
"right"]
20VerticalAlignMethod = Literal[
"top",
"middle",
"bottom"]
24 """Align a renderable by adding spaces if necessary.
27 renderable (RenderableType): A console renderable.
28 align (AlignMethod): One of "left", "center", or "right""
29 style (StyleType, optional): An optional style to apply to the background.
30 vertical (Optional[VerticalAlginMethod], optional): Optional vertical align, one of "top", "middle", or "bottom". Defaults to None.
31 pad (bool, optional): Pad the right with spaces. Defaults to True.
32 width (int, optional): Restrict contents to given width, or None to use default width. Defaults to None.
33 height (int, optional): Set height of align renderable, or None to fit to contents. Defaults to None.
36 ValueError: if ``align`` is not one of the expected values.
41 renderable:
"RenderableType",
42 align: AlignMethod =
"left",
43 style: Optional[StyleType] =
None,
45 vertical: Optional[VerticalAlignMethod] =
None,
47 width: Optional[int] =
None,
48 height: Optional[int] =
None,
50 if align
not in (
"left",
"center",
"right"):
52 f
'invalid value for align, expected "left", "center", or "right" (not {align!r})'
54 if vertical
is not None and vertical
not in (
"top",
"middle",
"bottom"):
56 f
'invalid value for vertical, expected "top", "middle", or "bottom" (not {vertical!r})'
67 return f
"Align({self.renderable!r}, {self.align!r})"
72 renderable:
"RenderableType",
73 style: Optional[StyleType] =
None,
75 vertical: Optional[VerticalAlignMethod] =
None,
77 width: Optional[int] =
None,
78 height: Optional[int] =
None,
80 """Align a renderable to the left."""
94 renderable:
"RenderableType",
95 style: Optional[StyleType] =
None,
97 vertical: Optional[VerticalAlignMethod] =
None,
99 width: Optional[int] =
None,
100 height: Optional[int] =
None,
102 """Align a renderable to the center."""
116 renderable:
"RenderableType",
117 style: Optional[StyleType] =
None,
119 vertical: Optional[VerticalAlignMethod] =
None,
121 width: Optional[int] =
None,
122 height: Optional[int] =
None,
124 """Align a renderable to the right."""
136 self, console:
"Console", options:
"ConsoleOptions"
154 if excess_space <= 0:
160 elif align ==
"left":
162 pad =
Segment(
" " * excess_space, style)
if self.
pad else None
169 elif align ==
"center":
171 left = excess_space // 2
172 pad =
Segment(
" " * left, style)
174 Segment(
" " * (excess_space - left), style)
if self.
pad else None
184 elif align ==
"right":
186 pad =
Segment(
" " * excess_space, style)
193 Segment(f
"{' ' * (self.width or options.max_width)}\n", style)
200 for _
in range(count):
204 iter_segments: Iterable[Segment]
205 if self.
vertical and vertical_height
is not None:
207 bottom_space = vertical_height - height
210 top_space = (vertical_height - height) // 2
211 bottom_space = vertical_height - top_space - height
212 iter_segments = chain(
218 top_space = vertical_height - height
225 yield from iter_segments
228 self, console:
"Console", options:
"ConsoleOptions"
235 """Vertically aligns a renderable.
238 This class is deprecated and may be removed in a future version. Use Align class with
242 renderable (RenderableType): A renderable object.
247 renderable:
"RenderableType",
248 style: Optional[StyleType] =
None,
254 return f
"VerticalCenter({self.renderable!r})"
257 self, console:
"Console", options:
"ConsoleOptions"
266 top_space = (height -
len(lines)) // 2
267 bottom_space = height - top_space -
len(lines)
268 blank_line =
Segment(f
"{' ' * width}", style)
271 for _
in range(count):
284 self, console:
"Console", options:
"ConsoleOptions"
290if __name__ ==
"__main__":
305 style=
"on dark_blue",
None __init__(self, "RenderableType" renderable, AlignMethod align="left", Optional[StyleType] style=None, *Optional[VerticalAlignMethod] vertical=None, bool pad=True, Optional[int] width=None, Optional[int] height=None)
Measurement __rich_measure__(self, "Console" console, "ConsoleOptions" options)
"RenderResult" __rich_console__(self, "Console" console, "ConsoleOptions" options)
"Align" right(cls, "RenderableType" renderable, Optional[StyleType] style=None, *Optional[VerticalAlignMethod] vertical=None, bool pad=True, Optional[int] width=None, Optional[int] height=None)
"Align" center(cls, "RenderableType" renderable, Optional[StyleType] style=None, *Optional[VerticalAlignMethod] vertical=None, bool pad=True, Optional[int] width=None, Optional[int] height=None)
"Align" left(cls, "RenderableType" renderable, Optional[StyleType] style=None, *Optional[VerticalAlignMethod] vertical=None, bool pad=True, Optional[int] width=None, Optional[int] height=None)
None __init__(self, "RenderableType" renderable, Optional[StyleType] style=None)
Measurement __rich_measure__(self, "Console" console, "ConsoleOptions" options)
"RenderResult" __rich_console__(self, "Console" console, "ConsoleOptions" options)