use serde::{Deserialize, Serialize};
use crate::{compliance::ua::StructTag, styles::RgbColor};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FixedBox {
pub x_mm: f64,
pub y_mm: f64,
pub width_mm: f64,
pub height_mm: f64,
pub overflow: OverflowPolicy,
pub border: Option<BoxBorder>,
pub background: Option<RgbColor>,
pub padding_mm: f64,
#[serde(default)]
pub z_index: i32,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub ua_role: Option<StructTag>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub ua_alt: Option<String>,
}
impl Default for FixedBox {
fn default() -> Self {
Self {
x_mm: 0.0,
y_mm: 0.0,
width_mm: 50.0,
height_mm: 10.0,
overflow: OverflowPolicy::Truncate,
border: None,
background: None,
padding_mm: 2.0,
z_index: 0,
ua_role: None,
ua_alt: None,
}
}
}
impl FixedBox {
pub fn role(mut self, tag: StructTag) -> Self {
self.ua_role = Some(tag);
self
}
pub fn alt(mut self, text: impl Into<String>) -> Self {
self.ua_alt = Some(text.into());
self
}
pub fn inner_width_mm(&self) -> f64 {
(self.width_mm - self.padding_mm * 2.0).max(0.0)
}
pub fn inner_height_mm(&self) -> f64 {
(self.height_mm - self.padding_mm * 2.0).max(0.0)
}
pub fn inner_x_mm(&self) -> f64 {
self.x_mm + self.padding_mm
}
pub fn inner_y_top_mm(&self) -> f64 {
self.y_mm + self.height_mm - self.padding_mm
}
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, Default, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum OverflowPolicy {
#[default]
Truncate,
Clip,
Shrink,
Overflow,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BoxBorder {
pub width_mm: f64,
pub color: RgbColor,
pub style: BorderStyle,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, Default, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum BorderStyle {
#[default]
Solid,
Dashed,
Dotted,
}