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 typing import Iterable, TYPE_CHECKING
from textual import log
from ..css.styles import Styles
from ..geometry import Offset, Region, Size, Spacing, SpacingDimensions from ..geometry import Offset, Region, Size, Spacing, SpacingDimensions
from ..layout import Layout, WidgetPlacement from ..layout import Layout, WidgetPlacement
from .._loop import loop_last from .._loop import loop_last
@@ -44,13 +46,15 @@ class VerticalLayout(Layout):
gutter_height = max(gutter.top, gutter.bottom) gutter_height = max(gutter.top, gutter.bottom)
for last, widget in loop_last(view.children): for last, widget in loop_last(view.children):
if ( styles: Styles = widget.styles
not widget.render_cache if styles.height:
or widget.render_cache.size.width != render_width render_height = int(
): styles.height.resolve_dimension(size, view.app.size)
widget.render_lines_free(render_width) )
assert widget.render_cache is not None else:
render_height = widget.render_cache.size.height render_height = size.height
if styles.width:
render_width = min(styles.width.cells, render_width)
region = Region(x, y, render_width, render_height) region = Region(x, y, render_width, render_height)
yield WidgetPlacement(region, widget, self.z) yield WidgetPlacement(region, widget, self.z)
y += render_height + (gutter.bottom if last else gutter_height) 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.styled import Styled
from rich.text import Text from rich.text import Text
from . import errors from . import errors, log
from . import events from . import events
from ._animator import BoundAnimator from ._animator import BoundAnimator
from ._border import Border from ._border import Border
@@ -36,8 +36,6 @@ from .reactive import watch
if TYPE_CHECKING: if TYPE_CHECKING:
from .view import View from .view import View
log = getLogger("rich")
class RenderCache(NamedTuple): class RenderCache(NamedTuple):
size: Size size: Size
@@ -232,12 +230,6 @@ class Widget(DOMNode):
lines = self.console.render_lines(renderable, options) lines = self.console.render_lines(renderable, options)
self.render_cache = RenderCache(self.size, lines) 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: def _get_lines(self) -> Lines:
"""Get segment lines to render the widget.""" """Get segment lines to render the widget."""
if self.render_cache is None: if self.render_cache is None: