From 833538ee7f3a60a839304762dfc29b0881d19094 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Thu, 7 Mar 2024 20:11:32 +0100 Subject: Leverage `DefaultStyle` traits instead of `Default` --- widget/src/overlay/menu.rs | 39 +++++++++++++++++++++++++-------------- 1 file changed, 25 insertions(+), 14 deletions(-) (limited to 'widget/src/overlay') diff --git a/widget/src/overlay/menu.rs b/widget/src/overlay/menu.rs index 2b9e0d03..3ed26b7d 100644 --- a/widget/src/overlay/menu.rs +++ b/widget/src/overlay/menu.rs @@ -58,7 +58,7 @@ where on_option_hovered: Option<&'a dyn Fn(T) -> Message>, ) -> Self where - Style: Default, + Theme: DefaultStyle, { Self::with_style( state, @@ -66,7 +66,7 @@ where hovered_option, on_selected, on_option_hovered, - Style::default(), + Theme::default_style(), ) } @@ -234,7 +234,7 @@ where text_line_height, text_shaping, padding, - style: style.menu, + style: style.list, }, scrollable::Direction::default(), style.scrollable, @@ -327,7 +327,7 @@ where ) { let bounds = layout.bounds(); - let appearance = (self.style.menu)(theme); + let appearance = (self.style.list)(theme); renderer.fill_quad( renderer::Quad { @@ -598,15 +598,23 @@ pub struct Appearance { pub selected_background: Background, } -/// The definiton of the default style of a [`Menu`]. +/// The style of the different parts of a [`Menu`]. #[derive(Debug, PartialEq, Eq)] pub struct Style { - /// The style of the [`Menu`]. - menu: fn(&Theme) -> Appearance, + /// The style of the list of the [`Menu`]. + list: fn(&Theme) -> Appearance, /// The style of the [`Scrollable`] of the [`Menu`]. scrollable: fn(&Theme, scrollable::Status) -> scrollable::Appearance, } +impl Style { + /// The default style of a [`Menu`] with the built-in [`Theme`]. + pub const DEFAULT: Self = Self { + list: default, + scrollable: scrollable::default, + }; +} + impl Clone for Style { fn clone(&self) -> Self { *self @@ -615,16 +623,19 @@ impl Clone for Style { impl Copy for Style {} -impl Default for Style { - fn default() -> Self { - Self { - menu: default, - scrollable: scrollable::default, - } +/// The default style of a [`Menu`]. +pub trait DefaultStyle: Sized { + /// Returns the default style of a [`Menu`]. + fn default_style() -> Style; +} + +impl DefaultStyle for Theme { + fn default_style() -> Style { + Style::::DEFAULT } } -/// The default style of a [`Menu`]. +/// The default style of the list of a [`Menu`]. pub fn default(theme: &Theme) -> Appearance { let palette = theme.extended_palette(); -- cgit