Make Widget::on_event return an event::Status

This commit is contained in:
Héctor Ramón Jiménez 2020-11-12 00:09:52 +01:00
parent 1db11ba69a
commit 3f968b8c87
20 changed files with 136 additions and 70 deletions

View File

@ -7,9 +7,11 @@
//! [`Canvas`]: struct.Canvas.html //! [`Canvas`]: struct.Canvas.html
//! [`Frame`]: struct.Frame.html //! [`Frame`]: struct.Frame.html
use crate::{Backend, Defaults, Primitive, Renderer}; use crate::{Backend, Defaults, Primitive, Renderer};
use iced_native::layout;
use iced_native::mouse;
use iced_native::{ use iced_native::{
layout, mouse, Clipboard, Element, Hasher, Layout, Length, Point, Clipboard, Element, Hasher, Layout, Length, Point, Rectangle, Size, Vector,
Rectangle, Size, Vector, Widget, Widget,
}; };
use std::hash::Hash; use std::hash::Hash;
use std::marker::PhantomData; use std::marker::PhantomData;
@ -166,7 +168,7 @@ where
messages: &mut Vec<Message>, messages: &mut Vec<Message>,
_renderer: &Renderer<B>, _renderer: &Renderer<B>,
_clipboard: Option<&dyn Clipboard>, _clipboard: Option<&dyn Clipboard>,
) { ) -> event::Status {
let bounds = layout.bounds(); let bounds = layout.bounds();
let canvas_event = match event { let canvas_event = match event {
@ -188,6 +190,8 @@ where
messages.push(message); messages.push(message);
} }
} }
event::Status::Ignored
} }
fn draw( fn draw(

View File

@ -1,6 +1,8 @@
use iced_native::keyboard; use iced_native::keyboard;
use iced_native::mouse; use iced_native::mouse;
pub use iced_native::event::Status;
/// A [`Canvas`] event. /// A [`Canvas`] event.
/// ///
/// [`Canvas`]: struct.Event.html /// [`Canvas`]: struct.Event.html

View File

@ -1,7 +1,8 @@
use crate::event::{self, Event};
use crate::layout; use crate::layout;
use crate::overlay; use crate::overlay;
use crate::{ use crate::{
Clipboard, Color, Event, Hasher, Layout, Length, Point, Rectangle, Widget, Clipboard, Color, Hasher, Layout, Length, Point, Rectangle, Widget,
}; };
/// A generic [`Widget`]. /// A generic [`Widget`].
@ -240,7 +241,7 @@ where
messages: &mut Vec<Message>, messages: &mut Vec<Message>,
renderer: &Renderer, renderer: &Renderer,
clipboard: Option<&dyn Clipboard>, clipboard: Option<&dyn Clipboard>,
) { ) -> event::Status {
self.widget.on_event( self.widget.on_event(
event, event,
layout, layout,
@ -248,7 +249,7 @@ where
messages, messages,
renderer, renderer,
clipboard, clipboard,
); )
} }
/// Draws the [`Element`] and its children using the given [`Layout`]. /// Draws the [`Element`] and its children using the given [`Layout`].
@ -335,10 +336,10 @@ where
messages: &mut Vec<B>, messages: &mut Vec<B>,
renderer: &Renderer, renderer: &Renderer,
clipboard: Option<&dyn Clipboard>, clipboard: Option<&dyn Clipboard>,
) { ) -> event::Status {
let mut original_messages = Vec::new(); let mut original_messages = Vec::new();
self.widget.on_event( let status = self.widget.on_event(
event, event,
layout, layout,
cursor_position, cursor_position,
@ -350,6 +351,8 @@ where
original_messages original_messages
.drain(..) .drain(..)
.for_each(|message| messages.push((self.mapper)(message))); .for_each(|message| messages.push((self.mapper)(message)));
status
} }
fn draw( fn draw(
@ -423,7 +426,7 @@ where
messages: &mut Vec<Message>, messages: &mut Vec<Message>,
renderer: &Renderer, renderer: &Renderer,
clipboard: Option<&dyn Clipboard>, clipboard: Option<&dyn Clipboard>,
) { ) -> event::Status {
self.element.widget.on_event( self.element.widget.on_event(
event, event,
layout, layout,

View File

@ -19,22 +19,19 @@ pub enum Event {
Window(window::Event), Window(window::Event),
} }
/// The status of an [`Event`] after being processed by a [`UserInterface`]. /// The status of an [`Event`] after being processed.
/// ///
/// [`Event`]: enum.Event.html /// [`Event`]: enum.Event.html
/// [`UserInterface`]: ../struct.UserInterface.html /// [`UserInterface`]: ../struct.UserInterface.html
#[derive(Debug, Clone, Copy, PartialEq, Eq)] #[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Status { pub enum Status {
/// The [`Event`] was _NOT_ handled by any widget in the [`UserInterface`]. /// The [`Event`] was _NOT_ handled by any widget.
/// ///
/// [`Event`]: enum.Event.html /// [`Event`]: enum.Event.html
/// [`UserInterface`]: ../struct.UserInterface.html
Ignored, Ignored,
/// The [`Event`] was handled and processed by a widget in the /// The [`Event`] was handled and processed by a widget.
/// [`UserInterface`].
/// ///
/// [`Event`]: enum.Event.html /// [`Event`]: enum.Event.html
/// [`UserInterface`]: ../struct.UserInterface.html
Captured, Captured,
} }

View File

@ -1,8 +1,14 @@
//! Build and show dropdown menus. //! Build and show dropdown menus.
use crate::container;
use crate::event::{self, Event};
use crate::layout;
use crate::mouse;
use crate::overlay;
use crate::scrollable;
use crate::text;
use crate::{ use crate::{
container, layout, mouse, overlay, scrollable, text, Clipboard, Container, Clipboard, Container, Element, Hasher, Layout, Length, Point, Rectangle,
Element, Event, Hasher, Layout, Length, Point, Rectangle, Scrollable, Size, Scrollable, Size, Vector, Widget,
Vector, Widget,
}; };
/// A list of selectable options. /// A list of selectable options.
@ -236,7 +242,7 @@ where
renderer: &Renderer, renderer: &Renderer,
clipboard: Option<&dyn Clipboard>, clipboard: Option<&dyn Clipboard>,
) { ) {
self.container.on_event( let _ = self.container.on_event(
event.clone(), event.clone(),
layout, layout,
cursor_position, cursor_position,
@ -336,7 +342,7 @@ where
_messages: &mut Vec<Message>, _messages: &mut Vec<Message>,
renderer: &Renderer, renderer: &Renderer,
_clipboard: Option<&dyn Clipboard>, _clipboard: Option<&dyn Clipboard>,
) { ) -> event::Status {
match event { match event {
Event::Mouse(mouse::Event::ButtonPressed(mouse::Button::Left)) => { Event::Mouse(mouse::Event::ButtonPressed(mouse::Button::Left)) => {
let bounds = layout.bounds(); let bounds = layout.bounds();
@ -364,6 +370,8 @@ where
} }
_ => {} _ => {}
} }
event::Status::Ignored
} }
fn draw( fn draw(

View File

@ -242,7 +242,7 @@ where
}; };
for event in events { for event in events {
self.root.widget.on_event( let _ = self.root.widget.on_event(
event.clone(), event.clone(),
Layout::new(&self.base.layout), Layout::new(&self.base.layout),
base_cursor, base_cursor,

View File

@ -73,9 +73,10 @@ pub use text::Text;
#[doc(no_inline)] #[doc(no_inline)]
pub use text_input::TextInput; pub use text_input::TextInput;
use crate::{ use crate::event::{self, Event};
layout, overlay, Clipboard, Event, Hasher, Layout, Length, Point, Rectangle, use crate::layout;
}; use crate::overlay;
use crate::{Clipboard, Hasher, Layout, Length, Point, Rectangle};
/// A component that displays information and allows interaction. /// A component that displays information and allows interaction.
/// ///
@ -182,7 +183,8 @@ where
_messages: &mut Vec<Message>, _messages: &mut Vec<Message>,
_renderer: &Renderer, _renderer: &Renderer,
_clipboard: Option<&dyn Clipboard>, _clipboard: Option<&dyn Clipboard>,
) { ) -> event::Status {
event::Status::Ignored
} }
/// Returns the overlay of the [`Element`], if there is any. /// Returns the overlay of the [`Element`], if there is any.

View File

@ -4,9 +4,11 @@
//! //!
//! [`Button`]: struct.Button.html //! [`Button`]: struct.Button.html
//! [`State`]: struct.State.html //! [`State`]: struct.State.html
use crate::event::{self, Event};
use crate::layout;
use crate::mouse;
use crate::{ use crate::{
layout, mouse, Clipboard, Element, Event, Hasher, Layout, Length, Point, Clipboard, Element, Hasher, Layout, Length, Point, Rectangle, Widget,
Rectangle, Widget,
}; };
use std::hash::Hash; use std::hash::Hash;
@ -184,7 +186,7 @@ where
messages: &mut Vec<Message>, messages: &mut Vec<Message>,
_renderer: &Renderer, _renderer: &Renderer,
_clipboard: Option<&dyn Clipboard>, _clipboard: Option<&dyn Clipboard>,
) { ) -> event::Status {
match event { match event {
Event::Mouse(mouse::Event::ButtonPressed(mouse::Button::Left)) => { Event::Mouse(mouse::Event::ButtonPressed(mouse::Button::Left)) => {
if self.on_press.is_some() { if self.on_press.is_some() {
@ -209,6 +211,8 @@ where
} }
_ => {} _ => {}
} }
event::Status::Ignored
} }
fn draw( fn draw(

View File

@ -1,10 +1,14 @@
//! Show toggle controls using checkboxes. //! Show toggle controls using checkboxes.
use std::hash::Hash; use std::hash::Hash;
use crate::event::{self, Event};
use crate::layout;
use crate::mouse;
use crate::row;
use crate::text;
use crate::{ use crate::{
layout, mouse, row, text, Align, Clipboard, Element, Event, Hasher, Align, Clipboard, Element, Hasher, HorizontalAlignment, Layout, Length,
HorizontalAlignment, Layout, Length, Point, Rectangle, Row, Text, Point, Rectangle, Row, Text, VerticalAlignment, Widget,
VerticalAlignment, Widget,
}; };
/// A box that can be checked. /// A box that can be checked.
@ -161,7 +165,7 @@ where
messages: &mut Vec<Message>, messages: &mut Vec<Message>,
_renderer: &Renderer, _renderer: &Renderer,
_clipboard: Option<&dyn Clipboard>, _clipboard: Option<&dyn Clipboard>,
) { ) -> event::Status {
match event { match event {
Event::Mouse(mouse::Event::ButtonPressed(mouse::Button::Left)) => { Event::Mouse(mouse::Event::ButtonPressed(mouse::Button::Left)) => {
let mouse_over = layout.bounds().contains(cursor_position); let mouse_over = layout.bounds().contains(cursor_position);
@ -172,6 +176,8 @@ where
} }
_ => {} _ => {}
} }
event::Status::Ignored
} }
fn draw( fn draw(

View File

@ -1,11 +1,11 @@
//! Distribute content vertically. //! Distribute content vertically.
use std::hash::Hash; use std::hash::Hash;
use crate::event::{self, Event};
use crate::layout; use crate::layout;
use crate::overlay; use crate::overlay;
use crate::{ use crate::{
Align, Clipboard, Element, Event, Hasher, Layout, Length, Point, Rectangle, Align, Clipboard, Element, Hasher, Layout, Length, Point, Rectangle, Widget,
Widget,
}; };
use std::u32; use std::u32;
@ -162,19 +162,21 @@ where
messages: &mut Vec<Message>, messages: &mut Vec<Message>,
renderer: &Renderer, renderer: &Renderer,
clipboard: Option<&dyn Clipboard>, clipboard: Option<&dyn Clipboard>,
) { ) -> event::Status {
self.children.iter_mut().zip(layout.children()).for_each( self.children.iter_mut().zip(layout.children()).for_each(
|(child, layout)| { |(child, layout)| {
child.widget.on_event( let _ = child.widget.on_event(
event.clone(), event.clone(),
layout, layout,
cursor_position, cursor_position,
messages, messages,
renderer, renderer,
clipboard, clipboard,
) );
}, },
); );
event::Status::Ignored
} }
fn draw( fn draw(

View File

@ -1,9 +1,11 @@
//! Decorate content and apply alignment. //! Decorate content and apply alignment.
use std::hash::Hash; use std::hash::Hash;
use crate::event::{self, Event};
use crate::layout;
use crate::overlay;
use crate::{ use crate::{
layout, overlay, Align, Clipboard, Element, Event, Hasher, Layout, Length, Align, Clipboard, Element, Hasher, Layout, Length, Point, Rectangle, Widget,
Point, Rectangle, Widget,
}; };
use std::u32; use std::u32;
@ -174,7 +176,7 @@ where
messages: &mut Vec<Message>, messages: &mut Vec<Message>,
renderer: &Renderer, renderer: &Renderer,
clipboard: Option<&dyn Clipboard>, clipboard: Option<&dyn Clipboard>,
) { ) -> event::Status {
self.content.widget.on_event( self.content.widget.on_event(
event, event,
layout.children().next().unwrap(), layout.children().next().unwrap(),

View File

@ -28,9 +28,16 @@ pub use split::Split;
pub use state::{Focus, State}; pub use state::{Focus, State};
pub use title_bar::TitleBar; pub use title_bar::TitleBar;
use crate::container;
use crate::event::{self, Event};
use crate::layout;
use crate::mouse;
use crate::overlay;
use crate::row;
use crate::text;
use crate::{ use crate::{
container, layout, mouse, overlay, row, text, Clipboard, Element, Event, Clipboard, Element, Hasher, Layout, Length, Point, Rectangle, Size, Vector,
Hasher, Layout, Length, Point, Rectangle, Size, Vector, Widget, Widget,
}; };
/// A collection of panes distributed using either vertical or horizontal splits /// A collection of panes distributed using either vertical or horizontal splits
@ -386,7 +393,7 @@ where
messages: &mut Vec<Message>, messages: &mut Vec<Message>,
renderer: &Renderer, renderer: &Renderer,
clipboard: Option<&dyn Clipboard>, clipboard: Option<&dyn Clipboard>,
) { ) -> event::Status {
match event { match event {
Event::Mouse(mouse_event) => match mouse_event { Event::Mouse(mouse_event) => match mouse_event {
mouse::Event::ButtonPressed(mouse::Button::Left) => { mouse::Event::ButtonPressed(mouse::Button::Left) => {
@ -484,6 +491,8 @@ where
); );
} }
} }
event::Status::Ignored
} }
fn draw( fn draw(

View File

@ -172,7 +172,7 @@ where
layout layout
}; };
self.body.on_event( let _ = self.body.on_event(
event, event,
body_layout, body_layout,
cursor_position, cursor_position,

View File

@ -254,7 +254,7 @@ where
let _ = children.next(); let _ = children.next();
let controls_layout = children.next().unwrap(); let controls_layout = children.next().unwrap();
controls.on_event( let _ = controls.on_event(
event, event,
controls_layout, controls_layout,
cursor_position, cursor_position,

View File

@ -1,9 +1,13 @@
//! Display a dropdown list of selectable values. //! Display a dropdown list of selectable values.
use crate::event::{self, Event};
use crate::layout;
use crate::mouse;
use crate::overlay;
use crate::overlay::menu::{self, Menu};
use crate::scrollable;
use crate::text;
use crate::{ use crate::{
layout, mouse, overlay, Clipboard, Element, Hasher, Layout, Length, Point, Rectangle, Size, Widget,
overlay::menu::{self, Menu},
scrollable, text, Clipboard, Element, Event, Hasher, Layout, Length, Point,
Rectangle, Size, Widget,
}; };
use std::borrow::Cow; use std::borrow::Cow;
@ -223,7 +227,7 @@ where
messages: &mut Vec<Message>, messages: &mut Vec<Message>,
_renderer: &Renderer, _renderer: &Renderer,
_clipboard: Option<&dyn Clipboard>, _clipboard: Option<&dyn Clipboard>,
) { ) -> event::Status {
match event { match event {
Event::Mouse(mouse::Event::ButtonPressed(mouse::Button::Left)) => { Event::Mouse(mouse::Event::ButtonPressed(mouse::Button::Left)) => {
if *self.is_open { if *self.is_open {
@ -248,6 +252,8 @@ where
} }
_ => {} _ => {}
} }
event::Status::Ignored
} }
fn draw( fn draw(

View File

@ -1,8 +1,12 @@
//! Create choices using radio buttons. //! Create choices using radio buttons.
use crate::event::{self, Event};
use crate::layout;
use crate::mouse;
use crate::row;
use crate::text;
use crate::{ use crate::{
layout, mouse, row, text, Align, Clipboard, Element, Event, Hasher, Align, Clipboard, Element, Hasher, HorizontalAlignment, Layout, Length,
HorizontalAlignment, Layout, Length, Point, Rectangle, Row, Text, Point, Rectangle, Row, Text, VerticalAlignment, Widget,
VerticalAlignment, Widget,
}; };
use std::hash::Hash; use std::hash::Hash;
@ -166,7 +170,7 @@ where
messages: &mut Vec<Message>, messages: &mut Vec<Message>,
_renderer: &Renderer, _renderer: &Renderer,
_clipboard: Option<&dyn Clipboard>, _clipboard: Option<&dyn Clipboard>,
) { ) -> event::Status {
match event { match event {
Event::Mouse(mouse::Event::ButtonPressed(mouse::Button::Left)) => { Event::Mouse(mouse::Event::ButtonPressed(mouse::Button::Left)) => {
if layout.bounds().contains(cursor_position) { if layout.bounds().contains(cursor_position) {
@ -175,6 +179,8 @@ where
} }
_ => {} _ => {}
} }
event::Status::Ignored
} }
fn draw( fn draw(

View File

@ -1,9 +1,9 @@
//! Distribute content horizontally. //! Distribute content horizontally.
use crate::event::{self, Event};
use crate::layout; use crate::layout;
use crate::overlay; use crate::overlay;
use crate::{ use crate::{
Align, Clipboard, Element, Event, Hasher, Layout, Length, Point, Rectangle, Align, Clipboard, Element, Hasher, Layout, Length, Point, Rectangle, Widget,
Widget,
}; };
use std::hash::Hash; use std::hash::Hash;
@ -162,19 +162,21 @@ where
messages: &mut Vec<Message>, messages: &mut Vec<Message>,
renderer: &Renderer, renderer: &Renderer,
clipboard: Option<&dyn Clipboard>, clipboard: Option<&dyn Clipboard>,
) { ) -> event::Status {
self.children.iter_mut().zip(layout.children()).for_each( self.children.iter_mut().zip(layout.children()).for_each(
|(child, layout)| { |(child, layout)| {
child.widget.on_event( let _ = child.widget.on_event(
event.clone(), event.clone(),
layout, layout,
cursor_position, cursor_position,
messages, messages,
renderer, renderer,
clipboard, clipboard,
) );
}, },
); );
event::Status::Ignored
} }
fn draw( fn draw(

View File

@ -1,7 +1,12 @@
//! Navigate an endless amount of content with a scrollbar. //! Navigate an endless amount of content with a scrollbar.
use crate::column;
use crate::event::{self, Event};
use crate::layout;
use crate::mouse;
use crate::overlay;
use crate::{ use crate::{
column, layout, mouse, overlay, Align, Clipboard, Column, Element, Event, Align, Clipboard, Column, Element, Hasher, Layout, Length, Point,
Hasher, Layout, Length, Point, Rectangle, Size, Vector, Widget, Rectangle, Size, Vector, Widget,
}; };
use std::{f32, hash::Hash, u32}; use std::{f32, hash::Hash, u32};
@ -184,7 +189,7 @@ where
messages: &mut Vec<Message>, messages: &mut Vec<Message>,
renderer: &Renderer, renderer: &Renderer,
clipboard: Option<&dyn Clipboard>, clipboard: Option<&dyn Clipboard>,
) { ) -> event::Status {
let bounds = layout.bounds(); let bounds = layout.bounds();
let is_mouse_over = bounds.contains(cursor_position); let is_mouse_over = bounds.contains(cursor_position);

View File

@ -4,9 +4,11 @@
//! //!
//! [`Slider`]: struct.Slider.html //! [`Slider`]: struct.Slider.html
//! [`State`]: struct.State.html //! [`State`]: struct.State.html
use crate::event::{self, Event};
use crate::layout;
use crate::mouse;
use crate::{ use crate::{
layout, mouse, Clipboard, Element, Event, Hasher, Layout, Length, Point, Clipboard, Element, Hasher, Layout, Length, Point, Rectangle, Size, Widget,
Rectangle, Size, Widget,
}; };
use std::{hash::Hash, ops::RangeInclusive}; use std::{hash::Hash, ops::RangeInclusive};
@ -202,7 +204,7 @@ where
messages: &mut Vec<Message>, messages: &mut Vec<Message>,
_renderer: &Renderer, _renderer: &Renderer,
_clipboard: Option<&dyn Clipboard>, _clipboard: Option<&dyn Clipboard>,
) { ) -> event::Status {
let mut change = || { let mut change = || {
let bounds = layout.bounds(); let bounds = layout.bounds();
if cursor_position.x <= bounds.x { if cursor_position.x <= bounds.x {
@ -251,6 +253,8 @@ where
}, },
_ => {} _ => {}
} }
event::Status::Ignored
} }
fn draw( fn draw(

View File

@ -14,11 +14,13 @@ pub use value::Value;
use editor::Editor; use editor::Editor;
use crate::event::{self, Event};
use crate::keyboard;
use crate::layout;
use crate::mouse::{self, click};
use crate::text;
use crate::{ use crate::{
keyboard, layout, Clipboard, Element, Hasher, Layout, Length, Point, Rectangle, Size, Widget,
mouse::{self, click},
text, Clipboard, Element, Event, Hasher, Layout, Length, Point, Rectangle,
Size, Widget,
}; };
use std::u32; use std::u32;
@ -218,7 +220,7 @@ where
messages: &mut Vec<Message>, messages: &mut Vec<Message>,
renderer: &Renderer, renderer: &Renderer,
clipboard: Option<&dyn Clipboard>, clipboard: Option<&dyn Clipboard>,
) { ) -> event::Status {
match event { match event {
Event::Mouse(mouse::Event::ButtonPressed(mouse::Button::Left)) => { Event::Mouse(mouse::Event::ButtonPressed(mouse::Button::Left)) => {
let is_clicked = layout.bounds().contains(cursor_position); let is_clicked = layout.bounds().contains(cursor_position);
@ -489,6 +491,8 @@ where
}, },
_ => {} _ => {}
} }
event::Status::Ignored
} }
fn draw( fn draw(