diff options
Diffstat (limited to 'widget/src/lazy')
-rw-r--r-- | widget/src/lazy/component.rs | 88 | ||||
-rw-r--r-- | widget/src/lazy/responsive.rs | 70 |
2 files changed, 83 insertions, 75 deletions
diff --git a/widget/src/lazy/component.rs b/widget/src/lazy/component.rs index c7bc1264..15b8b62e 100644 --- a/widget/src/lazy/component.rs +++ b/widget/src/lazy/component.rs @@ -1,12 +1,12 @@ //! Build and reuse custom widgets using The Elm Architecture. #![allow(deprecated)] -use crate::core::event; use crate::core::layout::{self, Layout}; use crate::core::mouse; use crate::core::overlay; use crate::core::renderer; use crate::core::widget; use crate::core::widget::tree::{self, Tree}; +use crate::core::window; use crate::core::{ self, Clipboard, Element, Length, Point, Rectangle, Shell, Size, Vector, Widget, @@ -141,8 +141,8 @@ struct State<'a, Message: 'a, Theme: 'a, Renderer: 'a, Event: 'a, S: 'a> { element: Option<Element<'this, Event, Theme, Renderer>>, } -impl<'a, Message, Theme, Renderer, Event, S> - Instance<'a, Message, Theme, Renderer, Event, S> +impl<Message, Theme, Renderer, Event, S> + Instance<'_, Message, Theme, Renderer, Event, S> where S: Default + 'static, Renderer: renderer::Renderer, @@ -251,8 +251,8 @@ where } } -impl<'a, Message, Theme, Renderer, Event, S> Widget<Message, Theme, Renderer> - for Instance<'a, Message, Theme, Renderer, Event, S> +impl<Message, Theme, Renderer, Event, S> Widget<Message, Theme, Renderer> + for Instance<'_, Message, Theme, Renderer, Event, S> where S: 'static + Default, Renderer: core::Renderer, @@ -311,7 +311,7 @@ where }) } - fn on_event( + fn update( &mut self, tree: &mut Tree, event: core::Event, @@ -321,13 +321,13 @@ where clipboard: &mut dyn Clipboard, shell: &mut Shell<'_, Message>, viewport: &Rectangle, - ) -> event::Status { + ) { let mut local_messages = Vec::new(); let mut local_shell = Shell::new(&mut local_messages); let t = tree.state.downcast_mut::<Rc<RefCell<Option<Tree>>>>(); - let event_status = self.with_element_mut(|element| { - element.as_widget_mut().on_event( + self.with_element_mut(|element| { + element.as_widget_mut().update( &mut t.borrow_mut().as_mut().unwrap().children[0], event, layout, @@ -336,13 +336,24 @@ where clipboard, &mut local_shell, viewport, - ) + ); }); + if local_shell.is_event_captured() { + shell.capture_event(); + } + local_shell.revalidate_layout(|| shell.invalidate_layout()); if let Some(redraw_request) = local_shell.redraw_request() { - shell.request_redraw(redraw_request); + match redraw_request { + window::RedrawRequest::NextFrame => { + shell.request_redraw(); + } + window::RedrawRequest::At(at) => { + shell.request_redraw_at(at); + } + } } if !local_messages.is_empty() { @@ -369,8 +380,6 @@ where shell.invalidate_layout(); } - - event_status } fn operate( @@ -495,8 +504,8 @@ struct Overlay<'a, 'b, Message, Theme, Renderer, Event, S>( Option<Inner<'a, 'b, Message, Theme, Renderer, Event, S>>, ); -impl<'a, 'b, Message, Theme, Renderer, Event, S> Drop - for Overlay<'a, 'b, Message, Theme, Renderer, Event, S> +impl<Message, Theme, Renderer, Event, S> Drop + for Overlay<'_, '_, Message, Theme, Renderer, Event, S> { fn drop(&mut self) { if let Some(heads) = self.0.take().map(Inner::into_heads) { @@ -520,8 +529,8 @@ struct OverlayInstance<'a, 'b, Message, Theme, Renderer, Event, S> { overlay: Option<Overlay<'a, 'b, Message, Theme, Renderer, Event, S>>, } -impl<'a, 'b, Message, Theme, Renderer, Event, S> - OverlayInstance<'a, 'b, Message, Theme, Renderer, Event, S> +impl<Message, Theme, Renderer, Event, S> + OverlayInstance<'_, '_, Message, Theme, Renderer, Event, S> { fn with_overlay_maybe<T>( &self, @@ -554,9 +563,9 @@ impl<'a, 'b, Message, Theme, Renderer, Event, S> } } -impl<'a, 'b, Message, Theme, Renderer, Event, S> +impl<Message, Theme, Renderer, Event, S> overlay::Overlay<Message, Theme, Renderer> - for OverlayInstance<'a, 'b, Message, Theme, Renderer, Event, S> + for OverlayInstance<'_, '_, Message, Theme, Renderer, Event, S> where Renderer: core::Renderer, S: 'static + Default, @@ -592,7 +601,7 @@ where .unwrap_or_default() } - fn on_event( + fn update( &mut self, event: core::Event, layout: Layout<'_>, @@ -600,27 +609,36 @@ where renderer: &Renderer, clipboard: &mut dyn Clipboard, shell: &mut Shell<'_, Message>, - ) -> event::Status { + ) { let mut local_messages = Vec::new(); let mut local_shell = Shell::new(&mut local_messages); - let event_status = self - .with_overlay_mut_maybe(|overlay| { - overlay.on_event( - event, - layout, - cursor, - renderer, - clipboard, - &mut local_shell, - ) - }) - .unwrap_or(event::Status::Ignored); + let _ = self.with_overlay_mut_maybe(|overlay| { + overlay.update( + event, + layout, + cursor, + renderer, + clipboard, + &mut local_shell, + ); + }); + + if local_shell.is_event_captured() { + shell.capture_event(); + } local_shell.revalidate_layout(|| shell.invalidate_layout()); if let Some(redraw_request) = local_shell.redraw_request() { - shell.request_redraw(redraw_request); + match redraw_request { + window::RedrawRequest::NextFrame => { + shell.request_redraw(); + } + window::RedrawRequest::At(at) => { + shell.request_redraw_at(at); + } + } } if !local_messages.is_empty() { @@ -658,8 +676,6 @@ where shell.invalidate_layout(); } - - event_status } fn is_over( diff --git a/widget/src/lazy/responsive.rs b/widget/src/lazy/responsive.rs index a7a99f56..8129336e 100644 --- a/widget/src/lazy/responsive.rs +++ b/widget/src/lazy/responsive.rs @@ -1,4 +1,3 @@ -use crate::core::event::{self, Event}; use crate::core::layout::{self, Layout}; use crate::core::mouse; use crate::core::overlay; @@ -6,8 +5,8 @@ use crate::core::renderer; use crate::core::widget; use crate::core::widget::tree::{self, Tree}; use crate::core::{ - self, Clipboard, Element, Length, Point, Rectangle, Shell, Size, Vector, - Widget, + self, Clipboard, Element, Event, Length, Point, Rectangle, Shell, Size, + Vector, Widget, }; use crate::horizontal_space; use crate::runtime::overlay::Nested; @@ -83,15 +82,21 @@ where new_size: Size, view: &dyn Fn(Size) -> Element<'a, Message, Theme, Renderer>, ) { - if self.size == new_size { - return; - } + if self.size != new_size { + self.element = view(new_size); + self.size = new_size; + self.layout = None; - self.element = view(new_size); - self.size = new_size; - self.layout = None; + tree.diff(&self.element); + } else { + let is_tree_empty = + tree.tag == tree::Tag::stateless() && tree.children.is_empty(); - tree.diff(&self.element); + if is_tree_empty { + self.layout = None; + tree.diff(&self.element); + } + } } fn resolve<R, T>( @@ -126,8 +131,8 @@ struct State { tree: RefCell<Tree>, } -impl<'a, Message, Theme, Renderer> Widget<Message, Theme, Renderer> - for Responsive<'a, Message, Theme, Renderer> +impl<Message, Theme, Renderer> Widget<Message, Theme, Renderer> + for Responsive<'_, Message, Theme, Renderer> where Renderer: core::Renderer, { @@ -180,7 +185,7 @@ where ); } - fn on_event( + fn update( &mut self, tree: &mut Tree, event: Event, @@ -190,20 +195,20 @@ where clipboard: &mut dyn Clipboard, shell: &mut Shell<'_, Message>, viewport: &Rectangle, - ) -> event::Status { + ) { let state = tree.state.downcast_mut::<State>(); let mut content = self.content.borrow_mut(); let mut local_messages = vec![]; let mut local_shell = Shell::new(&mut local_messages); - let status = content.resolve( + content.resolve( &mut state.tree.borrow_mut(), renderer, layout, &self.view, |tree, renderer, layout, element| { - element.as_widget_mut().on_event( + element.as_widget_mut().update( tree, event, layout, @@ -212,7 +217,7 @@ where clipboard, &mut local_shell, viewport, - ) + ); }, ); @@ -221,8 +226,6 @@ where } shell.merge(local_shell, std::convert::identity); - - status } fn draw( @@ -355,9 +358,7 @@ struct Overlay<'a, 'b, Message, Theme, Renderer> { ), } -impl<'a, 'b, Message, Theme, Renderer> - Overlay<'a, 'b, Message, Theme, Renderer> -{ +impl<Message, Theme, Renderer> Overlay<'_, '_, Message, Theme, Renderer> { fn with_overlay_maybe<T>( &self, f: impl FnOnce(&mut Nested<'_, Message, Theme, Renderer>) -> T, @@ -377,9 +378,8 @@ impl<'a, 'b, Message, Theme, Renderer> } } -impl<'a, 'b, Message, Theme, Renderer> - overlay::Overlay<Message, Theme, Renderer> - for Overlay<'a, 'b, Message, Theme, Renderer> +impl<Message, Theme, Renderer> overlay::Overlay<Message, Theme, Renderer> + for Overlay<'_, '_, Message, Theme, Renderer> where Renderer: core::Renderer, { @@ -414,7 +414,7 @@ where .unwrap_or_default() } - fn on_event( + fn update( &mut self, event: Event, layout: Layout<'_>, @@ -422,28 +422,20 @@ where renderer: &Renderer, clipboard: &mut dyn Clipboard, shell: &mut Shell<'_, Message>, - ) -> event::Status { + ) { let mut is_layout_invalid = false; - let event_status = self - .with_overlay_mut_maybe(|overlay| { - let event_status = overlay.on_event( - event, layout, cursor, renderer, clipboard, shell, - ); - - is_layout_invalid = shell.is_layout_invalid(); + let _ = self.with_overlay_mut_maybe(|overlay| { + overlay.update(event, layout, cursor, renderer, clipboard, shell); - event_status - }) - .unwrap_or(event::Status::Ignored); + is_layout_invalid = shell.is_layout_invalid(); + }); if is_layout_invalid { self.with_overlay_mut(|(_overlay, layout)| { **layout = None; }); } - - event_status } fn is_over( |