From bf4796bbeb7a8274bf8eb32cfac51ad26de51681 Mon Sep 17 00:00:00 2001 From: Siliwolf Date: Sat, 25 May 2024 18:13:34 -0300 Subject: Add `on_scroll` handler to `mouse_area` widget --- widget/src/mouse_area.rs | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/widget/src/mouse_area.rs b/widget/src/mouse_area.rs index 366335f4..d206322e 100644 --- a/widget/src/mouse_area.rs +++ b/widget/src/mouse_area.rs @@ -1,7 +1,5 @@ //! A container for capturing mouse events. -use iced_renderer::core::Point; - use crate::core::event::{self, Event}; use crate::core::layout; use crate::core::mouse; @@ -10,7 +8,8 @@ use crate::core::renderer; use crate::core::touch; use crate::core::widget::{tree, Operation, Tree}; use crate::core::{ - Clipboard, Element, Layout, Length, Rectangle, Shell, Size, Vector, Widget, + Clipboard, Element, Layout, Length, Point, Rectangle, Shell, Size, Vector, + Widget, }; /// Emit messages on mouse events. @@ -28,6 +27,7 @@ pub struct MouseArea< on_right_release: Option, on_middle_press: Option, on_middle_release: Option, + on_scroll: Option Message + 'a>>, on_enter: Option, on_move: Option Message>>, on_exit: Option, @@ -77,6 +77,16 @@ impl<'a, Message, Theme, Renderer> MouseArea<'a, Message, Theme, Renderer> { self } + /// The message to emit when scroll wheel is used + #[must_use] + pub fn on_scroll(mut self, on_scroll: F) -> Self + where + F: Fn(mouse::ScrollDelta) -> Message + 'static, + { + self.on_scroll = Some(Box::new(on_scroll)); + self + } + /// The message to emit when the mouse enters the area. #[must_use] pub fn on_enter(mut self, message: Message) -> Self { @@ -128,6 +138,7 @@ impl<'a, Message, Theme, Renderer> MouseArea<'a, Message, Theme, Renderer> { on_right_release: None, on_middle_press: None, on_middle_release: None, + on_scroll: None, on_enter: None, on_move: None, on_exit: None, @@ -397,5 +408,13 @@ fn update( } } + if let Some(on_scroll) = widget.on_scroll.as_ref() { + if let Event::Mouse(mouse::Event::WheelScrolled { delta }) = event { + shell.publish(on_scroll(delta)); + + return event::Status::Captured; + } + } + event::Status::Ignored } -- cgit From c711750be7ccca6a6852d0222169ebfea04ee864 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Tue, 10 Sep 2024 23:37:45 +0200 Subject: Use `cursor` changes to notify mouse events in `mouse_area` Fixes #2433. --- widget/src/mouse_area.rs | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/widget/src/mouse_area.rs b/widget/src/mouse_area.rs index d206322e..496afaa5 100644 --- a/widget/src/mouse_area.rs +++ b/widget/src/mouse_area.rs @@ -1,5 +1,4 @@ //! A container for capturing mouse events. - use crate::core::event::{self, Event}; use crate::core::layout; use crate::core::mouse; @@ -123,6 +122,8 @@ impl<'a, Message, Theme, Renderer> MouseArea<'a, Message, Theme, Renderer> { #[derive(Default)] struct State { is_hovered: bool, + bounds: Rectangle, + cursor_position: Option, } impl<'a, Message, Theme, Renderer> MouseArea<'a, Message, Theme, Renderer> { @@ -313,13 +314,17 @@ fn update( cursor: mouse::Cursor, shell: &mut Shell<'_, Message>, ) -> event::Status { - if let Event::Mouse(mouse::Event::CursorMoved { .. }) - | Event::Touch(touch::Event::FingerMoved { .. }) = event - { - let state: &mut State = tree.state.downcast_mut(); + let state: &mut State = tree.state.downcast_mut(); + let cursor_position = cursor.position(); + let bounds = layout.bounds(); + + if state.cursor_position != cursor_position && state.bounds != bounds { let was_hovered = state.is_hovered; + state.is_hovered = cursor.is_over(layout.bounds()); + state.cursor_position = cursor_position; + state.bounds = bounds; match ( widget.on_enter.as_ref(), -- cgit From 25e54a9acbd30799e994b6282700339e8aff7297 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Tue, 10 Sep 2024 23:41:07 +0200 Subject: Simplify signatures of `on_move` and `on_scroll` for `mouse_area` --- widget/src/mouse_area.rs | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/widget/src/mouse_area.rs b/widget/src/mouse_area.rs index 496afaa5..d255ac99 100644 --- a/widget/src/mouse_area.rs +++ b/widget/src/mouse_area.rs @@ -28,7 +28,7 @@ pub struct MouseArea< on_middle_release: Option, on_scroll: Option Message + 'a>>, on_enter: Option, - on_move: Option Message>>, + on_move: Option Message + 'a>>, on_exit: Option, interaction: Option, } @@ -78,10 +78,10 @@ impl<'a, Message, Theme, Renderer> MouseArea<'a, Message, Theme, Renderer> { /// The message to emit when scroll wheel is used #[must_use] - pub fn on_scroll(mut self, on_scroll: F) -> Self - where - F: Fn(mouse::ScrollDelta) -> Message + 'static, - { + pub fn on_scroll( + mut self, + on_scroll: impl Fn(mouse::ScrollDelta) -> Message + 'a, + ) -> Self { self.on_scroll = Some(Box::new(on_scroll)); self } @@ -95,11 +95,8 @@ impl<'a, Message, Theme, Renderer> MouseArea<'a, Message, Theme, Renderer> { /// The message to emit when the mouse moves in the area. #[must_use] - pub fn on_move(mut self, build_message: F) -> Self - where - F: Fn(Point) -> Message + 'static, - { - self.on_move = Some(Box::new(build_message)); + pub fn on_move(mut self, on_move: impl Fn(Point) -> Message + 'a) -> Self { + self.on_move = Some(Box::new(on_move)); self } -- cgit