mirror of
https://github.com/Textualize/textual.git
synced 2025-10-17 02:38:12 +03:00
Fix vertical layout
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
Reference in New Issue
Block a user