simpler caching mechanism

This commit is contained in:
Will McGugan
2025-10-08 16:04:57 +01:00
parent 665610ec0f
commit 528097e65b
2 changed files with 12 additions and 7 deletions

View File

@@ -64,10 +64,8 @@ def arrange(
for widgets in layers.values():
# Partition widgets into split widgets and non-split widgets
non_split_widgets, split_widgets = partition(_get_split, widgets)
if split_widgets:
_split_placements, dock_region = _arrange_split_widgets(
split_widgets, size, viewport
)

View File

@@ -32,7 +32,9 @@ class StreamLayout(Layout):
name = "stream"
def __init__(self) -> None:
self._cache: dict[object, list[WidgetPlacement]] = {}
self._cached_placements: list[WidgetPlacement] | None = None
self._cached_width = 0
super().__init__()
def arrange(
self, parent: Widget, children: list[Widget], size: Size, greedy: bool = True
@@ -42,8 +44,10 @@ class StreamLayout(Layout):
return []
viewport = parent.app.viewport_size
cache_key = (size, viewport)
previous_results = self._cache.get(cache_key, None) or []
if size.width != self._cached_width:
self._cached_placements = None
previous_results = self._cached_placements or []
layout_widgets = parent.screen._layout_widgets.get(parent, [])
_Region = Region
@@ -58,12 +62,14 @@ class StreamLayout(Layout):
pre_populate = bool(previous_results and layout_widgets)
for widget, placement in zip_longest(children, previous_results):
if pre_populate and placement is not None and widget == placement.widget:
if pre_populate and placement is not None and widget is placement.widget:
if widget in layout_widgets:
pre_populate = False
else:
placements.append(placement)
y = placement.region.bottom
styles = widget.styles._base_styles
previous_margin = styles.margin.bottom
continue
if widget is None:
break
@@ -104,7 +110,8 @@ class StreamLayout(Layout):
)
y += height
self._cache[cache_key] = placements
self._cached_width = size.width
self._cached_placements = placements
return placements
def get_content_width(self, widget: Widget, container: Size, viewport: Size) -> int: