From c407b4504cd5e7dcb04a8fd31ad0400c891fc3e1 Mon Sep 17 00:00:00 2001
From: Héctor Ramón Jiménez <hector0193@gmail.com>
Date: Mon, 27 Mar 2023 15:51:32 +0200
Subject: Introduce `is_mouse_over_scrollbar` to `StyleSheet::hovered` for
 `Scrollable`

---
 style/src/scrollable.rs | 32 ++++++++++++-------------
 style/src/theme.rs      | 63 ++++++++++++++++++++++++-------------------------
 2 files changed, 46 insertions(+), 49 deletions(-)

(limited to 'style/src')

diff --git a/style/src/scrollable.rs b/style/src/scrollable.rs
index f3c04235..64a91b69 100644
--- a/style/src/scrollable.rs
+++ b/style/src/scrollable.rs
@@ -37,17 +37,16 @@ pub trait StyleSheet {
     /// Produces the style of an active scrollbar.
     fn active(&self, style: &Self::Style) -> Scrollbar;
 
-    /// Produces the style of a hovered scrollbar.
-    fn hovered_scrollbar(&self, style: &Self::Style) -> Scrollbar;
+    /// Produces the style of a scrollbar when the scrollable is being hovered.
+    fn hovered(
+        &self,
+        style: &Self::Style,
+        is_mouse_over_scrollbar: bool,
+    ) -> Scrollbar;
 
     /// Produces the style of a scrollbar that is being dragged.
     fn dragging(&self, style: &Self::Style) -> Scrollbar {
-        self.hovered_scrollbar(style)
-    }
-
-    /// Produces the style of a scrollbar when mouse is over the scrollable area.
-    fn hovered(&self, style: &Self::Style) -> Scrollbar {
-        self.active(style)
+        self.hovered(style, true)
     }
 
     /// Produces the style of an active horizontal scrollbar.
@@ -55,18 +54,17 @@ pub trait StyleSheet {
         self.active(style)
     }
 
-    /// Produces the style of a hovered horizontal scrollbar.
-    fn hovered_scrollbar_horizontal(&self, style: &Self::Style) -> Scrollbar {
-        self.hovered_scrollbar(style)
+    /// Produces the style of a horizontal scrollbar when the scrollable is being hovered.
+    fn hovered_horizontal(
+        &self,
+        style: &Self::Style,
+        is_mouse_over_scrollbar: bool,
+    ) -> Scrollbar {
+        self.hovered(style, is_mouse_over_scrollbar)
     }
 
     /// Produces the style of a horizontal scrollbar that is being dragged.
     fn dragging_horizontal(&self, style: &Self::Style) -> Scrollbar {
-        self.hovered_scrollbar_horizontal(style)
-    }
-
-    /// Produces the style of a horizontal scrollbar when mouse is over the scrollable area.
-    fn hovered_horizontal(&self, style: &Self::Style) -> Scrollbar {
-        self.active_horizontal(style)
+        self.hovered(style, true)
     }
 }
diff --git a/style/src/theme.rs b/style/src/theme.rs
index 9a3105b5..0ebd82a4 100644
--- a/style/src/theme.rs
+++ b/style/src/theme.rs
@@ -906,42 +906,45 @@ impl scrollable::StyleSheet for Theme {
         }
     }
 
-    fn hovered_scrollbar(&self, style: &Self::Style) -> scrollable::Scrollbar {
+    fn hovered(
+        &self,
+        style: &Self::Style,
+        is_mouse_over_scrollbar: bool,
+    ) -> scrollable::Scrollbar {
         match style {
             Scrollable::Default => {
-                let palette = self.extended_palette();
+                if is_mouse_over_scrollbar {
+                    let palette = self.extended_palette();
 
-                scrollable::Scrollbar {
-                    background: palette.background.weak.color.into(),
-                    border_radius: 2.0,
-                    border_width: 0.0,
-                    border_color: Color::TRANSPARENT,
-                    scroller: scrollable::Scroller {
-                        color: palette.primary.strong.color,
+                    scrollable::Scrollbar {
+                        background: palette.background.weak.color.into(),
                         border_radius: 2.0,
                         border_width: 0.0,
                         border_color: Color::TRANSPARENT,
-                    },
+                        scroller: scrollable::Scroller {
+                            color: palette.primary.strong.color,
+                            border_radius: 2.0,
+                            border_width: 0.0,
+                            border_color: Color::TRANSPARENT,
+                        },
+                    }
+                } else {
+                    self.active(style)
                 }
             }
-            Scrollable::Custom(custom) => custom.hovered_scrollbar(self),
+            Scrollable::Custom(custom) => {
+                custom.hovered(self, is_mouse_over_scrollbar)
+            }
         }
     }
 
     fn dragging(&self, style: &Self::Style) -> scrollable::Scrollbar {
         match style {
-            Scrollable::Default => self.hovered_scrollbar(style),
+            Scrollable::Default => self.hovered(style, true),
             Scrollable::Custom(custom) => custom.dragging(self),
         }
     }
 
-    fn hovered(&self, style: &Self::Style) -> scrollable::Scrollbar {
-        match style {
-            Scrollable::Default => self.active(style),
-            Scrollable::Custom(custom) => custom.hovered(self),
-        }
-    }
-
     fn active_horizontal(&self, style: &Self::Style) -> scrollable::Scrollbar {
         match style {
             Scrollable::Default => self.active(style),
@@ -949,30 +952,26 @@ impl scrollable::StyleSheet for Theme {
         }
     }
 
-    fn hovered_scrollbar_horizontal(&self, style: &Self::Style) -> scrollable::Scrollbar {
-        match style {
-            Scrollable::Default => self.hovered_scrollbar(style),
-            Scrollable::Custom(custom) => custom.hovered_scrollbar_horizontal(self),
-        }
-    }
-
-    fn dragging_horizontal(
+    fn hovered_horizontal(
         &self,
         style: &Self::Style,
+        is_mouse_over_scrollbar: bool,
     ) -> scrollable::Scrollbar {
         match style {
-            Scrollable::Default => self.hovered_horizontal(style),
-            Scrollable::Custom(custom) => custom.dragging_horizontal(self),
+            Scrollable::Default => self.hovered(style, is_mouse_over_scrollbar),
+            Scrollable::Custom(custom) => {
+                custom.hovered_horizontal(self, is_mouse_over_scrollbar)
+            }
         }
     }
 
-    fn hovered_horizontal(
+    fn dragging_horizontal(
         &self,
         style: &Self::Style,
     ) -> scrollable::Scrollbar {
         match style {
-            Scrollable::Default => self.active_horizontal(style),
-            Scrollable::Custom(custom) => custom.hovered_horizontal(self),
+            Scrollable::Default => self.hovered_horizontal(style, true),
+            Scrollable::Custom(custom) => custom.dragging_horizontal(self),
         }
     }
 }
-- 
cgit