diff options
Diffstat (limited to 'src/model')
-rw-r--r-- | src/model/property_groups/address.rs | 2 | ||||
-rw-r--r-- | src/model/property_groups/name.rs | 2 | ||||
-rw-r--r-- | src/model/property_groups/telephone.rs | 2 | ||||
-rw-r--r-- | src/model/vcard.rs | 87 |
4 files changed, 38 insertions, 55 deletions
diff --git a/src/model/property_groups/address.rs b/src/model/property_groups/address.rs index 00bca0b..e50a59a 100644 --- a/src/model/property_groups/address.rs +++ b/src/model/property_groups/address.rs @@ -1,7 +1,7 @@ use crate::model::input_fields::VCardPropertyInputField; use crate::model::*; -#[derive(Clone, Debug, PartialEq)] +#[derive(Clone, Debug, Default, PartialEq)] pub struct Address { pub post_office_box: String, pub extension: String, diff --git a/src/model/property_groups/name.rs b/src/model/property_groups/name.rs index eb0d9da..4a4d72c 100644 --- a/src/model/property_groups/name.rs +++ b/src/model/property_groups/name.rs @@ -16,7 +16,7 @@ use crate::model::*; /// /// assert_eq!(name.generate_fn(), String::from("Sir Arthur Charles Clarke, CBE FRAS")); /// ``` -#[derive(Clone, Debug, PartialEq)] +#[derive(Clone, Debug, Default, PartialEq)] pub struct Name { pub prefix: String, pub first_name: String, diff --git a/src/model/property_groups/telephone.rs b/src/model/property_groups/telephone.rs index 03de4ee..dee28e1 100644 --- a/src/model/property_groups/telephone.rs +++ b/src/model/property_groups/telephone.rs @@ -1,7 +1,7 @@ use crate::model::input_fields::VCardPropertyInputField; use crate::model::*; -#[derive(Clone, Debug, PartialEq)] +#[derive(Clone, Debug, Default, PartialEq)] pub struct Telephone { pub number: String, pub work: bool, diff --git a/src/model/vcard.rs b/src/model/vcard.rs index ea66224..118d543 100644 --- a/src/model/vcard.rs +++ b/src/model/vcard.rs @@ -242,21 +242,21 @@ impl VCardData { pub fn generate_pdf(&self) -> Result<String, ()> { let regular_bytes = - include_bytes!("/usr/share/fonts/liberation/LiberationSans-Regular.ttf"); + include_bytes!("/usr/share/fonts/truetype/liberation/LiberationSans-Regular.ttf"); let regular_font_data = fonts::FontData::new( regular_bytes.to_vec(), Some(printpdf::BuiltinFont::Helvetica), ) .expect("font data should be correct"); - let bold_bytes = include_bytes!("/usr/share/fonts/liberation/LiberationSans-Bold.ttf"); + let bold_bytes = include_bytes!("/usr/share/fonts/truetype/liberation/LiberationSans-Bold.ttf"); let bold_font_data = fonts::FontData::new( bold_bytes.to_vec(), Some(printpdf::BuiltinFont::HelveticaBold), ) .expect("font data should be correct"); - let italic_bytes = include_bytes!("/usr/share/fonts/liberation/LiberationSans-Italic.ttf"); + let italic_bytes = include_bytes!("/usr/share/fonts/truetype/liberation/LiberationSans-Italic.ttf"); let italic_font_data = fonts::FontData::new( italic_bytes.to_vec(), Some(printpdf::BuiltinFont::HelveticaOblique), @@ -264,7 +264,7 @@ impl VCardData { .expect("font data should be correct"); let bold_italic_bytes = - include_bytes!("/usr/share/fonts/liberation/LiberationSans-BoldItalic.ttf"); + include_bytes!("/usr/share/fonts/truetype/liberation/LiberationSans-BoldItalic.ttf"); let bold_italic_font_data = fonts::FontData::new( bold_italic_bytes.to_vec(), Some(printpdf::BuiltinFont::HelveticaBoldOblique), @@ -294,52 +294,7 @@ impl VCardData { .aligned(elements::Alignment::Center) .styled(style::Style::new().bold().with_font_size(20)), ); - - let mut card_data = elements::Paragraph::new(""); - - let vcard_data = self.clone(); - - if let Some(name) = vcard_data.names.get(0) { - card_data.push_styled( - name.generate_fn(), - style::Effect::Bold - ); - } - card_data.push( - "" - ); - if let Some(communication) = vcard_data.communications.get(0) { - card_data.push( - communication.email_address.clone() - ); - } - card_data.push( - "" - ); - if let Some(address) = vcard_data.addresses.get(0) { - card_data.push( - address.street.clone() - ); - card_data.push( - format!("{} {} {}", address.code, address.locality, address.extension) - ); - card_data.push( - format!("{} {}", address.region, address.country) - ); - } - card_data.push( - "" - ); - for telephone in vcard_data.telephones { - card_data.push( - telephone.number - ); - } - - let framed_card_data = elements::FramedElement::new( - card_data - ); - + let mut table = elements::TableLayout::new(vec![1,1]); table.set_cell_decorator( elements::FrameCellDecorator::new(false, false, false) @@ -347,8 +302,8 @@ impl VCardData { for _i in 0..4 { table .row() - .element(framed_card_data.clone()) - .element(framed_card_data.clone()) + .element(self.create_card_element()) + .element(self.create_card_element()) .push() .expect("invalid table row"); } @@ -366,4 +321,32 @@ impl VCardData { Err(_) => Err(()), } } + + fn create_card_element(&self) -> impl genpdf::Element { + let mut layout = elements::LinearLayout::vertical(); + + if let Some(name) = self.names.get(0) { + layout.push(elements::Text::new(style::StyledString::new( + name.generate_fn(), + style::Effect::Bold + ))); + } + if let Some(communication) = self.communications.get(0) { + layout.push(elements::Text::new(&communication.email_address)); + } + if let Some(address) = self.addresses.get(0) { + layout.push(elements::Text::new(&address.street)); + layout.push(elements::Text::new( + format!("{} {} {}", address.code, address.locality, address.extension) + )); + layout.push(elements::Text::new( + format!("{} {}", address.region, address.country) + )); + } + for telephone in &self.telephones { + layout.push(elements::Text::new(&telephone.number)); + } + + elements::FramedElement::new(layout) + } } |