properties: Add creator, rights, lens, software

This commit is contained in:
Sophie Herold 2026-06-25 22:14:38 +02:00
parent 18d44da9e9
commit 4adf22c4e5
4 changed files with 118 additions and 4 deletions

4
Cargo.lock generated
View file

@ -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",

View file

@ -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<String, String>) {
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<String> {
self.metadata.camera_owner_name()
}
pub fn creator(&self) -> Option<String> {
self.metadata.creator()
}
pub fn lens(&self) -> Option<String> {
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<String> {
self.metadata.rights()
}
pub fn software(&self) -> Option<String> {
self.metadata.software()
}
pub fn gps_location(&self) -> Option<gufo::common::geography::Location> {
self.metadata.gps_location()
}

View file

@ -72,6 +72,10 @@ mod imp {
#[template_child]
originally_created: TemplateChild<adw::ActionRow>,
#[template_child]
creator: TemplateChild<adw::ActionRow>,
#[template_child]
rights: TemplateChild<adw::ActionRow>,
#[template_child]
user_comment: TemplateChild<adw::ActionRow>,
#[template_child]
aperture: TemplateChild<adw::ActionRow>,
@ -83,6 +87,10 @@ mod imp {
focal_length: TemplateChild<adw::ActionRow>,
#[template_child]
maker_model: TemplateChild<adw::ActionRow>,
#[template_child]
lens: TemplateChild<adw::ActionRow>,
#[template_child]
software: TemplateChild<adw::ActionRow>,
}
#[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);

View file

@ -154,6 +154,26 @@
</style>
</object>
</child>
<child>
<object class="AdwActionRow" id="creator">
<property name="title" translatable="yes">Creator</property>
<property name="subtitle-selectable">True</property>
<property name="use-markup">False</property>
<style>
<class name="property" />
</style>
</object>
</child>
<child>
<object class="AdwActionRow" id="rights">
<property name="title" translatable="yes">Copyright</property>
<property name="subtitle-selectable">True</property>
<property name="use-markup">False</property>
<style>
<class name="property" />
</style>
</object>
</child>
<child>
<object class="AdwActionRow" id="user_comment">
<property name="title" translatable="yes">Comment</property>
@ -214,6 +234,26 @@
</style>
</object>
</child>
<child>
<object class="AdwActionRow" id="lens">
<property name="title" translatable="yes">Lens</property>
<property name="subtitle-selectable">True</property>
<property name="use-markup">False</property>
<style>
<class name="property" />
</style>
</object>
</child>
<child>
<object class="AdwActionRow" id="software">
<property name="title" translatable="yes">Software</property>
<property name="subtitle-selectable">True</property>
<property name="use-markup">False</property>
<style>
<class name="property" />
</style>
</object>
</child>
</object>
</child>
</object>