//! .glif `` mod xml; use integer_or_float::IntegerOrFloat; use crate::color::Color; use crate::point::PointData; #[cfg(feature = "glifserde")] use serde::{Serialize, Deserialize}; use std::fmt::Debug; #[cfg_attr(feature = "glifserde", derive(Serialize, Deserialize))] #[derive(Clone, Copy, Debug, Default, PartialEq)] pub struct GuidelinePoint { pub x: f32, pub y: f32 } impl Into<(f32, f32)> for GuidelinePoint { fn into(self) -> (f32, f32) { (self.x, self.y) } } #[cfg_attr(feature = "glifserde", derive(Serialize, Deserialize))] #[derive(Clone, Debug, Default, PartialEq)] pub struct Guideline { pub at: GuidelinePoint, pub angle: IntegerOrFloat, pub name: Option, pub color: Option, pub identifier: Option, pub data: GD, } impl Guideline { pub fn as_plist_dict(&self) -> plist::Dictionary { let mut dict = plist::Dictionary::new(); dict.insert("x".to_string(), plist::Value::Real(self.at.x.into())); dict.insert("y".to_string(), plist::Value::Real(self.at.y.into())); dict.insert("angle".to_string(), plist::Value::Real(self.angle.into())); if let Some(ref name) = self.name { dict.insert("name".to_string(), plist::Value::String(name.to_string())); } if let Some(ref color) = self.color { dict.insert("color".to_string(), color.as_plist_value()); } dict } } impl Guideline { fn new() -> Self { Self::default() } pub fn from_x_y_angle(x: f32, y: f32, angle: IntegerOrFloat) -> Self { let mut ret = Self::new(); ret.at.x = x; ret.at.y = y; ret.angle = angle; ret } pub fn name(mut self, name: impl Into) -> Self { self.name = Some(name.into()); self } pub fn color(mut self, color: impl Into) -> Self { self.color = Some(color.into()); self } pub fn identifier(mut self, identifier: impl Into) -> Self { self.identifier = Some(identifier.into()); self } pub fn data(mut self, data: impl Into) -> Self { self.data = data.into(); self } }