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(): for widgets in layers.values():
# Partition widgets into split widgets and non-split widgets # Partition widgets into split widgets and non-split widgets
non_split_widgets, split_widgets = partition(_get_split, widgets) non_split_widgets, split_widgets = partition(_get_split, widgets)
if split_widgets: if split_widgets:
_split_placements, dock_region = _arrange_split_widgets( _split_placements, dock_region = _arrange_split_widgets(
split_widgets, size, viewport split_widgets, size, viewport
) )

View File

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