mirror of
https://github.com/Textualize/textual.git
synced 2025-10-17 02:38:12 +03:00
added style attributes to render
This commit is contained in:
@@ -116,6 +116,7 @@ class Calculator(GridView):
|
||||
|
||||
# The calculator display
|
||||
self.numbers = Numbers()
|
||||
self.numbers.style_border = "bold"
|
||||
|
||||
def make_button(text: str, style: str) -> Button:
|
||||
"""Create a button with the given Figlet label."""
|
||||
|
||||
@@ -156,11 +156,11 @@ class Region(NamedTuple):
|
||||
"""Create a region from origin and size.
|
||||
|
||||
Args:
|
||||
origin (Point): [description]
|
||||
size (tuple[int, int]): [description]
|
||||
origin (Point): Origin (top left point)
|
||||
size (tuple[int, int]): Dimensions of region.
|
||||
|
||||
Returns:
|
||||
Region: [description]
|
||||
Region: A region instance.
|
||||
"""
|
||||
x, y = origin
|
||||
width, height = size
|
||||
@@ -171,10 +171,25 @@ class Region(NamedTuple):
|
||||
|
||||
@property
|
||||
def x_extents(self) -> tuple[int, int]:
|
||||
"""Get the starting and ending x coord.
|
||||
|
||||
The end value is non inclusive.
|
||||
|
||||
Returns:
|
||||
tuple[int, int]: [description]
|
||||
"""
|
||||
return (self.x, self.x + self.width)
|
||||
|
||||
@property
|
||||
def y_extents(self) -> tuple[int, int]:
|
||||
"""Get the starting and ending x coord.
|
||||
|
||||
The end value is non inclusive.
|
||||
|
||||
Returns:
|
||||
tuple[int, int]: [description]
|
||||
"""
|
||||
return (self.x, self.x + self.width)
|
||||
return (self.y, self.y + self.height)
|
||||
|
||||
@property
|
||||
@@ -212,11 +227,11 @@ class Region(NamedTuple):
|
||||
|
||||
@property
|
||||
def x_range(self) -> range:
|
||||
return range(self.x, self.x_max)
|
||||
return range(self.x, self.x + self.width)
|
||||
|
||||
@property
|
||||
def y_range(self) -> range:
|
||||
return range(self.y, self.y_max)
|
||||
return range(self.y, self.y + self.height)
|
||||
|
||||
def __add__(self, other: Any) -> Region:
|
||||
if isinstance(other, tuple):
|
||||
|
||||
@@ -12,12 +12,15 @@ from typing import (
|
||||
cast,
|
||||
)
|
||||
import rich.repr
|
||||
from rich import box
|
||||
from rich.align import Align
|
||||
from rich.console import Console, RenderableType
|
||||
from rich.panel import Panel
|
||||
from rich.padding import Padding, PaddingDimensions
|
||||
from rich.pretty import Pretty
|
||||
from rich.segment import Segment
|
||||
from rich.style import Style
|
||||
from rich.styled import Styled
|
||||
from rich.text import TextType
|
||||
|
||||
from . import events
|
||||
from ._animator import BoundAnimator
|
||||
@@ -72,6 +75,25 @@ class Widget(MessagePump):
|
||||
layout_offset_x: Reactive[float] = Reactive(0.0, layout=True)
|
||||
layout_offset_y: Reactive[float] = Reactive(0.0, layout=True)
|
||||
|
||||
style: Reactive[str | None] = Reactive(None)
|
||||
style_padding: Reactive[PaddingDimensions | None] = Reactive(None, layout=True)
|
||||
style_margin: Reactive[PaddingDimensions | None] = Reactive(None, layout=True)
|
||||
style_border: Reactive[str] = Reactive("none", layout=True)
|
||||
style_border_style: Reactive[str] = Reactive("")
|
||||
style_border_title: Reactive[TextType] = Reactive("")
|
||||
|
||||
BOX_MAP = {"normal": box.SQUARE, "round": box.ROUNDED, "bold": box.HEAVY}
|
||||
|
||||
def validate_style_padding(
|
||||
self, padding: PaddingDimensions
|
||||
) -> tuple[int, int, int, int]:
|
||||
return Padding.unpack(padding)
|
||||
|
||||
def validate_style_margin(
|
||||
self, padding: PaddingDimensions
|
||||
) -> tuple[int, int, int, int]:
|
||||
return Padding.unpack(padding)
|
||||
|
||||
def validate_layout_offset_x(self, value) -> int:
|
||||
return int(value)
|
||||
|
||||
@@ -86,11 +108,28 @@ class Widget(MessagePump):
|
||||
yield "name", self.name
|
||||
|
||||
def __rich__(self) -> RenderableType:
|
||||
return self.render()
|
||||
renderable = self.render_styled()
|
||||
return renderable
|
||||
|
||||
def watch(self, attribute_name, callback: Callable[[Any], Awaitable[None]]) -> None:
|
||||
watch(self, attribute_name, callback)
|
||||
|
||||
def render_styled(self) -> RenderableType:
|
||||
renderable = self.render()
|
||||
if self.style_padding is not None:
|
||||
renderable = Padding(renderable, self.style_padding)
|
||||
if self.style_border in self.BOX_MAP:
|
||||
renderable = Panel(
|
||||
renderable,
|
||||
box=self.BOX_MAP.get(self.style_border) or box.SQUARE,
|
||||
style=self.style_border_style,
|
||||
)
|
||||
if self.style_margin is not None:
|
||||
renderable = Padding(renderable, self.style_margin)
|
||||
if self.style:
|
||||
renderable = Styled(renderable, self.style)
|
||||
return renderable
|
||||
|
||||
@property
|
||||
def size(self) -> Size:
|
||||
return self._size
|
||||
@@ -126,7 +165,7 @@ class Widget(MessagePump):
|
||||
|
||||
def render_lines(self) -> RenderCache:
|
||||
width, height = self.size
|
||||
renderable = self.render()
|
||||
renderable = self.render_styled()
|
||||
options = self.console.options.update_dimensions(width, height)
|
||||
lines = self.console.render_lines(renderable, options)
|
||||
self.render_cache = RenderCache(self.size, lines)
|
||||
@@ -134,7 +173,7 @@ class Widget(MessagePump):
|
||||
|
||||
def render_lines_free(self, width: int) -> RenderCache:
|
||||
|
||||
renderable = self.render()
|
||||
renderable = self.render_styled()
|
||||
|
||||
options = self.console.options.update(width=width, height=None)
|
||||
|
||||
|
||||
@@ -51,15 +51,16 @@ class Button(Widget):
|
||||
name: str | None = None,
|
||||
style: StyleType = "white on dark_blue",
|
||||
):
|
||||
self.name = name or str(label)
|
||||
self.style = style
|
||||
super().__init__(name=name)
|
||||
self.name = name or str(label)
|
||||
self.button_style = style
|
||||
|
||||
self.label = label
|
||||
|
||||
label: Reactive[RenderableType] = Reactive("")
|
||||
|
||||
def render(self) -> RenderableType:
|
||||
return ButtonRenderable(self.label, style=self.style)
|
||||
return ButtonRenderable(self.label, style=self.button_style)
|
||||
|
||||
async def on_click(self, event: events.Click) -> None:
|
||||
await self.emit(ButtonPressed(self))
|
||||
|
||||
Reference in New Issue
Block a user