diff options
author | 2022-05-14 01:47:55 +0200 | |
---|---|---|
committer | 2022-05-14 01:56:32 +0200 | |
commit | 664251f3f5c7b76f69a97683af1468094bba887f (patch) | |
tree | f43a495036ed117ce5dbb479c62652d872a6d273 /native/src/widget/button.rs | |
parent | 5de337f214530faab1d5fe47784afd7006c3f7f0 (diff) | |
download | iced-664251f3f5c7b76f69a97683af1468094bba887f.tar.gz iced-664251f3f5c7b76f69a97683af1468094bba887f.tar.bz2 iced-664251f3f5c7b76f69a97683af1468094bba887f.zip |
Draft first-class `Theme` support
RFC: https://github.com/iced-rs/rfcs/pull/6
Diffstat (limited to 'native/src/widget/button.rs')
-rw-r--r-- | native/src/widget/button.rs | 40 |
1 files changed, 27 insertions, 13 deletions
diff --git a/native/src/widget/button.rs b/native/src/widget/button.rs index b03d9f27..09c59cbe 100644 --- a/native/src/widget/button.rs +++ b/native/src/widget/button.rs @@ -55,20 +55,26 @@ pub use iced_style::button::{Style, StyleSheet}; /// } /// ``` #[allow(missing_debug_implementations)] -pub struct Button<'a, Message, Renderer> { +pub struct Button<'a, Message, Renderer> +where + Renderer: crate::Renderer, + Renderer::Theme: StyleSheet, +{ state: &'a mut State, content: Element<'a, Message, Renderer>, on_press: Option<Message>, width: Length, height: Length, padding: Padding, - style_sheet: Box<dyn StyleSheet + 'a>, + variant: <Renderer::Theme as StyleSheet>::Variant, } impl<'a, Message, Renderer> Button<'a, Message, Renderer> where Message: Clone, Renderer: crate::Renderer, + Renderer::Theme: StyleSheet, + <Renderer::Theme as StyleSheet>::Variant: Default, { /// Creates a new [`Button`] with some local [`State`] and the given /// content. @@ -83,7 +89,7 @@ where width: Length::Shrink, height: Length::Shrink, padding: Padding::new(5), - style_sheet: Default::default(), + variant: <Renderer::Theme as StyleSheet>::Variant::default(), } } @@ -112,12 +118,12 @@ where self } - /// Sets the style of the [`Button`]. + /// Sets the style variant of this [`Button`]. pub fn style( mut self, - style_sheet: impl Into<Box<dyn StyleSheet + 'a>>, + variant: <Renderer::Theme as StyleSheet>::Variant, ) -> Self { - self.style_sheet = style_sheet.into(); + self.variant = variant; self } } @@ -190,28 +196,29 @@ pub fn update<'a, Message: Clone>( } /// Draws a [`Button`]. -pub fn draw<'a, Renderer: crate::Renderer>( +pub fn draw<'a, Renderer: crate::Renderer, Variant>( renderer: &mut Renderer, bounds: Rectangle, cursor_position: Point, is_enabled: bool, - style_sheet: &dyn StyleSheet, + style_sheet: &dyn StyleSheet<Variant = Variant>, + variation: Variant, state: impl FnOnce() -> &'a State, ) -> Style { let is_mouse_over = bounds.contains(cursor_position); let styling = if !is_enabled { - style_sheet.disabled() + style_sheet.disabled(variation) } else if is_mouse_over { let state = state(); if state.is_pressed { - style_sheet.pressed() + style_sheet.pressed(variation) } else { - style_sheet.hovered() + style_sheet.hovered(variation) } } else { - style_sheet.active() + style_sheet.active(variation) }; if styling.background.is_some() || styling.border_width > 0.0 { @@ -287,6 +294,8 @@ impl<'a, Message, Renderer> Widget<Message, Renderer> where Message: Clone, Renderer: crate::Renderer, + Renderer::Theme: StyleSheet, + <Renderer::Theme as StyleSheet>::Variant: Copy, { fn width(&self) -> Length { self.width @@ -354,6 +363,7 @@ where fn draw( &self, renderer: &mut Renderer, + theme: &Renderer::Theme, _style: &renderer::Style, layout: Layout<'_>, cursor_position: Point, @@ -367,12 +377,14 @@ where bounds, cursor_position, self.on_press.is_some(), - self.style_sheet.as_ref(), + theme, + self.variant, || &self.state, ); self.content.draw( renderer, + theme, &renderer::Style { text_color: styling.text_color, }, @@ -397,6 +409,8 @@ impl<'a, Message, Renderer> From<Button<'a, Message, Renderer>> where Message: 'a + Clone, Renderer: 'a + crate::Renderer, + Renderer::Theme: StyleSheet, + <Renderer::Theme as StyleSheet>::Variant: Copy, { fn from( button: Button<'a, Message, Renderer>, |