@@ -32,7 +32,9 @@ class StreamLayout(Layout):
3232 name = "stream"
3333
3434 def __init__ (self ) -> None :
35- self ._cache : dict [object , list [WidgetPlacement ]] = {}
35+ self ._cached_placements : list [WidgetPlacement ] | None = None
36+ self ._cached_width = 0
37+ super ().__init__ ()
3638
3739 def arrange (
3840 self , parent : Widget , children : list [Widget ], size : Size , greedy : bool = True
@@ -42,8 +44,10 @@ def arrange(
4244 return []
4345 viewport = parent .app .viewport_size
4446
45- cache_key = (size , viewport )
46- previous_results = self ._cache .get (cache_key , None ) or []
47+ if size .width != self ._cached_width :
48+ self ._cached_placements = None
49+ previous_results = self ._cached_placements or []
50+
4751 layout_widgets = parent .screen ._layout_widgets .get (parent , [])
4852
4953 _Region = Region
@@ -58,12 +62,14 @@ def arrange(
5862
5963 pre_populate = bool (previous_results and layout_widgets )
6064 for widget , placement in zip_longest (children , previous_results ):
61- if pre_populate and placement is not None and widget == placement .widget :
65+ if pre_populate and placement is not None and widget is placement .widget :
6266 if widget in layout_widgets :
6367 pre_populate = False
6468 else :
6569 placements .append (placement )
6670 y = placement .region .bottom
71+ styles = widget .styles ._base_styles
72+ previous_margin = styles .margin .bottom
6773 continue
6874 if widget is None :
6975 break
@@ -104,7 +110,8 @@ def arrange(
104110 )
105111 y += height
106112
107- self ._cache [cache_key ] = placements
113+ self ._cached_width = size .width
114+ self ._cached_placements = placements
108115 return placements
109116
110117 def get_content_width (self , widget : Widget , container : Size , viewport : Size ) -> int :
0 commit comments