diff --git a/src/textual/layouts/vertical.py b/src/textual/layouts/vertical.py index aabb88f80..05c6a1a54 100644 --- a/src/textual/layouts/vertical.py +++ b/src/textual/layouts/vertical.py @@ -2,6 +2,8 @@ from __future__ import annotations from typing import Iterable, TYPE_CHECKING +from textual import log +from ..css.styles import Styles from ..geometry import Offset, Region, Size, Spacing, SpacingDimensions from ..layout import Layout, WidgetPlacement from .._loop import loop_last @@ -44,13 +46,15 @@ class VerticalLayout(Layout): gutter_height = max(gutter.top, gutter.bottom) for last, widget in loop_last(view.children): - if ( - not widget.render_cache - or widget.render_cache.size.width != render_width - ): - widget.render_lines_free(render_width) - assert widget.render_cache is not None - render_height = widget.render_cache.size.height + styles: Styles = widget.styles + if styles.height: + render_height = int( + styles.height.resolve_dimension(size, view.app.size) + ) + else: + render_height = size.height + if styles.width: + render_width = min(styles.width.cells, render_width) region = Region(x, y, render_width, render_height) yield WidgetPlacement(region, widget, self.z) y += render_height + (gutter.bottom if last else gutter_height) diff --git a/src/textual/widget.py b/src/textual/widget.py index 94d768129..3b2de4d44 100644 --- a/src/textual/widget.py +++ b/src/textual/widget.py @@ -20,7 +20,7 @@ from rich.style import Style from rich.styled import Styled from rich.text import Text -from . import errors +from . import errors, log from . import events from ._animator import BoundAnimator from ._border import Border @@ -36,8 +36,6 @@ from .reactive import watch if TYPE_CHECKING: from .view import View -log = getLogger("rich") - class RenderCache(NamedTuple): size: Size @@ -232,12 +230,6 @@ class Widget(DOMNode): lines = self.console.render_lines(renderable, options) self.render_cache = RenderCache(self.size, lines) - def render_lines_free(self, width: int) -> None: - renderable = self.render_styled() - options = self.console.options.update(width=width, height=None) - lines = self.console.render_lines(renderable, options) - self.render_cache = RenderCache(Size(width, len(lines)), lines) - def _get_lines(self) -> Lines: """Get segment lines to render the widget.""" if self.render_cache is None: