Skip to content

Commit 96f70e4

Browse files
committed
Invalidate layout when Component resizes and overlay changes
1 parent 64e65a8 commit 96f70e4

File tree

1 file changed

+32
-1
lines changed

1 file changed

+32
-1
lines changed

widget/src/component.rs

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use crate::core::widget;
99
use crate::core::widget::tree::{self, Tree};
1010
use 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

164166
impl<'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

Comments
 (0)