summaryrefslogtreecommitdiffstats
path: root/widget/src/lazy
diff options
context:
space:
mode:
Diffstat (limited to 'widget/src/lazy')
-rw-r--r--widget/src/lazy/component.rs88
-rw-r--r--widget/src/lazy/responsive.rs70
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(