@@ -9,7 +9,7 @@ use crate::core::widget;
99use crate :: core:: widget:: tree:: { self , Tree } ;
1010use crate :: core:: {
1111 self , Clipboard , Element , Event , Length , Point , Rectangle , Shell , Size ,
12- Widget ,
12+ Vector , Widget ,
1313} ;
1414
1515/// A reusable, custom widget that uses The Elm Architecture.
@@ -146,6 +146,7 @@ where
146146 limits : layout:: Limits :: new ( Size :: ZERO , Size :: INFINITE ) ,
147147 layout : layout:: Node :: new ( Size :: ZERO ) ,
148148 is_outdated : true ,
149+ has_overlay : false ,
149150 } )
150151}
151152
@@ -159,6 +160,7 @@ where
159160 layout : layout:: Node ,
160161 size_hint : Size < Length > ,
161162 is_outdated : bool ,
163+ has_overlay : bool ,
162164}
163165
164166impl < ' a , C , Message , Theme , Renderer > Widget < Message , Theme , Renderer >
@@ -271,6 +273,8 @@ where
271273 }
272274
273275 if !events. is_empty ( ) {
276+ let previous_size = self . layout . size ( ) ;
277+
274278 for event in events {
275279 if let Some ( message) = self . component . update ( state, event) {
276280 shell. publish ( message) ;
@@ -291,6 +295,31 @@ where
291295 if new_size_hint != self . size_hint {
292296 self . size_hint = new_size_hint;
293297 shell. invalidate_layout ( ) ;
298+ } else if ( self . size_hint . width == Length :: Shrink
299+ || self . size_hint . height == Length :: Shrink )
300+ && previous_size != self . layout . size ( )
301+ {
302+ shell. invalidate_layout ( ) ;
303+ } else {
304+ let has_overlay = self
305+ . view
306+ . as_widget_mut ( )
307+ . overlay (
308+ & mut tree. children [ 0 ] ,
309+ Layout :: with_offset (
310+ layout. position ( ) - Point :: ORIGIN ,
311+ & self . layout ,
312+ ) ,
313+ renderer,
314+ viewport,
315+ Vector :: ZERO ,
316+ )
317+ . is_some ( ) ;
318+
319+ if self . has_overlay != has_overlay {
320+ self . has_overlay = has_overlay;
321+ shell. invalidate_layout ( ) ;
322+ }
294323 }
295324
296325 self . is_outdated = false ;
@@ -392,6 +421,8 @@ where
392421 translation,
393422 ) ?;
394423
424+ self . has_overlay = true ;
425+
395426 let state = tree. state . downcast_mut ( ) ;
396427
397428 Some ( overlay:: Element :: new ( Box :: new ( Overlay {
0 commit comments