use std::collections::BTreeMap;
#[cfg(feature = "serde")]
use serde::Serialize;
use crate::{
packaging::relationship::XlsxRelationships,
processed::drawing::{
effect::effect_style::EffectStyle,
fill::{blip_fill::BlipFill, Fill},
line::outline::Outline,
shape::{geometry::GeometryTypeValues, shape_properties::ShapeProperties},
worksheet_drawing::non_visual_properties::NonVisualDrawingProperty,
},
raw::{
drawing::{
image::picture::XlsxPicture,
scheme::color_scheme::XlsxColorScheme,
worksheet_drawing::{
client_data::XlsxClientData, spreadsheet_extent::XlsxSpreadsheetExtent,
spreadsheet_position::XlsxSpreadsheetPosition,
},
},
spreadsheet::workbook::defined_name::XlsxDefinedNames,
},
};
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize))]
pub struct Picture {
pub blip_fill: BlipFill,
pub geometry: GeometryTypeValues,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub r#macro: Option<String>,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub published: Option<bool>,
pub prefer_relative_resize: bool,
pub visual_properties: ShapeProperties,
pub non_visual_properties: NonVisualDrawingProperty,
}
impl Picture {
pub(crate) fn from_spreadsheet_picture(
raw: XlsxPicture,
extent: Option<XlsxSpreadsheetExtent>,
position: Option<XlsxSpreadsheetPosition>,
client_data: Option<XlsxClientData>,
parent_group_fill: Option<Fill>,
drawing_relationship: XlsxRelationships,
image_bytes: BTreeMap<String, Vec<u8>>,
defined_names: XlsxDefinedNames,
color_scheme: Option<XlsxColorScheme>,
line_ref: Option<Outline>,
fill_ref: Option<Fill>,
effect_ref: Option<EffectStyle>,
) -> Option<Self> {
let prefer_relative_resize =
if let Some(non_visual_shape_properties) = raw.non_visual_picture_properties.clone() {
if let Some(p) = non_visual_shape_properties.non_visual_picture_drawing_properties {
p.prefer_relative_resize.unwrap_or(false)
} else {
false
}
} else {
false
};
let Some(blip) = BlipFill::from_raw(
raw.clone().blip_fill,
drawing_relationship.clone(),
image_bytes.clone(),
color_scheme.clone(),
None,
) else {
return None;
};
return Some(Self {
blip_fill: blip,
geometry: GeometryTypeValues::from_shape_properties(
raw.clone().shape_properties.clone(),
),
prefer_relative_resize,
r#macro: Some(raw.clone().r#macro.unwrap_or(String::new())),
published: Some(raw.clone().published.unwrap_or(false)),
non_visual_properties: NonVisualDrawingProperty::from_non_visual_picture_properties(
raw.non_visual_picture_properties,
client_data.clone(),
drawing_relationship.clone(),
defined_names,
),
visual_properties: ShapeProperties::from_shape_properties(
raw.shape_properties,
extent,
position,
parent_group_fill.clone(),
drawing_relationship.clone(),
image_bytes.clone(),
color_scheme.clone(),
line_ref.clone(),
fill_ref.clone(),
effect_ref.clone(),
),
});
}
}