diff options
| author | 2021-10-18 16:10:16 +0700 | |
|---|---|---|
| committer | 2021-10-18 16:10:16 +0700 | |
| commit | 7a876c8b2918ae90cedfd82d1881cf6406811eeb (patch) | |
| tree | 61f8a1dc8114f887019ab4819d048583b7a3ec2e /native | |
| parent | 3140cdc4babcefc444f1c1d30eb0f5f4ed1df054 (diff) | |
| download | iced-7a876c8b2918ae90cedfd82d1881cf6406811eeb.tar.gz iced-7a876c8b2918ae90cedfd82d1881cf6406811eeb.tar.bz2 iced-7a876c8b2918ae90cedfd82d1881cf6406811eeb.zip  | |
Implement `Widget::draw` for `Button`
Diffstat (limited to '')
| -rw-r--r-- | native/src/widget/button.rs | 67 | 
1 files changed, 60 insertions, 7 deletions
diff --git a/native/src/widget/button.rs b/native/src/widget/button.rs index 77148673..a05210fd 100644 --- a/native/src/widget/button.rs +++ b/native/src/widget/button.rs @@ -8,8 +8,8 @@ use crate::overlay;  use crate::renderer;  use crate::touch;  use crate::{ -    Clipboard, Element, Hasher, Layout, Length, Padding, Point, Rectangle, -    Widget, +    Background, Clipboard, Color, Element, Hasher, Layout, Length, Padding, +    Point, Rectangle, Vector, Widget,  };  use std::hash::Hash; @@ -66,7 +66,7 @@ pub struct Button<'a, Message, Renderer> {      min_width: u32,      min_height: u32,      padding: Padding, -    style: &'a dyn StyleSheet, +    style_sheet: &'a dyn StyleSheet,  }  impl<'a, Message, Renderer> Button<'a, Message, Renderer> @@ -89,7 +89,7 @@ where              min_width: 0,              min_height: 0,              padding: Padding::new(5), -            style: Default::default(), +            style_sheet: Default::default(),          }      } @@ -131,8 +131,8 @@ where      }      /// Sets the style of the [`Button`]. -    pub fn style(mut self, style: &'a dyn StyleSheet) -> Self { -        self.style = style; +    pub fn style(mut self, style_sheet: &'a dyn StyleSheet) -> Self { +        self.style_sheet = style_sheet;          self      }  } @@ -248,11 +248,64 @@ where      fn draw(          &self,          renderer: &mut Renderer, -        style: &renderer::Style, +        _style: &renderer::Style,          layout: Layout<'_>,          cursor_position: Point,          _viewport: &Rectangle,      ) { +        let bounds = layout.bounds(); +        let content_layout = layout.children().next().unwrap(); + +        let is_mouse_over = bounds.contains(cursor_position); + +        let styling = if self.on_press.is_none() { +            self.style_sheet.disabled() +        } else if is_mouse_over { +            if self.state.is_pressed { +                self.style_sheet.pressed() +            } else { +                self.style_sheet.hovered() +            } +        } else { +            self.style_sheet.active() +        }; + +        if styling.background.is_some() || styling.border_width > 0.0 { +            if styling.shadow_offset != Vector::default() { +                // TODO: Implement proper shadow support +                renderer.fill_rectangle(renderer::Quad { +                    bounds: Rectangle { +                        x: bounds.x + styling.shadow_offset.x, +                        y: bounds.y + styling.shadow_offset.y, +                        ..bounds +                    }, +                    background: Background::Color([0.0, 0.0, 0.0, 0.5].into()), +                    border_radius: styling.border_radius, +                    border_width: 0.0, +                    border_color: Color::TRANSPARENT, +                }); +            } + +            renderer.fill_rectangle(renderer::Quad { +                bounds, +                background: styling +                    .background +                    .unwrap_or(Background::Color(Color::TRANSPARENT)), +                border_radius: styling.border_radius, +                border_width: styling.border_width, +                border_color: styling.border_color, +            }); +        } + +        self.content.draw( +            renderer, +            &renderer::Style { +                text_color: styling.text_color, +            }, +            content_layout, +            cursor_position, +            &bounds, +        );      }      fn hash_layout(&self, state: &mut Hasher) {  | 
