Provide Renderer to Widget::on_event

This allows us to implement configurable event processing that adapts to
different rendering strategies.
This commit is contained in:
Héctor Ramón Jiménez 2019-10-29 03:34:21 +01:00
parent 6602c1517c
commit 9dabbf7885
11 changed files with 45 additions and 14 deletions

View file

@ -299,6 +299,7 @@ where
layout: Layout<'_>, layout: Layout<'_>,
cursor_position: Point, cursor_position: Point,
messages: &mut Vec<B>, messages: &mut Vec<B>,
renderer: &Renderer,
) { ) {
let mut original_messages = Vec::new(); let mut original_messages = Vec::new();
@ -307,6 +308,7 @@ where
layout, layout,
cursor_position, cursor_position,
&mut original_messages, &mut original_messages,
renderer,
); );
original_messages original_messages
@ -369,10 +371,15 @@ where
layout: Layout<'_>, layout: Layout<'_>,
cursor_position: Point, cursor_position: Point,
messages: &mut Vec<Message>, messages: &mut Vec<Message>,
renderer: &Renderer,
) { ) {
self.element self.element.widget.on_event(
.widget event,
.on_event(event, layout, cursor_position, messages) layout,
cursor_position,
messages,
renderer,
)
} }
fn draw( fn draw(

View file

@ -186,7 +186,7 @@ where
/// ); /// );
/// ///
/// // Update the user interface /// // Update the user interface
/// let messages = user_interface.update(events.drain(..)); /// let messages = user_interface.update(&renderer, events.drain(..));
/// ///
/// cache = user_interface.into_cache(); /// cache = user_interface.into_cache();
/// ///
@ -198,6 +198,7 @@ where
/// ``` /// ```
pub fn update( pub fn update(
&mut self, &mut self,
renderer: &Renderer,
events: impl Iterator<Item = Event>, events: impl Iterator<Item = Event>,
) -> Vec<Message> { ) -> Vec<Message> {
let mut messages = Vec::new(); let mut messages = Vec::new();
@ -212,6 +213,7 @@ where
Layout::new(&self.layout), Layout::new(&self.layout),
self.cursor_position, self.cursor_position,
&mut messages, &mut messages,
renderer,
); );
} }
@ -281,7 +283,7 @@ where
/// &mut renderer, /// &mut renderer,
/// ); /// );
/// ///
/// let messages = user_interface.update(events.drain(..)); /// let messages = user_interface.update(&renderer, events.drain(..));
/// ///
/// // Draw the user interface /// // Draw the user interface
/// let mouse_cursor = user_interface.draw(&mut renderer); /// let mouse_cursor = user_interface.draw(&mut renderer);

View file

@ -117,6 +117,7 @@ where
_layout: Layout<'_>, _layout: Layout<'_>,
_cursor_position: Point, _cursor_position: Point,
_messages: &mut Vec<Message>, _messages: &mut Vec<Message>,
_renderer: &Renderer,
) { ) {
} }
} }

View file

@ -31,6 +31,7 @@ where
layout: Layout<'_>, layout: Layout<'_>,
cursor_position: Point, cursor_position: Point,
messages: &mut Vec<Message>, messages: &mut Vec<Message>,
_renderer: &Renderer,
) { ) {
match event { match event {
Event::Mouse(mouse::Event::Input { Event::Mouse(mouse::Event::Input {

View file

@ -20,6 +20,7 @@ where
layout: Layout<'_>, layout: Layout<'_>,
cursor_position: Point, cursor_position: Point,
messages: &mut Vec<Message>, messages: &mut Vec<Message>,
_renderer: &Renderer,
) { ) {
match event { match event {
Event::Mouse(mouse::Event::Input { Event::Mouse(mouse::Event::Input {

View file

@ -55,12 +55,17 @@ where
layout: Layout<'_>, layout: Layout<'_>,
cursor_position: Point, cursor_position: Point,
messages: &mut Vec<Message>, messages: &mut Vec<Message>,
renderer: &Renderer,
) { ) {
self.children.iter_mut().zip(layout.children()).for_each( self.children.iter_mut().zip(layout.children()).for_each(
|(child, layout)| { |(child, layout)| {
child child.widget.on_event(
.widget event,
.on_event(event, layout, cursor_position, messages) layout,
cursor_position,
messages,
renderer,
)
}, },
); );
} }

View file

@ -21,6 +21,7 @@ where
layout: Layout<'_>, layout: Layout<'_>,
cursor_position: Point, cursor_position: Point,
messages: &mut Vec<Message>, messages: &mut Vec<Message>,
_renderer: &Renderer,
) { ) {
match event { match event {
Event::Mouse(mouse::Event::Input { Event::Mouse(mouse::Event::Input {

View file

@ -55,12 +55,17 @@ where
layout: Layout<'_>, layout: Layout<'_>,
cursor_position: Point, cursor_position: Point,
messages: &mut Vec<Message>, messages: &mut Vec<Message>,
renderer: &Renderer,
) { ) {
self.children.iter_mut().zip(layout.children()).for_each( self.children.iter_mut().zip(layout.children()).for_each(
|(child, layout)| { |(child, layout)| {
child child.widget.on_event(
.widget event,
.on_event(event, layout, cursor_position, messages) layout,
cursor_position,
messages,
renderer,
)
}, },
); );
} }

View file

@ -46,6 +46,7 @@ where
layout: Layout<'_>, layout: Layout<'_>,
cursor_position: Point, cursor_position: Point,
messages: &mut Vec<Message>, messages: &mut Vec<Message>,
renderer: &Renderer,
) { ) {
let bounds = layout.bounds(); let bounds = layout.bounds();
let is_mouse_over = bounds.contains(cursor_position); let is_mouse_over = bounds.contains(cursor_position);
@ -78,8 +79,13 @@ where
Point::new(cursor_position.x, -1.0) Point::new(cursor_position.x, -1.0)
}; };
self.content self.content.on_event(
.on_event(event, content, cursor_position, messages) event,
content,
cursor_position,
messages,
renderer,
)
} }
fn draw( fn draw(

View file

@ -25,6 +25,7 @@ where
layout: Layout<'_>, layout: Layout<'_>,
cursor_position: Point, cursor_position: Point,
messages: &mut Vec<Message>, messages: &mut Vec<Message>,
_renderer: &Renderer,
) { ) {
let mut change = || { let mut change = || {
let bounds = layout.bounds(); let bounds = layout.bounds();

View file

@ -68,7 +68,8 @@ pub trait Application {
&renderer, &renderer,
); );
let messages = user_interface.update(events.drain(..)); let messages =
user_interface.update(&renderer, events.drain(..));
if messages.is_empty() { if messages.is_empty() {
primitive = user_interface.draw(&mut renderer); primitive = user_interface.draw(&mut renderer);