use std::sync::Arc;
use crate::stroke::{Cap, Join};
use super::palette::ThemeColor;
#[derive(Debug, Clone, PartialEq)]
pub struct GeomTheme {
pub point: PointDefaults,
pub line: LineDefaults,
pub segment: LineDefaults,
pub polygon: ShapeDefaults,
pub rect: ShapeDefaults,
pub ellipse: ShapeDefaults,
pub wedge: ShapeDefaults,
pub bspline: LineDefaults,
pub ribbon: ShapeDefaults,
pub ribbon_bspline: ShapeDefaults,
pub text: TextDefaults,
pub text_fit: TextFitDefaults,
pub text_path: TextDefaults,
pub marker_outline_pt: f64,
}
impl Default for GeomTheme {
fn default() -> Self {
Self {
point: PointDefaults::default(),
line: LineDefaults::default(),
segment: LineDefaults::default(),
polygon: ShapeDefaults::default(),
rect: ShapeDefaults::default(),
ellipse: ShapeDefaults::default(),
wedge: ShapeDefaults::default(),
bspline: LineDefaults::default(),
ribbon: ShapeDefaults::default(),
ribbon_bspline: ShapeDefaults::default(),
text: TextDefaults::default(),
text_fit: TextFitDefaults::default(),
text_path: TextDefaults::default(),
marker_outline_pt: 0.5,
}
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct PointDefaults {
pub size_pt: f64,
pub shape: Arc<str>,
pub fill: Option<ThemeColor>,
pub stroke: Option<ThemeColor>,
pub stroke_width_pt: f64,
}
impl Default for PointDefaults {
fn default() -> Self {
Self {
size_pt: 5.0,
shape: Arc::from("circle"),
fill: None,
stroke: None,
stroke_width_pt: 1.0,
}
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct LineDefaults {
pub stroke: Option<ThemeColor>,
pub linewidth_pt: f64,
pub cap: Cap,
pub join: Join,
}
impl Default for LineDefaults {
fn default() -> Self {
Self {
stroke: None,
linewidth_pt: 1.0,
cap: Cap::Butt,
join: Join::Miter,
}
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct ShapeDefaults {
pub fill: Option<ThemeColor>,
pub stroke: Option<ThemeColor>,
pub linewidth_pt: f64,
pub cap: Cap,
pub join: Join,
}
impl Default for ShapeDefaults {
fn default() -> Self {
Self {
fill: None,
stroke: None,
linewidth_pt: 1.0,
cap: Cap::Butt,
join: Join::Miter,
}
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct TextDefaults {
pub size_pt: f64,
pub weight: u16,
pub fill: Option<ThemeColor>,
pub anchor_x: f64,
pub anchor_y: f64,
pub bg_fill: Option<ThemeColor>,
pub bg_stroke: Option<ThemeColor>,
pub bg_linewidth_pt: f64,
pub letter_spacing_pt: f64,
pub underline: bool,
pub strikethrough: bool,
pub text_stroke: Option<ThemeColor>,
pub text_linewidth_pt: f64,
pub markdown: bool,
}
impl Default for TextDefaults {
fn default() -> Self {
Self {
size_pt: 12.0,
weight: 400,
fill: Some(ThemeColor::Ink),
anchor_x: 0.5,
anchor_y: 0.5,
bg_fill: None,
bg_stroke: None,
bg_linewidth_pt: 1.0,
letter_spacing_pt: 0.0,
underline: false,
strikethrough: false,
text_stroke: None,
text_linewidth_pt: 1.0,
markdown: false,
}
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct TextFitDefaults {
pub min_font_pt: f64,
pub max_font_pt: f64,
pub weight: u16,
pub fill: Option<ThemeColor>,
pub bg_fill: Option<ThemeColor>,
pub bg_stroke: Option<ThemeColor>,
pub bg_linewidth_pt: f64,
pub letter_spacing_pt: f64,
pub underline: bool,
pub strikethrough: bool,
pub text_stroke: Option<ThemeColor>,
pub text_linewidth_pt: f64,
}
impl Default for TextFitDefaults {
fn default() -> Self {
Self {
min_font_pt: 6.0,
max_font_pt: 96.0,
weight: 400,
fill: Some(ThemeColor::Ink),
bg_fill: None,
bg_stroke: None,
bg_linewidth_pt: 1.0,
letter_spacing_pt: 0.0,
underline: false,
strikethrough: false,
text_stroke: None,
text_linewidth_pt: 1.0,
}
}
}