Implement Checkbox in iced_pure

This commit is contained in:
Héctor Ramón Jiménez 2022-02-12 14:26:17 +07:00
parent dee3dba632
commit 178914ec23
No known key found for this signature in database
GPG key ID: 140CC052C94F138E
3 changed files with 97 additions and 2 deletions

View file

@ -36,7 +36,7 @@ pub use iced_style::checkbox::{Style, StyleSheet};
#[allow(missing_debug_implementations)]
pub struct Checkbox<'a, Message, Renderer: text::Renderer> {
is_checked: bool,
on_toggle: Box<dyn Fn(bool) -> Message>,
on_toggle: Box<dyn Fn(bool) -> Message + 'a>,
label: String,
width: Length,
size: u16,
@ -63,7 +63,7 @@ impl<'a, Message, Renderer: text::Renderer> Checkbox<'a, Message, Renderer> {
/// `Message`.
pub fn new<F>(is_checked: bool, label: impl Into<String>, f: F) -> Self
where
F: 'static + Fn(bool) -> Message,
F: 'a + Fn(bool) -> Message,
{
Checkbox {
is_checked,

View file

@ -1,4 +1,5 @@
mod button;
mod checkbox;
mod column;
mod container;
mod element;
@ -7,6 +8,7 @@ mod text;
mod tree;
pub use button::Button;
pub use checkbox::Checkbox;
pub use column::Column;
pub use container::Container;
pub use element::Element;
@ -105,3 +107,14 @@ where
{
Text::new(text)
}
pub fn checkbox<'a, Message, Renderer>(
label: impl Into<String>,
is_checked: bool,
f: impl Fn(bool) -> Message + 'a,
) -> Checkbox<'a, Message, Renderer>
where
Renderer: iced_native::text::Renderer,
{
Checkbox::new(is_checked, label, f)
}

View file

@ -0,0 +1,82 @@
use crate::{Element, Tree, Widget};
use iced_native::layout::{self, Layout};
use iced_native::renderer;
use iced_native::text;
use iced_native::{Hasher, Length, Point, Rectangle};
use std::any::{self, Any};
pub use iced_native::widget::Checkbox;
impl<'a, Message, Renderer> Widget<Message, Renderer>
for Checkbox<'a, Message, Renderer>
where
Renderer: text::Renderer,
{
fn tag(&self) -> any::TypeId {
any::TypeId::of::<()>()
}
fn state(&self) -> Box<dyn Any> {
Box::new(())
}
fn children(&self) -> &[Element<Message, Renderer>] {
&[]
}
fn width(&self) -> Length {
<Self as iced_native::Widget<Message, Renderer>>::width(self)
}
fn height(&self) -> Length {
<Self as iced_native::Widget<Message, Renderer>>::height(self)
}
fn layout(
&self,
renderer: &Renderer,
limits: &layout::Limits,
) -> layout::Node {
<Self as iced_native::Widget<Message, Renderer>>::layout(
self, renderer, limits,
)
}
fn draw(
&self,
_tree: &Tree,
renderer: &mut Renderer,
style: &renderer::Style,
layout: Layout<'_>,
cursor_position: Point,
viewport: &Rectangle,
) {
<Self as iced_native::Widget<Message, Renderer>>::draw(
self,
renderer,
style,
layout,
cursor_position,
viewport,
)
}
fn hash_layout(&self, state: &mut Hasher) {
<Self as iced_native::Widget<Message, Renderer>>::hash_layout(
self, state,
)
}
}
impl<'a, Message, Renderer> Into<Element<'a, Message, Renderer>>
for Checkbox<'a, Message, Renderer>
where
Message: 'a,
Renderer: text::Renderer + 'a,
{
fn into(self) -> Element<'a, Message, Renderer> {
Element::new(self)
}
}