Invalidate widget tree from Responsive widget

... by introducing a new `invalidate_widgets` method to `Shell`
This commit is contained in:
Héctor Ramón Jiménez 2022-01-11 13:47:43 +07:00
parent 90c20ac46b
commit 6ab4611a6e
No known key found for this signature in database
GPG key ID: 140CC052C94F138E
8 changed files with 85 additions and 33 deletions

View file

@ -42,7 +42,8 @@ where
/// is naive way to set up our application loop:
///
/// ```no_run
/// use iced_native::{UserInterface, Cache, Size};
/// use iced_native::Size;
/// use iced_native::user_interface::{self, UserInterface};
/// use iced_wgpu::Renderer;
///
/// # mod iced_wgpu {
@ -61,7 +62,7 @@ where
/// # }
/// // Initialization
/// let mut counter = Counter::new();
/// let mut cache = Cache::new();
/// let mut cache = user_interface::Cache::new();
/// let mut renderer = Renderer::new();
/// let mut window_size = Size::new(1024.0, 768.0);
///
@ -136,7 +137,8 @@ where
/// completing [the previous example](#example):
///
/// ```no_run
/// use iced_native::{clipboard, UserInterface, Cache, Size, Point};
/// use iced_native::{clipboard, Size, Point};
/// use iced_native::user_interface::{self, UserInterface};
/// use iced_wgpu::Renderer;
///
/// # mod iced_wgpu {
@ -155,7 +157,7 @@ where
/// # pub fn update(&mut self, message: ()) {}
/// # }
/// let mut counter = Counter::new();
/// let mut cache = Cache::new();
/// let mut cache = user_interface::Cache::new();
/// let mut renderer = Renderer::new();
/// let mut window_size = Size::new(1024.0, 768.0);
/// let mut cursor_position = Point::default();
@ -176,7 +178,7 @@ where
/// );
///
/// // Update the user interface
/// let event_statuses = user_interface.update(
/// let (state, event_statuses) = user_interface.update(
/// &events,
/// cursor_position,
/// &mut renderer,
@ -199,7 +201,9 @@ where
renderer: &mut Renderer,
clipboard: &mut dyn Clipboard,
messages: &mut Vec<Message>,
) -> Vec<event::Status> {
) -> (State, Vec<event::Status>) {
let mut state = State::Updated;
let (base_cursor, overlay_statuses) = if let Some(mut overlay) =
self.root.overlay(Layout::new(&self.base.layout))
{
@ -227,7 +231,7 @@ where
&mut shell,
);
shell.with_invalid_layout(|| {
shell.revalidate_layout(|| {
layer = Self::overlay_layer(
None,
bounds,
@ -236,6 +240,10 @@ where
);
});
if shell.are_widgets_invalid() {
state = State::Outdated;
}
event_status
})
.collect();
@ -255,7 +263,7 @@ where
(cursor_position, vec![event::Status::Ignored; events.len()])
};
events
let event_statuses = events
.iter()
.cloned()
.zip(overlay_statuses.into_iter())
@ -271,7 +279,7 @@ where
&mut shell,
);
shell.with_invalid_layout(|| {
shell.revalidate_layout(|| {
let hash = {
let hasher = &mut crate::Hasher::default();
self.root.hash_layout(hasher);
@ -288,9 +296,15 @@ where
self.overlay = None;
});
if shell.are_widgets_invalid() {
state = State::Outdated;
}
event_status.merge(overlay_status)
})
.collect()
.collect();
(state, event_statuses)
}
/// Draws the [`UserInterface`] with the provided [`Renderer`].
@ -306,7 +320,8 @@ where
/// [completing the last example](#example-1):
///
/// ```no_run
/// use iced_native::{clipboard, UserInterface, Cache, Size, Point};
/// use iced_native::{clipboard, Size, Point};
/// use iced_native::user_interface::{self, UserInterface};
/// use iced_wgpu::Renderer;
///
/// # mod iced_wgpu {
@ -325,7 +340,7 @@ where
/// # pub fn update(&mut self, message: ()) {}
/// # }
/// let mut counter = Counter::new();
/// let mut cache = Cache::new();
/// let mut cache = user_interface::Cache::new();
/// let mut renderer = Renderer::new();
/// let mut window_size = Size::new(1024.0, 768.0);
/// let mut cursor_position = Point::default();
@ -548,3 +563,9 @@ impl Default for Cache {
Cache::new()
}
}
#[derive(Debug, Clone, Copy)]
pub enum State {
Outdated,
Updated,
}