From 624bc8cffb06fb938091b7232cac8b8c0eb61a45 Mon Sep 17 00:00:00 2001 From: vawvaw Date: Sat, 20 Jan 2024 18:47:14 +0100 Subject: [PATCH] Add `Interaction` overriding to `MouseArea` Add the ability to use a custom `iced::mouse::Interaction` for a `iced::widget::MouseArea`. --- widget/src/mouse_area.rs | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/widget/src/mouse_area.rs b/widget/src/mouse_area.rs index 87cac3a748..ad99bfaca1 100644 --- a/widget/src/mouse_area.rs +++ b/widget/src/mouse_area.rs @@ -21,6 +21,7 @@ pub struct MouseArea<'a, Message, Renderer> { on_right_release: Option, on_middle_press: Option, on_middle_release: Option, + interaction: Option, } impl<'a, Message, Renderer> MouseArea<'a, Message, Renderer> { @@ -65,6 +66,16 @@ impl<'a, Message, Renderer> MouseArea<'a, Message, Renderer> { self.on_middle_release = Some(message); self } + + /// The version of the cursor to use when hovering. + #[must_use] + pub fn mouse_interaction( + mut self, + interaction: mouse::Interaction, + ) -> Self { + self.interaction = Some(interaction); + self + } } /// Local state of the [`MouseArea`]. @@ -84,6 +95,7 @@ impl<'a, Message, Renderer> MouseArea<'a, Message, Renderer> { on_right_release: None, on_middle_press: None, on_middle_release: None, + interaction: None, } } } @@ -175,6 +187,14 @@ where viewport: &Rectangle, renderer: &Renderer, ) -> mouse::Interaction { + if !cursor.is_over(layout.bounds()) { + return mouse::Interaction::default(); + } + + if let Some(interaction) = self.interaction { + return interaction; + } + self.content.as_widget().mouse_interaction( &tree.children[0], layout,