diff --git a/Cargo.lock b/Cargo.lock index 5fdd69a..53b7e1a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1276,9 +1276,9 @@ dependencies = [ [[package]] name = "gufo-exif" -version = "0.5.0-alpha" +version = "0.5.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6a31aca18913da24cf6aaf0d3ffd905608463ffb75d0af42c2f0bf3afc7b987" +checksum = "1597401629a6778cbea663e6af6680fbcd07ab243cc8eee9bc5ef5d2c9e5eab8" dependencies = [ "chrono", "gufo-common", diff --git a/src/metadata.rs b/src/metadata.rs index f680478..a87c446 100644 --- a/src/metadata.rs +++ b/src/metadata.rs @@ -20,6 +20,7 @@ mod file; +use std::collections::BTreeMap; use std::path::PathBuf; use std::str::FromStr; @@ -61,12 +62,23 @@ impl Metadata { } } + fn set_key_value(&mut self, key_value: BTreeMap) { + let result = self.metadata.add_key_value(key_value); + + if let Err(err) = &result { + tracing::warn!("Failed to add key-value data: {err}"); + } + } + pub fn set_image_info(&mut self, image_info: ImageDetails) { if let Some(exif_raw) = image_info.metadata_exif() { self.set_exif_bytes(exif_raw.to_owned()); } - if let Some(exif_xmp) = image_info.metadata_xmp() { - self.set_xmp_bytes(exif_xmp.to_owned()); + if let Some(xmp_raw) = image_info.metadata_xmp() { + self.set_xmp_bytes(xmp_raw.to_owned()); + } + if let Some(key_value) = image_info.metadata_key_value() { + self.set_key_value(key_value.to_owned()); } self.image_info = Some(image_info); } @@ -309,6 +321,56 @@ impl Metadata { self.metadata.make() } + pub fn camera_owner_name(&self) -> Option { + self.metadata.camera_owner_name() + } + + pub fn creator(&self) -> Option { + self.metadata.creator() + } + + pub fn lens(&self) -> Option { + if let Some(lens) = self.metadata.lens_specification() + && lens.min_f_number_max_focal_length.numerator > 0 + && lens.min_f_number_max_focal_length.denominator > 0 + { + let mut s = if lens.min_focal_length == lens.max_focal_length { + format!("{}\u{202F}mm", lens.min_focal_length.as_f32()) + } else { + format!( + "{}–{}\u{202F}mm", + lens.min_focal_length.as_f32(), + lens.max_focal_length.as_f32() + ) + }; + + if lens.min_f_number_min_focal_length == lens.min_f_number_max_focal_length { + s.push_str(&format!( + " \u{192}\u{2215}{}", + lens.min_f_number_min_focal_length.as_f32() + )); + } else { + s.push_str(&format!( + " \u{192}\u{2215}{}–{}", + lens.min_f_number_min_focal_length.as_f32(), + lens.min_f_number_max_focal_length.as_f32() + )); + } + + Some(s) + } else { + self.metadata.lens_model() + } + } + + pub fn rights(&self) -> Option { + self.metadata.rights() + } + + pub fn software(&self) -> Option { + self.metadata.software() + } + pub fn gps_location(&self) -> Option { self.metadata.gps_location() } diff --git a/src/widgets/properties_view.rs b/src/widgets/properties_view.rs index 2b6acc9..7ff52c4 100644 --- a/src/widgets/properties_view.rs +++ b/src/widgets/properties_view.rs @@ -72,6 +72,10 @@ mod imp { #[template_child] originally_created: TemplateChild, #[template_child] + creator: TemplateChild, + #[template_child] + rights: TemplateChild, + #[template_child] user_comment: TemplateChild, #[template_child] aperture: TemplateChild, @@ -83,6 +87,10 @@ mod imp { focal_length: TemplateChild, #[template_child] maker_model: TemplateChild, + #[template_child] + lens: TemplateChild, + #[template_child] + software: TemplateChild, } #[glib::object_subclass] @@ -227,12 +235,16 @@ mod imp { let has_details = [ Self::update_row(&self.location, metadata.gps_location_place()), Self::update_row(&self.originally_created, metadata.originally_created()), + Self::update_row(&self.creator, metadata.creator()), + Self::update_row(&self.rights, metadata.rights()), Self::update_row(&self.user_comment, metadata.user_comment()), Self::update_row(&self.aperture, metadata.f_number()), Self::update_row(&self.exposure, metadata.exposure_time()), Self::update_row(&self.iso, metadata.iso()), Self::update_row(&self.focal_length, metadata.focal_length()), Self::update_row(&self.maker_model, metadata.maker_model()), + Self::update_row(&self.lens, metadata.lens()), + Self::update_row(&self.software, metadata.software()), ] .iter() .any(|x| *x); diff --git a/src/widgets/properties_view.ui b/src/widgets/properties_view.ui index 4bf8887..93ff8cb 100644 --- a/src/widgets/properties_view.ui +++ b/src/widgets/properties_view.ui @@ -154,6 +154,26 @@ + + + Creator + True + False + + + + + + Copyright + True + False + + + Comment @@ -214,6 +234,26 @@ + + + Lens + True + False + + + + + + Software + True + False + + +