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