tessera_ui_basic_components/
checkmark.rs1use derive_builder::Builder;
2use tessera_ui::{Color, ComputedData, Dp, Px};
3use tessera_ui_macros::tessera;
4
5use crate::pipelines::CheckmarkCommand;
6
7#[derive(Builder, Clone)]
9#[builder(pattern = "owned")]
10pub struct CheckmarkArgs {
11 #[builder(default = "Color::new(0.0, 0.6, 0.0, 1.0)")]
13 pub color: Color,
14
15 #[builder(default = "5.0")]
17 pub stroke_width: f32,
18
19 #[builder(default = "1.0")]
21 pub progress: f32,
22
23 #[builder(default = "[2.0, 2.0]")]
25 pub padding: [f32; 2], #[builder(default = "Dp(20.0)")]
29 pub size: Dp,
30}
31
32impl std::fmt::Debug for CheckmarkArgs {
33 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
34 f.debug_struct("CheckmarkArgs")
35 .field("color", &self.color)
36 .field("stroke_width", &self.stroke_width)
37 .field("progress", &self.progress)
38 .field("padding", &self.padding)
39 .field("size", &self.size)
40 .finish()
41 }
42}
43
44impl Default for CheckmarkArgs {
45 fn default() -> Self {
46 CheckmarkArgsBuilder::default().build().unwrap()
47 }
48}
49
50#[tessera]
55pub fn checkmark(args: impl Into<CheckmarkArgs>) {
56 let args: CheckmarkArgs = args.into();
57
58 let size_px = args.size.to_px();
59
60 let command = CheckmarkCommand {
62 color: args.color,
63 stroke_width: args.stroke_width,
64 progress: args.progress,
65 padding: args.padding,
66 };
67
68 measure(Box::new(move |input| {
70 if let Some(mut metadata) = input.metadatas.get_mut(&input.current_node_id) {
72 metadata.push_draw_command(command.clone());
73 }
74
75 Ok(ComputedData {
76 width: Px::new(size_px.to_f32() as i32),
77 height: Px::new(size_px.to_f32() as i32),
78 })
79 }));
80}