From d79349efaf66b3f8594c125bac0a7b628cdfd4e7 Mon Sep 17 00:00:00 2001 From: W <150025636+git-f0x@users.noreply.github.com> Date: Wed, 7 Feb 2024 13:49:16 +0100 Subject: [PATCH] Capture mouse back/forward --- src/mouse_area.rs | 68 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/src/mouse_area.rs b/src/mouse_area.rs index 15e7673..848f919 100644 --- a/src/mouse_area.rs +++ b/src/mouse_area.rs @@ -19,6 +19,10 @@ pub struct MouseArea<'a, Message, Renderer> { on_right_release: Option) -> Message + 'a>>, on_middle_press: Option) -> Message + 'a>>, on_middle_release: Option) -> Message + 'a>>, + on_back_press: Option) -> Message + 'a>>, + on_back_release: Option) -> Message + 'a>>, + on_forward_press: Option) -> Message + 'a>>, + on_forward_release: Option) -> Message + 'a>>, } impl<'a, Message, Renderer> MouseArea<'a, Message, Renderer> { @@ -80,6 +84,34 @@ impl<'a, Message, Renderer> MouseArea<'a, Message, Renderer> { self.on_middle_release = Some(Box::new(message)); self } + + /// The message to emit on a back button press. + #[must_use] + pub fn on_back_press(mut self, message: impl Fn(Option) -> Message + 'a) -> Self { + self.on_back_press = Some(Box::new(message)); + self + } + + /// The message to emit on a back button release. + #[must_use] + pub fn on_back_release(mut self, message: impl Fn(Option) -> Message + 'a) -> Self { + self.on_back_release = Some(Box::new(message)); + self + } + + /// The message to emit on a forward button press. + #[must_use] + pub fn on_forward_press(mut self, message: impl Fn(Option) -> Message + 'a) -> Self { + self.on_forward_press = Some(Box::new(message)); + self + } + + /// The message to emit on a forward button release. + #[must_use] + pub fn on_forward_release(mut self, message: impl Fn(Option) -> Message + 'a) -> Self { + self.on_forward_release = Some(Box::new(message)); + self + } } /// Local state of the [`MouseArea`]. @@ -102,6 +134,10 @@ impl<'a, Message, Renderer> MouseArea<'a, Message, Renderer> { on_right_release: None, on_middle_press: None, on_middle_release: None, + on_back_press: None, + on_back_release: None, + on_forward_press: None, + on_forward_release: None, } } } @@ -329,6 +365,38 @@ fn update( } } + if let Some(message) = widget.on_back_press.as_ref() { + if let Event::Mouse(mouse::Event::ButtonPressed(mouse::Button::Back)) = event { + shell.publish(message(cursor.position_in(layout.bounds()))); + + return event::Status::Captured; + } + } + + if let Some(message) = widget.on_back_release.as_ref() { + if let Event::Mouse(mouse::Event::ButtonReleased(mouse::Button::Back)) = event { + shell.publish(message(cursor.position_in(layout.bounds()))); + + return event::Status::Captured; + } + } + + if let Some(message) = widget.on_forward_press.as_ref() { + if let Event::Mouse(mouse::Event::ButtonPressed(mouse::Button::Forward)) = event { + shell.publish(message(cursor.position_in(layout.bounds()))); + + return event::Status::Captured; + } + } + + if let Some(message) = widget.on_forward_release.as_ref() { + if let Event::Mouse(mouse::Event::ButtonReleased(mouse::Button::Forward)) = event { + shell.publish(message(cursor.position_in(layout.bounds()))); + + return event::Status::Captured; + } + } + if state.drag_initiated.is_none() && widget.on_drag.is_some() { if let Event::Mouse(mouse::Event::ButtonPressed(mouse::Button::Left)) | Event::Touch(touch::Event::FingerPressed { .. }) = event