#[cfg(feature = "serde")]
use serde::Serialize;
use std::collections::BTreeMap;
use crate::packaging::relationship::XlsxRelationships;
use super::black_white_mode::BlackWhiteModeValues;
use super::shape_style::ShapeStyle;
use super::transform_2d::Transform2D;
use crate::processed::drawing::{
common_types::{extent::Extents, offset::Offset},
effect::effect_style::EffectStyle,
fill::Fill,
line::outline::Outline,
};
use crate::raw::drawing::{
scheme::color_scheme::XlsxColorScheme,
shape::{
shape_properties::XlsxShapeProperties, transform_2d::XlsxTransform2D,
visual_group_shape_properties::XlsxVisualGroupShapeProperties,
},
worksheet_drawing::{
spreadsheet_extent::XlsxSpreadsheetExtent, spreadsheet_position::XlsxSpreadsheetPosition,
},
};
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize))]
pub struct ShapeProperties {
pub size: Extents,
pub position: Offset,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub child_size: Option<Extents>,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub child_position: Option<Offset>,
pub transform_2d: Transform2D,
pub style: ShapeStyle,
pub black_white_mode: BlackWhiteModeValues,
}
impl ShapeProperties {
pub(crate) fn default() -> Self {
return Self {
size: Extents::default(),
position: Offset::default(),
child_size: None,
child_position: None,
transform_2d: Transform2D::default(),
style: ShapeStyle::default(),
black_white_mode: BlackWhiteModeValues::default(),
};
}
pub(crate) fn from_graphic_frame_transform(
transform2d: Option<XlsxTransform2D>,
extent: Option<XlsxSpreadsheetExtent>,
position: Option<XlsxSpreadsheetPosition>,
) -> Self {
let extent = if let Some(transform) = transform2d.clone() {
Extents::from_transform_2d(Some(transform))
} else {
Extents::from_raw(extent.clone())
};
let position = if let Some(transform) = transform2d.clone() {
Offset::from_transform_2d(Some(transform))
} else {
Offset::from_spreadsheet_position(position.clone())
};
return Self {
size: extent,
position,
child_size: None,
child_position: None,
transform_2d: Transform2D::from_transform_2d(transform2d.clone()),
style: ShapeStyle::default(),
black_white_mode: BlackWhiteModeValues::default(),
};
}
pub(crate) fn from_shape_properties(
raw: Option<XlsxShapeProperties>,
extent: Option<XlsxSpreadsheetExtent>,
position: Option<XlsxSpreadsheetPosition>,
parent_group_fill: Option<Fill>,
drawing_relationship: XlsxRelationships,
image_bytes: BTreeMap<String, Vec<u8>>,
color_scheme: Option<XlsxColorScheme>,
line_ref: Option<Outline>,
fill_ref: Option<Fill>,
effect_ref: Option<EffectStyle>,
) -> Self {
let Some(raw) = raw else {
return Self::default();
};
let extent = if let Some(transform) = raw.clone().transform2d {
Extents::from_transform_2d(Some(transform))
} else {
Extents::from_raw(extent.clone())
};
let position = if let Some(transform) = raw.clone().transform2d {
Offset::from_transform_2d(Some(transform))
} else {
Offset::from_spreadsheet_position(position.clone())
};
return Self {
size: extent,
position,
child_size: None,
child_position: None,
transform_2d: Transform2D::from_transform_2d(raw.clone().transform2d),
style: ShapeStyle::from_shape_properties(
raw.clone(),
parent_group_fill.clone(),
drawing_relationship.clone(),
image_bytes.clone(),
color_scheme.clone(),
line_ref.clone(),
fill_ref.clone(),
effect_ref.clone(),
),
black_white_mode: BlackWhiteModeValues::from_string(raw.clone().black_white_mode),
};
}
pub(crate) fn from_group_shape_properties(
raw: Option<XlsxVisualGroupShapeProperties>,
extent: Option<XlsxSpreadsheetExtent>,
position: Option<XlsxSpreadsheetPosition>,
drawing_relationship: XlsxRelationships,
image_bytes: BTreeMap<String, Vec<u8>>,
color_scheme: Option<XlsxColorScheme>,
) -> Self {
let Some(raw) = raw else {
return Self::default();
};
let extent = if let Some(transform) = raw.clone().transform2d {
Extents::from_transform_group(Some(transform))
} else {
Extents::from_raw(extent.clone())
};
let position = if let Some(transform) = raw.clone().transform2d {
Offset::from_transform_group(Some(transform))
} else {
Offset::from_spreadsheet_position(position.clone())
};
return Self {
size: extent,
position,
child_size: Some(Extents::child_extent_from_transform_group(
raw.clone().transform2d,
)),
child_position: Some(Offset::child_pos_from_transform_group(
raw.clone().transform2d,
)),
transform_2d: Transform2D::from_transform_group(raw.clone().transform2d),
style: ShapeStyle::from_group_shape_properties(
raw.clone(),
drawing_relationship.clone(),
image_bytes.clone(),
color_scheme.clone(),
),
black_white_mode: BlackWhiteModeValues::from_string(raw.clone().black_white_mode),
};
}
}