summaryrefslogtreecommitdiffstats
path: root/core/src
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón Jiménez <hector@hecrj.dev>2024-10-25 19:28:18 +0200
committerLibravatar Héctor Ramón Jiménez <hector@hecrj.dev>2024-11-05 23:52:58 +0100
commitdcc184b01b753dbecb500205391f6eaaa21c8683 (patch)
tree9f1854261c3b3805e28f524df65487c09c9729f7 /core/src
parent752403d70c851ece620c4007710062b158e8dec3 (diff)
downloadiced-dcc184b01b753dbecb500205391f6eaaa21c8683.tar.gz
iced-dcc184b01b753dbecb500205391f6eaaa21c8683.tar.bz2
iced-dcc184b01b753dbecb500205391f6eaaa21c8683.zip
Replace `event::Status` in `Widget::on_event` with `Shell::capture_event`
Diffstat (limited to 'core/src')
-rw-r--r--core/src/element.rs15
-rw-r--r--core/src/overlay.rs6
-rw-r--r--core/src/overlay/element.rs13
-rw-r--r--core/src/overlay/group.rs27
-rw-r--r--core/src/shell.rs23
-rw-r--r--core/src/widget.rs6
6 files changed, 49 insertions, 41 deletions
diff --git a/core/src/element.rs b/core/src/element.rs
index 6ebb8a15..8276b70c 100644
--- a/core/src/element.rs
+++ b/core/src/element.rs
@@ -1,4 +1,3 @@
-use crate::event::{self, Event};
use crate::layout;
use crate::mouse;
use crate::overlay;
@@ -6,8 +5,8 @@ use crate::renderer;
use crate::widget;
use crate::widget::tree::{self, Tree};
use crate::{
- Border, Clipboard, Color, Layout, Length, Rectangle, Shell, Size, Vector,
- Widget,
+ Border, Clipboard, Color, Event, Layout, Length, Rectangle, Shell, Size,
+ Vector, Widget,
};
use std::borrow::Borrow;
@@ -319,11 +318,11 @@ where
clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, B>,
viewport: &Rectangle,
- ) -> event::Status {
+ ) {
let mut local_messages = Vec::new();
let mut local_shell = Shell::new(&mut local_messages);
- let status = self.widget.on_event(
+ self.widget.on_event(
tree,
event,
layout,
@@ -335,8 +334,6 @@ where
);
shell.merge(local_shell, &self.mapper);
-
- status
}
fn draw(
@@ -457,10 +454,10 @@ where
clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>,
viewport: &Rectangle,
- ) -> event::Status {
+ ) {
self.element.widget.on_event(
state, event, layout, cursor, renderer, clipboard, shell, viewport,
- )
+ );
}
fn draw(
diff --git a/core/src/overlay.rs b/core/src/overlay.rs
index f09de831..e063bb94 100644
--- a/core/src/overlay.rs
+++ b/core/src/overlay.rs
@@ -5,13 +5,12 @@ mod group;
pub use element::Element;
pub use group::Group;
-use crate::event::{self, Event};
use crate::layout;
use crate::mouse;
use crate::renderer;
use crate::widget;
use crate::widget::Tree;
-use crate::{Clipboard, Layout, Point, Rectangle, Shell, Size, Vector};
+use crate::{Clipboard, Event, Layout, Point, Rectangle, Shell, Size, Vector};
/// An interactive component that can be displayed on top of other widgets.
pub trait Overlay<Message, Theme, Renderer>
@@ -65,8 +64,7 @@ where
_renderer: &Renderer,
_clipboard: &mut dyn Clipboard,
_shell: &mut Shell<'_, Message>,
- ) -> event::Status {
- event::Status::Ignored
+ ) {
}
/// Returns the current [`mouse::Interaction`] of the [`Overlay`].
diff --git a/core/src/overlay/element.rs b/core/src/overlay/element.rs
index 32e987a3..4a242213 100644
--- a/core/src/overlay/element.rs
+++ b/core/src/overlay/element.rs
@@ -1,11 +1,10 @@
pub use crate::Overlay;
-use crate::event::{self, Event};
use crate::layout;
use crate::mouse;
use crate::renderer;
use crate::widget;
-use crate::{Clipboard, Layout, Point, Rectangle, Shell, Size};
+use crate::{Clipboard, Event, Layout, Point, Rectangle, Shell, Size};
/// A generic [`Overlay`].
#[allow(missing_debug_implementations)]
@@ -58,9 +57,9 @@ where
renderer: &Renderer,
clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>,
- ) -> event::Status {
+ ) {
self.overlay
- .on_event(event, layout, cursor, renderer, clipboard, shell)
+ .on_event(event, layout, cursor, renderer, clipboard, shell);
}
/// Returns the current [`mouse::Interaction`] of the [`Element`].
@@ -157,11 +156,11 @@ where
renderer: &Renderer,
clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, B>,
- ) -> event::Status {
+ ) {
let mut local_messages = Vec::new();
let mut local_shell = Shell::new(&mut local_messages);
- let event_status = self.content.on_event(
+ self.content.on_event(
event,
layout,
cursor,
@@ -171,8 +170,6 @@ where
);
shell.merge(local_shell, self.mapper);
-
- event_status
}
fn mouse_interaction(
diff --git a/core/src/overlay/group.rs b/core/src/overlay/group.rs
index 6541d311..11ebd579 100644
--- a/core/src/overlay/group.rs
+++ b/core/src/overlay/group.rs
@@ -1,4 +1,3 @@
-use crate::event;
use crate::layout;
use crate::mouse;
use crate::overlay;
@@ -81,21 +80,17 @@ where
renderer: &Renderer,
clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>,
- ) -> event::Status {
- self.children
- .iter_mut()
- .zip(layout.children())
- .map(|(child, layout)| {
- child.on_event(
- event.clone(),
- layout,
- cursor,
- renderer,
- clipboard,
- shell,
- )
- })
- .fold(event::Status::Ignored, event::Status::merge)
+ ) {
+ for (child, layout) in self.children.iter_mut().zip(layout.children()) {
+ child.on_event(
+ event.clone(),
+ layout,
+ cursor,
+ renderer,
+ clipboard,
+ shell,
+ );
+ }
}
fn draw(
diff --git a/core/src/shell.rs b/core/src/shell.rs
index 7a92a2be..12ebbaa8 100644
--- a/core/src/shell.rs
+++ b/core/src/shell.rs
@@ -1,3 +1,4 @@
+use crate::event;
use crate::time::Instant;
use crate::window;
@@ -10,6 +11,7 @@ use crate::window;
#[derive(Debug)]
pub struct Shell<'a, Message> {
messages: &'a mut Vec<Message>,
+ event_status: event::Status,
redraw_request: Option<window::RedrawRequest>,
is_layout_invalid: bool,
are_widgets_invalid: bool,
@@ -20,6 +22,7 @@ impl<'a, Message> Shell<'a, Message> {
pub fn new(messages: &'a mut Vec<Message>) -> Self {
Self {
messages,
+ event_status: event::Status::Ignored,
redraw_request: None,
is_layout_invalid: false,
are_widgets_invalid: false,
@@ -36,6 +39,24 @@ impl<'a, Message> Shell<'a, Message> {
self.messages.push(message);
}
+ /// Marks the current event as captured. Prevents "event bubbling".
+ ///
+ /// A widget should capture an event when no ancestor should
+ /// handle it.
+ pub fn capture_event(&mut self) {
+ self.event_status = event::Status::Captured;
+ }
+
+ /// Returns the current [`event::Status`] of the [`Shell`].
+ pub fn event_status(&self) -> event::Status {
+ self.event_status
+ }
+
+ /// Returns whether the current event has been captured.
+ pub fn is_event_captured(&self) -> bool {
+ self.event_status == event::Status::Captured
+ }
+
/// Requests a new frame to be drawn as soon as possible.
pub fn request_redraw(&mut self) {
self.redraw_request = Some(window::RedrawRequest::NextFrame);
@@ -114,5 +135,7 @@ impl<'a, Message> Shell<'a, Message> {
self.are_widgets_invalid =
self.are_widgets_invalid || other.are_widgets_invalid;
+
+ self.event_status = self.event_status.merge(other.event_status);
}
}
diff --git a/core/src/widget.rs b/core/src/widget.rs
index 9cfff83d..bddf99cc 100644
--- a/core/src/widget.rs
+++ b/core/src/widget.rs
@@ -10,12 +10,11 @@ pub use operation::Operation;
pub use text::Text;
pub use tree::Tree;
-use crate::event::{self, Event};
use crate::layout::{self, Layout};
use crate::mouse;
use crate::overlay;
use crate::renderer;
-use crate::{Clipboard, Length, Rectangle, Shell, Size, Vector};
+use crate::{Clipboard, Event, Length, Rectangle, Shell, Size, Vector};
/// A component that displays information and allows interaction.
///
@@ -122,8 +121,7 @@ where
_clipboard: &mut dyn Clipboard,
_shell: &mut Shell<'_, Message>,
_viewport: &Rectangle,
- ) -> event::Status {
- event::Status::Ignored
+ ) {
}
/// Returns the current [`mouse::Interaction`] of the [`Widget`].