diff options
author | 2024-10-22 12:10:24 +0200 | |
---|---|---|
committer | 2024-11-05 23:52:57 +0100 | |
commit | f6c322f2f9aa5dd0ea151c702b2ba4754d68e550 (patch) | |
tree | 0ee111e53f2dd940e60bc965d04ac3b1e703463d | |
parent | 0691e617f31aab92cb5ddc4698f841357f4c14ec (diff) | |
download | iced-f6c322f2f9aa5dd0ea151c702b2ba4754d68e550.tar.gz iced-f6c322f2f9aa5dd0ea151c702b2ba4754d68e550.tar.bz2 iced-f6c322f2f9aa5dd0ea151c702b2ba4754d68e550.zip |
Implement `reactive-rendering` for `checkbox`
-rw-r--r-- | widget/src/checkbox.rs | 49 |
1 files changed, 35 insertions, 14 deletions
diff --git a/widget/src/checkbox.rs b/widget/src/checkbox.rs index 819f0d9d..e5dea3cc 100644 --- a/widget/src/checkbox.rs +++ b/widget/src/checkbox.rs @@ -40,6 +40,7 @@ use crate::core::theme::palette; use crate::core::touch; use crate::core::widget; use crate::core::widget::tree::{self, Tree}; +use crate::core::window; use crate::core::{ Background, Border, Clipboard, Color, Element, Layout, Length, Pixels, Rectangle, Shell, Size, Theme, Widget, @@ -100,6 +101,7 @@ pub struct Checkbox< font: Option<Renderer::Font>, icon: Icon<Renderer::Font>, class: Theme::Class<'a>, + last_status: Option<Status>, } impl<'a, Message, Theme, Renderer> Checkbox<'a, Message, Theme, Renderer> @@ -139,6 +141,7 @@ where shaping: text::Shaping::Basic, }, class: Theme::default(), + last_status: None, } } @@ -326,6 +329,31 @@ where _ => {} } + let current_status = { + let is_mouse_over = cursor.is_over(layout.bounds()); + let is_disabled = self.on_toggle.is_none(); + let is_checked = self.is_checked; + + if is_disabled { + Status::Disabled { is_checked } + } else if is_mouse_over { + Status::Hovered { is_checked } + } else { + Status::Active { is_checked } + } + }; + + if let Event::Window(window::Event::RedrawRequested(_now)) = event { + self.last_status = Some(current_status); + } else { + match self.last_status { + Some(status) if status != current_status => { + shell.request_redraw(window::RedrawRequest::NextFrame); + } + _ => {} + } + } + event::Status::Ignored } @@ -351,24 +379,17 @@ where theme: &Theme, defaults: &renderer::Style, layout: Layout<'_>, - cursor: mouse::Cursor, + _cursor: mouse::Cursor, viewport: &Rectangle, ) { - let is_mouse_over = cursor.is_over(layout.bounds()); - let is_disabled = self.on_toggle.is_none(); - let is_checked = self.is_checked; - let mut children = layout.children(); - let status = if is_disabled { - Status::Disabled { is_checked } - } else if is_mouse_over { - Status::Hovered { is_checked } - } else { - Status::Active { is_checked } - }; - - let style = theme.style(&self.class, status); + let style = theme.style( + &self.class, + self.last_status.unwrap_or(Status::Disabled { + is_checked: self.is_checked, + }), + ); { let layout = children.next().unwrap(); |