use std::collections::BTreeMap;
#[cfg(feature = "serde")]
use serde::Serialize;
use crate::{
packaging::relationship::XlsxRelationships,
processed::drawing::{
effect::effect_style::EffectStyle, line::outline::Outline,
worksheet_drawing::non_visual_properties::NonVisualDrawingProperty,
},
raw::{
drawing::{
scheme::color_scheme::XlsxColorScheme,
shape::{
connection_shape::XlsxConnectionShape, end_connection::XlsxEndConnection,
start_connection::XlsxStartConnection,
},
worksheet_drawing::{
client_data::XlsxClientData, spreadsheet_extent::XlsxSpreadsheetExtent,
spreadsheet_position::XlsxSpreadsheetPosition,
},
},
spreadsheet::workbook::defined_name::XlsxDefinedNames,
},
};
use super::{geometry::GeometryTypeValues, shape_properties::ShapeProperties};
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize))]
pub struct ConnectionShape {
pub geometry: GeometryTypeValues,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub start_connection: Option<ConnectionPoint>,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub end_connection: Option<ConnectionPoint>,
#[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 visual_properties: ShapeProperties,
pub non_visual_properties: NonVisualDrawingProperty,
}
impl ConnectionShape {
pub(crate) fn from_spreadsheet_connection_shape(
raw: XlsxConnectionShape,
extent: Option<XlsxSpreadsheetExtent>,
position: Option<XlsxSpreadsheetPosition>,
client_data: Option<XlsxClientData>,
drawing_relationship: XlsxRelationships,
defined_names: XlsxDefinedNames,
color_scheme: Option<XlsxColorScheme>,
line_ref: Option<Outline>,
effect_ref: Option<EffectStyle>,
) -> Self {
let mut start: Option<ConnectionPoint> = None;
let mut end: Option<ConnectionPoint> = None;
if let Some(properties) = raw.clone().non_visual_connection_shape_properties {
if let Some(p) = properties.non_visual_connector_shape_drawing_properties {
start = ConnectionPoint::from_start(p.start_connection);
end = ConnectionPoint::from_end(p.end_connection);
}
};
return Self {
geometry: GeometryTypeValues::from_shape_properties(raw.clone().shape_properties),
start_connection: start,
end_connection: end,
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_connection_shape_properties(
raw.non_visual_connection_shape_properties,
client_data.clone(),
drawing_relationship.clone(),
defined_names,
),
visual_properties: ShapeProperties::from_shape_properties(
raw.shape_properties,
extent,
position,
None,
drawing_relationship.clone(),
BTreeMap::new(),
color_scheme.clone(),
line_ref.clone(),
None,
effect_ref.clone(),
),
};
}
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize))]
pub struct ConnectionPoint {
pub id: u64,
pub index: u64,
}
impl ConnectionPoint {
pub(crate) fn from_start(raw: Option<XlsxStartConnection>) -> Option<Self> {
let Some(raw) = raw else { return None };
let Some(id) = raw.id else { return None };
return Some(Self {
id,
index: raw.index.unwrap_or(0),
});
}
pub(crate) fn from_end(raw: Option<XlsxEndConnection>) -> Option<Self> {
let Some(raw) = raw else { return None };
let Some(id) = raw.id else { return None };
return Some(Self {
id,
index: raw.index.unwrap_or(0),
});
}
}