diff options
author | 2021-10-21 19:06:22 +0700 | |
---|---|---|
committer | 2021-10-21 19:06:22 +0700 | |
commit | 1397be38ca2caaf5c49ca51e164a28b63f9e461b (patch) | |
tree | f713eeb412cc05ee2f61275f8fcbfcef7608749d /native/src/widget/checkbox.rs | |
parent | 7c08c6bd138207b862933ee479752a4f1d18c4f2 (diff) | |
download | iced-1397be38ca2caaf5c49ca51e164a28b63f9e461b.tar.gz iced-1397be38ca2caaf5c49ca51e164a28b63f9e461b.tar.bz2 iced-1397be38ca2caaf5c49ca51e164a28b63f9e461b.zip |
Implement `Widget::draw` for `Checkbox`
Diffstat (limited to 'native/src/widget/checkbox.rs')
-rw-r--r-- | native/src/widget/checkbox.rs | 81 |
1 files changed, 58 insertions, 23 deletions
diff --git a/native/src/widget/checkbox.rs b/native/src/widget/checkbox.rs index c1408d73..babd74a5 100644 --- a/native/src/widget/checkbox.rs +++ b/native/src/widget/checkbox.rs @@ -1,10 +1,12 @@ //! Show toggle controls using checkboxes. use std::hash::Hash; +use crate::alignment; use crate::event::{self, Event}; use crate::layout; use crate::mouse; use crate::renderer; +use crate::text; use crate::touch; use crate::{ Alignment, Clipboard, Color, Element, Hasher, Layout, Length, Point, @@ -18,7 +20,7 @@ pub use iced_style::checkbox::{Style, StyleSheet}; /// # Example /// /// ``` -/// # type Checkbox<Message> = iced_native::Checkbox<Message, iced_native::renderer::Null>; +/// # type Checkbox<'a, Message> = iced_native::Checkbox<'a, Message, iced_native::renderer::Null>; /// # /// pub enum Message { /// CheckboxToggled(bool), @@ -192,28 +194,61 @@ where cursor_position: Point, _viewport: &Rectangle, ) { - // let bounds = layout.bounds(); - // let mut children = layout.children(); - - // let checkbox_layout = children.next().unwrap(); - // let label_layout = children.next().unwrap(); - // let checkbox_bounds = checkbox_layout.bounds(); - - // let label = text::Renderer::draw( - // renderer, - // defaults, - // label_layout.bounds(), - // &self.label, - // self.text_size.unwrap_or(renderer.default_size()), - // self.font, - // self.text_color, - // alignment::Horizontal::Left, - // alignment::Vertical::Center, - // ); - - // let is_mouse_over = bounds.contains(cursor_position); - - // TODO + let bounds = layout.bounds(); + let is_mouse_over = bounds.contains(cursor_position); + + let mut children = layout.children(); + + { + let layout = children.next().unwrap(); + let bounds = layout.bounds(); + + let style = if is_mouse_over { + self.style_sheet.hovered(self.is_checked) + } else { + self.style_sheet.active(self.is_checked) + }; + + renderer.fill_rectangle(renderer::Quad { + bounds, + background: style.background, + border_radius: style.border_radius, + border_width: style.border_width, + border_color: style.border_color, + }); + + if self.is_checked { + renderer.fill_text(renderer::text::Section { + content: &Renderer::CHECKMARK_ICON.to_string(), + font: Renderer::ICON_FONT, + size: bounds.height * 0.7, + bounds: Rectangle { + x: bounds.center_x(), + y: bounds.center_y(), + ..bounds + }, + color: style.checkmark_color, + horizontal_alignment: alignment::Horizontal::Center, + vertical_alignment: alignment::Vertical::Center, + }); + } + } + + { + let label_layout = children.next().unwrap(); + + text::draw( + renderer, + style, + label_layout, + &self.label, + self.font, + self.text_size, + self.text_color, + alignment::Horizontal::Left, + alignment::Vertical::Center, + ); + } } fn hash_layout(&self, state: &mut Hasher) { |