use enum_map::{EnumMap, enum_map};
use serde::{Deserialize, Serialize};
use super::pivot::{Axis2, HorzAlign};
#[derive(Copy, Clone, Debug, Default, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum Orientation {
#[default]
Portrait,
Landscape,
}
#[derive(Copy, Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ChartSize {
#[default]
AsIs,
FullHeight,
HalfHeight,
QuarterHeight,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct Paragraph {
pub markup: String,
pub horz_align: HorzAlign,
}
impl Default for Paragraph {
fn default() -> Self {
Self {
markup: Default::default(),
horz_align: HorzAlign::Left,
}
}
}
#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
pub struct Heading(pub Vec<Paragraph>);
#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(default)]
pub struct PageSetup {
pub initial_page_number: i32,
pub paper: EnumMap<Axis2, f64>,
pub margins: EnumMap<Axis2, [f64; 2]>,
pub orientation: Orientation,
pub object_spacing: f64,
pub chart_size: ChartSize,
pub headings: [Heading; 2],
}
impl Default for PageSetup {
fn default() -> Self {
Self {
initial_page_number: 1,
paper: enum_map! { Axis2::X => 8.5, Axis2::Y => 11.0 },
margins: enum_map! { Axis2::X => [0.5, 0.5], Axis2::Y => [0.5, 0.5] },
orientation: Default::default(),
object_spacing: 12.0 / 72.0,
chart_size: Default::default(),
headings: Default::default(),
}
}
}
impl PageSetup {
pub fn printable_size(&self) -> EnumMap<Axis2, f64> {
EnumMap::from_fn(|axis| self.paper[axis] - self.margins[axis][0] - self.margins[axis][1])
}
}