Add viewport to Widget::on_event

This commit is contained in:
Cory Forsstrom 2023-07-15 10:04:25 -07:00
parent e462f48a5a
commit 42c423b4a8
30 changed files with 77 additions and 5 deletions

View file

@ -380,6 +380,7 @@ where
renderer: &Renderer, renderer: &Renderer,
clipboard: &mut dyn Clipboard, clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, B>, shell: &mut Shell<'_, B>,
viewport: &Rectangle,
) -> event::Status { ) -> event::Status {
let mut local_messages = Vec::new(); let mut local_messages = Vec::new();
let mut local_shell = Shell::new(&mut local_messages); let mut local_shell = Shell::new(&mut local_messages);
@ -392,6 +393,7 @@ where
renderer, renderer,
clipboard, clipboard,
&mut local_shell, &mut local_shell,
viewport,
); );
shell.merge(local_shell, &self.mapper); shell.merge(local_shell, &self.mapper);
@ -511,10 +513,11 @@ where
renderer: &Renderer, renderer: &Renderer,
clipboard: &mut dyn Clipboard, clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>, shell: &mut Shell<'_, Message>,
viewport: &Rectangle,
) -> event::Status { ) -> event::Status {
self.element self.element.widget.on_event(
.widget state, event, layout, cursor, renderer, clipboard, shell, viewport,
.on_event(state, event, layout, cursor, renderer, clipboard, shell) )
} }
fn draw( fn draw(

View file

@ -115,6 +115,7 @@ where
_renderer: &Renderer, _renderer: &Renderer,
_clipboard: &mut dyn Clipboard, _clipboard: &mut dyn Clipboard,
_shell: &mut Shell<'_, Message>, _shell: &mut Shell<'_, Message>,
_viewport: &Rectangle,
) -> event::Status { ) -> event::Status {
event::Status::Ignored event::Status::Ignored
} }

View file

@ -272,6 +272,7 @@ where
_renderer: &iced::Renderer<Theme>, _renderer: &iced::Renderer<Theme>,
_clipboard: &mut dyn Clipboard, _clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>, shell: &mut Shell<'_, Message>,
_viewport: &Rectangle,
) -> event::Status { ) -> event::Status {
const FRAME_RATE: u64 = 60; const FRAME_RATE: u64 = 60;

View file

@ -193,6 +193,7 @@ where
_renderer: &Renderer, _renderer: &Renderer,
_clipboard: &mut dyn Clipboard, _clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>, shell: &mut Shell<'_, Message>,
_viewport: &Rectangle,
) -> event::Status { ) -> event::Status {
const FRAME_RATE: u64 = 60; const FRAME_RATE: u64 = 60;

View file

@ -300,6 +300,7 @@ mod modal {
renderer: &Renderer, renderer: &Renderer,
clipboard: &mut dyn Clipboard, clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>, shell: &mut Shell<'_, Message>,
viewport: &Rectangle,
) -> event::Status { ) -> event::Status {
self.base.as_widget_mut().on_event( self.base.as_widget_mut().on_event(
&mut state.children[0], &mut state.children[0],
@ -309,6 +310,7 @@ mod modal {
renderer, renderer,
clipboard, clipboard,
shell, shell,
viewport,
) )
} }
@ -446,6 +448,7 @@ mod modal {
renderer, renderer,
clipboard, clipboard,
shell, shell,
&layout.bounds(),
) )
} }

View file

@ -400,6 +400,7 @@ mod toast {
renderer: &Renderer, renderer: &Renderer,
clipboard: &mut dyn Clipboard, clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>, shell: &mut Shell<'_, Message>,
viewport: &Rectangle,
) -> event::Status { ) -> event::Status {
self.content.as_widget_mut().on_event( self.content.as_widget_mut().on_event(
&mut state.children[0], &mut state.children[0],
@ -409,6 +410,7 @@ mod toast {
renderer, renderer,
clipboard, clipboard,
shell, shell,
viewport,
) )
} }
@ -559,6 +561,8 @@ mod toast {
} }
} }
let viewport = layout.bounds();
self.toasts self.toasts
.iter_mut() .iter_mut()
.zip(self.state.iter_mut()) .zip(self.state.iter_mut())
@ -576,6 +580,7 @@ mod toast {
renderer, renderer,
clipboard, clipboard,
&mut local_shell, &mut local_shell,
&viewport,
); );
if !local_shell.is_empty() { if !local_shell.is_empty() {

View file

@ -284,6 +284,8 @@ where
(cursor, vec![event::Status::Ignored; events.len()]) (cursor, vec![event::Status::Ignored; events.len()])
}; };
let viewport = Rectangle::with_size(self.bounds);
let _ = ManuallyDrop::into_inner(manual_overlay); let _ = ManuallyDrop::into_inner(manual_overlay);
let event_statuses = events let event_statuses = events
@ -305,6 +307,7 @@ where
renderer, renderer,
clipboard, clipboard,
&mut shell, &mut shell,
&viewport,
); );
if matches!(event_status, event::Status::Captured) { if matches!(event_status, event::Status::Captured) {

View file

@ -200,6 +200,7 @@ where
renderer: &Renderer, renderer: &Renderer,
clipboard: &mut dyn Clipboard, clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>, shell: &mut Shell<'_, Message>,
viewport: &Rectangle,
) -> event::Status { ) -> event::Status {
if let event::Status::Captured = self.content.as_widget_mut().on_event( if let event::Status::Captured = self.content.as_widget_mut().on_event(
&mut tree.children[0], &mut tree.children[0],
@ -209,6 +210,7 @@ where
renderer, renderer,
clipboard, clipboard,
shell, shell,
viewport,
) { ) {
return event::Status::Captured; return event::Status::Captured;
} }

View file

@ -147,6 +147,7 @@ where
_renderer: &Renderer, _renderer: &Renderer,
_clipboard: &mut dyn Clipboard, _clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>, shell: &mut Shell<'_, Message>,
_viewport: &Rectangle,
) -> event::Status { ) -> event::Status {
let bounds = layout.bounds(); let bounds = layout.bounds();

View file

@ -208,6 +208,7 @@ where
_renderer: &Renderer, _renderer: &Renderer,
_clipboard: &mut dyn Clipboard, _clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>, shell: &mut Shell<'_, Message>,
_viewport: &Rectangle,
) -> event::Status { ) -> event::Status {
match event { match event {
Event::Mouse(mouse::Event::ButtonPressed(mouse::Button::Left)) Event::Mouse(mouse::Event::ButtonPressed(mouse::Button::Left))

View file

@ -170,6 +170,7 @@ where
renderer: &Renderer, renderer: &Renderer,
clipboard: &mut dyn Clipboard, clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>, shell: &mut Shell<'_, Message>,
viewport: &Rectangle,
) -> event::Status { ) -> event::Status {
self.children self.children
.iter_mut() .iter_mut()
@ -184,6 +185,7 @@ where
renderer, renderer,
clipboard, clipboard,
shell, shell,
viewport,
) )
}) })
.fold(event::Status::Ignored, event::Status::merge) .fold(event::Status::Ignored, event::Status::merge)

View file

@ -200,6 +200,7 @@ where
renderer: &Renderer, renderer: &Renderer,
clipboard: &mut dyn Clipboard, clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>, shell: &mut Shell<'_, Message>,
viewport: &Rectangle,
) -> event::Status { ) -> event::Status {
self.content.as_widget_mut().on_event( self.content.as_widget_mut().on_event(
&mut tree.children[0], &mut tree.children[0],
@ -209,6 +210,7 @@ where
renderer, renderer,
clipboard, clipboard,
shell, shell,
viewport,
) )
} }

View file

@ -148,6 +148,7 @@ where
renderer: &Renderer, renderer: &Renderer,
_clipboard: &mut dyn Clipboard, _clipboard: &mut dyn Clipboard,
_shell: &mut Shell<'_, Message>, _shell: &mut Shell<'_, Message>,
_viewport: &Rectangle,
) -> event::Status { ) -> event::Status {
let bounds = layout.bounds(); let bounds = layout.bounds();

View file

@ -186,6 +186,7 @@ where
renderer: &Renderer, renderer: &Renderer,
clipboard: &mut dyn Clipboard, clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>, shell: &mut Shell<'_, Message>,
viewport: &Rectangle,
) -> event::Status { ) -> event::Status {
self.with_element_mut(|element| { self.with_element_mut(|element| {
element.as_widget_mut().on_event( element.as_widget_mut().on_event(
@ -196,6 +197,7 @@ where
renderer, renderer,
clipboard, clipboard,
shell, shell,
viewport,
) )
}) })
} }

View file

@ -270,6 +270,7 @@ where
renderer: &Renderer, renderer: &Renderer,
clipboard: &mut dyn Clipboard, clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>, shell: &mut Shell<'_, Message>,
viewport: &Rectangle,
) -> event::Status { ) -> event::Status {
let mut local_messages = Vec::new(); let mut local_messages = Vec::new();
let mut local_shell = Shell::new(&mut local_messages); let mut local_shell = Shell::new(&mut local_messages);
@ -284,6 +285,7 @@ where
renderer, renderer,
clipboard, clipboard,
&mut local_shell, &mut local_shell,
viewport,
) )
}); });

View file

@ -182,6 +182,7 @@ where
renderer: &Renderer, renderer: &Renderer,
clipboard: &mut dyn Clipboard, clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>, shell: &mut Shell<'_, Message>,
viewport: &Rectangle,
) -> event::Status { ) -> event::Status {
let state = tree.state.downcast_mut::<State>(); let state = tree.state.downcast_mut::<State>();
let mut content = self.content.borrow_mut(); let mut content = self.content.borrow_mut();
@ -203,6 +204,7 @@ where
renderer, renderer,
clipboard, clipboard,
&mut local_shell, &mut local_shell,
viewport,
) )
}, },
); );

View file

@ -150,6 +150,7 @@ where
renderer: &Renderer, renderer: &Renderer,
clipboard: &mut dyn Clipboard, clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>, shell: &mut Shell<'_, Message>,
viewport: &Rectangle,
) -> event::Status { ) -> event::Status {
if let event::Status::Captured = self.content.as_widget_mut().on_event( if let event::Status::Captured = self.content.as_widget_mut().on_event(
&mut tree.children[0], &mut tree.children[0],
@ -159,6 +160,7 @@ where
renderer, renderer,
clipboard, clipboard,
shell, shell,
viewport,
) { ) {
return event::Status::Captured; return event::Status::Captured;
} }

View file

@ -268,8 +268,11 @@ where
clipboard: &mut dyn Clipboard, clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>, shell: &mut Shell<'_, Message>,
) -> event::Status { ) -> event::Status {
let bounds = layout.bounds();
self.container.on_event( self.container.on_event(
self.state, event, layout, cursor, renderer, clipboard, shell, self.state, event, layout, cursor, renderer, clipboard, shell,
&bounds,
) )
} }
@ -377,6 +380,7 @@ where
renderer: &Renderer, renderer: &Renderer,
_clipboard: &mut dyn Clipboard, _clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>, shell: &mut Shell<'_, Message>,
_viewport: &Rectangle,
) -> event::Status { ) -> event::Status {
match event { match event {
Event::Mouse(mouse::Event::ButtonPressed(mouse::Button::Left)) => { Event::Mouse(mouse::Event::ButtonPressed(mouse::Button::Left)) => {

View file

@ -317,6 +317,7 @@ where
renderer: &Renderer, renderer: &Renderer,
clipboard: &mut dyn Clipboard, clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>, shell: &mut Shell<'_, Message>,
viewport: &Rectangle,
) -> event::Status { ) -> event::Status {
let action = tree.state.downcast_mut::<state::Action>(); let action = tree.state.downcast_mut::<state::Action>();
@ -357,6 +358,7 @@ where
renderer, renderer,
clipboard, clipboard,
shell, shell,
viewport,
is_picked, is_picked,
) )
}) })

View file

@ -222,6 +222,7 @@ where
renderer: &Renderer, renderer: &Renderer,
clipboard: &mut dyn Clipboard, clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>, shell: &mut Shell<'_, Message>,
viewport: &Rectangle,
is_picked: bool, is_picked: bool,
) -> event::Status { ) -> event::Status {
let mut event_status = event::Status::Ignored; let mut event_status = event::Status::Ignored;
@ -237,6 +238,7 @@ where
renderer, renderer,
clipboard, clipboard,
shell, shell,
viewport,
); );
children.next().unwrap() children.next().unwrap()
@ -255,6 +257,7 @@ where
renderer, renderer,
clipboard, clipboard,
shell, shell,
viewport,
) )
}; };

View file

@ -304,6 +304,7 @@ where
renderer: &Renderer, renderer: &Renderer,
clipboard: &mut dyn Clipboard, clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>, shell: &mut Shell<'_, Message>,
viewport: &Rectangle,
) -> event::Status { ) -> event::Status {
let mut children = layout.children(); let mut children = layout.children();
let padded = children.next().unwrap(); let padded = children.next().unwrap();
@ -328,6 +329,7 @@ where
renderer, renderer,
clipboard, clipboard,
shell, shell,
viewport,
) )
} else { } else {
event::Status::Ignored event::Status::Ignored
@ -342,6 +344,7 @@ where
renderer, renderer,
clipboard, clipboard,
shell, shell,
viewport,
) )
} else { } else {
event::Status::Ignored event::Status::Ignored

View file

@ -200,6 +200,7 @@ where
_renderer: &Renderer, _renderer: &Renderer,
_clipboard: &mut dyn Clipboard, _clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>, shell: &mut Shell<'_, Message>,
_viewport: &Rectangle,
) -> event::Status { ) -> event::Status {
update( update(
event, event,

View file

@ -233,6 +233,7 @@ where
_renderer: &Renderer, _renderer: &Renderer,
_clipboard: &mut dyn Clipboard, _clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>, shell: &mut Shell<'_, Message>,
_viewport: &Rectangle,
) -> event::Status { ) -> event::Status {
match event { match event {
Event::Mouse(mouse::Event::ButtonPressed(mouse::Button::Left)) Event::Mouse(mouse::Event::ButtonPressed(mouse::Button::Left))

View file

@ -159,6 +159,7 @@ where
renderer: &Renderer, renderer: &Renderer,
clipboard: &mut dyn Clipboard, clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>, shell: &mut Shell<'_, Message>,
viewport: &Rectangle,
) -> event::Status { ) -> event::Status {
self.children self.children
.iter_mut() .iter_mut()
@ -173,6 +174,7 @@ where
renderer, renderer,
clipboard, clipboard,
shell, shell,
viewport,
) )
}) })
.fold(event::Status::Ignored, event::Status::merge) .fold(event::Status::Ignored, event::Status::merge)

View file

@ -278,6 +278,7 @@ where
renderer: &Renderer, renderer: &Renderer,
clipboard: &mut dyn Clipboard, clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>, shell: &mut Shell<'_, Message>,
_viewport: &Rectangle,
) -> event::Status { ) -> event::Status {
update( update(
tree.state.downcast_mut::<State>(), tree.state.downcast_mut::<State>(),
@ -288,7 +289,7 @@ where
shell, shell,
self.direction, self.direction,
&self.on_scroll, &self.on_scroll,
|event, layout, cursor, clipboard, shell| { |event, layout, cursor, clipboard, shell, viewport| {
self.content.as_widget_mut().on_event( self.content.as_widget_mut().on_event(
&mut tree.children[0], &mut tree.children[0],
event, event,
@ -297,6 +298,7 @@ where
renderer, renderer,
clipboard, clipboard,
shell, shell,
viewport,
) )
}, },
) )
@ -492,6 +494,7 @@ pub fn update<Message>(
mouse::Cursor, mouse::Cursor,
&mut dyn Clipboard, &mut dyn Clipboard,
&mut Shell<'_, Message>, &mut Shell<'_, Message>,
&Rectangle,
) -> event::Status, ) -> event::Status,
) -> event::Status { ) -> event::Status {
let bounds = layout.bounds(); let bounds = layout.bounds();
@ -518,7 +521,20 @@ pub fn update<Message>(
_ => mouse::Cursor::Unavailable, _ => mouse::Cursor::Unavailable,
}; };
update_content(event.clone(), content, cursor, clipboard, shell) let translation = state.translation(direction, bounds, content_bounds);
update_content(
event.clone(),
content,
cursor,
clipboard,
shell,
&Rectangle {
y: bounds.y + translation.y,
x: bounds.x + translation.x,
..bounds
},
)
}; };
if let event::Status::Captured = event_status { if let event::Status::Captured = event_status {

View file

@ -187,6 +187,7 @@ where
_renderer: &Renderer, _renderer: &Renderer,
_clipboard: &mut dyn Clipboard, _clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>, shell: &mut Shell<'_, Message>,
_viewport: &Rectangle,
) -> event::Status { ) -> event::Status {
update( update(
event, event,

View file

@ -302,6 +302,7 @@ where
renderer: &Renderer, renderer: &Renderer,
clipboard: &mut dyn Clipboard, clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>, shell: &mut Shell<'_, Message>,
_viewport: &Rectangle,
) -> event::Status { ) -> event::Status {
update( update(
event, event,

View file

@ -207,6 +207,7 @@ where
_renderer: &Renderer, _renderer: &Renderer,
_clipboard: &mut dyn Clipboard, _clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>, shell: &mut Shell<'_, Message>,
_viewport: &Rectangle,
) -> event::Status { ) -> event::Status {
match event { match event {
Event::Mouse(mouse::Event::ButtonPressed(mouse::Button::Left)) Event::Mouse(mouse::Event::ButtonPressed(mouse::Button::Left))

View file

@ -147,6 +147,7 @@ where
renderer: &Renderer, renderer: &Renderer,
clipboard: &mut dyn Clipboard, clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>, shell: &mut Shell<'_, Message>,
viewport: &Rectangle,
) -> event::Status { ) -> event::Status {
let state = tree.state.downcast_mut::<State>(); let state = tree.state.downcast_mut::<State>();
@ -163,6 +164,7 @@ where
renderer, renderer,
clipboard, clipboard,
shell, shell,
viewport,
) )
} }

View file

@ -184,6 +184,7 @@ where
_renderer: &Renderer, _renderer: &Renderer,
_clipboard: &mut dyn Clipboard, _clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>, shell: &mut Shell<'_, Message>,
_viewport: &Rectangle,
) -> event::Status { ) -> event::Status {
update( update(
event, event,