From bcdfeb3d4e2569e073a34be67f38f57da90be723 Mon Sep 17 00:00:00 2001
From: Robin Krahl <robin.krahl@ireas.org>
Date: Tue, 9 Mar 2021 21:32:18 +0100
Subject: Use LinearLayout for vcard

---
 src/model/property_groups/address.rs   |  2 +-
 src/model/property_groups/name.rs      |  2 +-
 src/model/property_groups/telephone.rs |  2 +-
 src/model/vcard.rs                     | 87 ++++++++++++++--------------------
 4 files changed, 38 insertions(+), 55 deletions(-)

(limited to 'src')

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)
+    }
 }
-- 
cgit v1.2.3