Added the ability to change checkbox icon

This commit is contained in:
Casper Storm 2023-02-16 14:13:04 +01:00
parent 0cb72f6971
commit 4fb0be1793
No known key found for this signature in database
GPG key ID: BABF49AA70C405C2
8 changed files with 123 additions and 9 deletions

View file

@ -0,0 +1,9 @@
[package]
name = "checkbox"
version = "0.1.0"
authors = ["Casper Rogild Storm<casper@rogildstorm.com>"]
edition = "2021"
publish = false
[dependencies]
iced = { path = "../.." }

View file

@ -0,0 +1,12 @@
## Checkbox
A box that can be checked.
The __[`main`]__ file contains all the code of the example.
You can run it with `cargo run`:
```
cargo run --package pick_list
```
[`main`]: src/main.rs

Binary file not shown.

View file

@ -0,0 +1,63 @@
use iced::widget::{checkbox, column, container};
use iced::{Element, Font, Length, Sandbox, Settings};
const ICON_FONT: Font = Font::External {
name: "Icons",
bytes: include_bytes!("../fonts/icons.ttf"),
};
pub fn main() -> iced::Result {
Example::run(Settings::default())
}
#[derive(Default)]
struct Example {
default_checkbox: bool,
custom_checkbox: bool,
}
#[derive(Debug, Clone, Copy)]
enum Message {
DefaultChecked(bool),
CustomChecked(bool),
}
impl Sandbox for Example {
type Message = Message;
fn new() -> Self {
Default::default()
}
fn title(&self) -> String {
String::from("Checkbox - Iced")
}
fn update(&mut self, message: Message) {
match message {
Message::DefaultChecked(value) => self.default_checkbox = value,
Message::CustomChecked(value) => self.custom_checkbox = value,
}
}
fn view(&self) -> Element<Message> {
let default_checkbox =
checkbox("Default", self.default_checkbox, Message::DefaultChecked);
let custom_checkbox =
checkbox("Custom", self.custom_checkbox, Message::CustomChecked)
.icon(checkbox::Icon {
font: ICON_FONT,
code_point: '\u{e901}',
size: None,
});
let content = column![default_checkbox, custom_checkbox].spacing(22);
container(content)
.width(Length::Fill)
.height(Length::Fill)
.center_x()
.center_y()
.into()
}
}

View file

@ -14,6 +14,17 @@ use crate::{
pub use iced_style::checkbox::{Appearance, StyleSheet};
/// The icon in a [`Checkbox`].
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Icon<Font> {
/// Font that will be used to display the `code_point`,
pub font: Font,
/// The unicode code point that will be used as the icon.
pub code_point: char,
/// Font size of the content.
pub size: Option<u16>,
}
/// A box that can be checked.
///
/// # Example
@ -45,6 +56,7 @@ where
spacing: u16,
text_size: Option<u16>,
font: Renderer::Font,
icon: Icon<Renderer::Font>,
style: <Renderer::Theme as StyleSheet>::Style,
}
@ -80,6 +92,11 @@ where
spacing: Self::DEFAULT_SPACING,
text_size: None,
font: Renderer::Font::default(),
icon: Icon {
font: Renderer::ICON_FONT,
code_point: Renderer::CHECKMARK_ICON,
size: None,
},
style: Default::default(),
}
}
@ -116,6 +133,12 @@ where
self
}
/// Sets the [`Icon`] of the [`Checkbox`].
pub fn icon(mut self, icon: Icon<Renderer::Font>) -> Self {
self.icon = icon;
self
}
/// Sets the style of the [`Checkbox`].
pub fn style(
mut self,
@ -243,17 +266,24 @@ where
custom_style.background,
);
let Icon {
font,
code_point,
size,
} = &self.icon;
let size = size.map(f32::from).unwrap_or(bounds.height * 0.7);
if self.is_checked {
renderer.fill_text(text::Text {
content: &Renderer::CHECKMARK_ICON.to_string(),
font: Renderer::ICON_FONT,
size: bounds.height * 0.7,
content: &code_point.to_string(),
font: font.clone(),
size,
bounds: Rectangle {
x: bounds.center_x(),
y: bounds.center_y(),
..bounds
},
color: custom_style.checkmark_color,
color: custom_style.icon_color,
horizontal_alignment: alignment::Horizontal::Center,
vertical_alignment: alignment::Vertical::Center,
});

View file

@ -31,7 +31,7 @@ pub mod button {
pub mod checkbox {
//! Show toggle controls using checkboxes.
pub use iced_native::widget::checkbox::{Appearance, StyleSheet};
pub use iced_native::widget::checkbox::{Appearance, Icon, StyleSheet};
/// A box that can be checked.
pub type Checkbox<'a, Message, Renderer = crate::Renderer> =

View file

@ -6,8 +6,8 @@ use iced_core::{Background, Color};
pub struct Appearance {
/// The [`Background`] of the checkbox.
pub background: Background,
/// The checkmark [`Color`] of the checkbox.
pub checkmark_color: Color,
/// The icon [`Color`] of the checkbox.
pub icon_color: Color,
/// The border radius of the checkbox.
pub border_radius: f32,
/// The border width of the checkbox.

View file

@ -320,7 +320,7 @@ impl checkbox::StyleSheet for Theme {
}
fn checkbox_appearance(
checkmark_color: Color,
icon_color: Color,
base: palette::Pair,
accent: palette::Pair,
is_checked: bool,
@ -331,7 +331,7 @@ fn checkbox_appearance(
} else {
base.color
}),
checkmark_color,
icon_color,
border_radius: 2.0,
border_width: 1.0,
border_color: accent.color,