diff options
Diffstat (limited to '')
-rw-r--r-- | examples/checkbox/Cargo.toml | 9 | ||||
-rw-r--r-- | examples/checkbox/README.md | 12 | ||||
-rw-r--r-- | examples/checkbox/fonts/icons.ttf | bin | 0 -> 1272 bytes | |||
-rw-r--r-- | examples/checkbox/src/main.rs | 63 | ||||
-rw-r--r-- | native/src/widget/checkbox.rs | 38 | ||||
-rw-r--r-- | src/widget.rs | 2 | ||||
-rw-r--r-- | style/src/checkbox.rs | 4 | ||||
-rw-r--r-- | style/src/theme.rs | 4 |
8 files changed, 123 insertions, 9 deletions
diff --git a/examples/checkbox/Cargo.toml b/examples/checkbox/Cargo.toml new file mode 100644 index 00000000..dde8f910 --- /dev/null +++ b/examples/checkbox/Cargo.toml @@ -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 = "../.." } diff --git a/examples/checkbox/README.md b/examples/checkbox/README.md new file mode 100644 index 00000000..b7f85684 --- /dev/null +++ b/examples/checkbox/README.md @@ -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 diff --git a/examples/checkbox/fonts/icons.ttf b/examples/checkbox/fonts/icons.ttf Binary files differnew file mode 100644 index 00000000..a2046844 --- /dev/null +++ b/examples/checkbox/fonts/icons.ttf diff --git a/examples/checkbox/src/main.rs b/examples/checkbox/src/main.rs new file mode 100644 index 00000000..09950bb8 --- /dev/null +++ b/examples/checkbox/src/main.rs @@ -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() + } +} diff --git a/native/src/widget/checkbox.rs b/native/src/widget/checkbox.rs index b46433c2..f6298a8c 100644 --- a/native/src/widget/checkbox.rs +++ b/native/src/widget/checkbox.rs @@ -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, }); diff --git a/src/widget.rs b/src/widget.rs index 5bf7b6b4..7da5b82b 100644 --- a/src/widget.rs +++ b/src/widget.rs @@ -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> = diff --git a/style/src/checkbox.rs b/style/src/checkbox.rs index 827b3225..52b90ec9 100644 --- a/style/src/checkbox.rs +++ b/style/src/checkbox.rs @@ -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. diff --git a/style/src/theme.rs b/style/src/theme.rs index 55bfa4ca..4ba4facf 100644 --- a/style/src/theme.rs +++ b/style/src/theme.rs @@ -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, |