From bcdfbf487198b59f4432545288914f139cdcaf9d Mon Sep 17 00:00:00 2001
From: vawvaw <valentin@wiedekind1.de>
Date: Sat, 20 Jan 2024 18:47:14 +0100
Subject: 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(+)

(limited to 'widget')

diff --git a/widget/src/mouse_area.rs b/widget/src/mouse_area.rs
index f82a75f4..a5967077 100644
--- a/widget/src/mouse_area.rs
+++ b/widget/src/mouse_area.rs
@@ -31,6 +31,7 @@ pub struct MouseArea<
     on_mouse_enter: Option<Message>,
     on_mouse_move: Option<Box<dyn Fn(Point) -> Message>>,
     on_mouse_exit: Option<Message>,
+    interaction: Option<mouse::Interaction>,
 }
 
 impl<'a, Message, Theme, Renderer> MouseArea<'a, Message, Theme, Renderer> {
@@ -99,6 +100,16 @@ impl<'a, Message, Theme, Renderer> MouseArea<'a, Message, Theme, Renderer> {
         self.on_mouse_exit = 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`].
@@ -123,6 +134,7 @@ impl<'a, Message, Theme, Renderer> MouseArea<'a, Message, Theme, Renderer> {
             on_mouse_enter: None,
             on_mouse_move: None,
             on_mouse_exit: None,
+            interaction: None,
         }
     }
 }
@@ -214,6 +226,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,
-- 
cgit