Skip to content

Commit

Permalink
Merge pull request #1707 from casperstorm/feat/checkbox-icon
Browse files Browse the repository at this point in the history
Added the ability to change `Checkbox` icon
  • Loading branch information
hecrj authored Feb 17, 2023
2 parents e3fbaed + 4fb0be1 commit 32745f4
Show file tree
Hide file tree
Showing 8 changed files with 123 additions and 9 deletions.
9 changes: 9 additions & 0 deletions examples/checkbox/Cargo.toml
Original file line number Diff line number Diff line change
@@ -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 = "../.." }
12 changes: 12 additions & 0 deletions examples/checkbox/README.md
Original file line number Diff line number Diff line change
@@ -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 added examples/checkbox/fonts/icons.ttf
Binary file not shown.
63 changes: 63 additions & 0 deletions examples/checkbox/src/main.rs
Original file line number Diff line number Diff line change
@@ -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()
}
}
38 changes: 34 additions & 4 deletions native/src/widget/checkbox.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -45,6 +56,7 @@ where
spacing: u16,
text_size: Option<u16>,
font: Renderer::Font,
icon: Icon<Renderer::Font>,
style: <Renderer::Theme as StyleSheet>::Style,
}

Expand Down Expand Up @@ -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(),
}
}
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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,
});
Expand Down
2 changes: 1 addition & 1 deletion src/widget.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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> =
Expand Down
4 changes: 2 additions & 2 deletions style/src/checkbox.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
4 changes: 2 additions & 2 deletions style/src/theme.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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,
Expand Down

0 comments on commit 32745f4

Please sign in to comment.