summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--examples/checkbox/Cargo.toml9
-rw-r--r--examples/checkbox/README.md12
-rw-r--r--examples/checkbox/fonts/icons.ttfbin0 -> 1272 bytes
-rw-r--r--examples/checkbox/src/main.rs63
-rw-r--r--native/src/widget/checkbox.rs38
-rw-r--r--src/widget.rs2
-rw-r--r--style/src/checkbox.rs4
-rw-r--r--style/src/theme.rs4
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
new file mode 100644
index 00000000..a2046844
--- /dev/null
+++ b/examples/checkbox/fonts/icons.ttf
Binary files differ
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,