Fix vertical layout

This commit is contained in:
Darren Burns
2022-01-26 10:33:38 +00:00
parent 19d0a2b097
commit 328b1be0b1
2 changed files with 12 additions and 16 deletions

View File

@@ -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)

View File

@@ -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: