use std::cell::RefCell;
use std::rc::Rc;
use crate::oxml::shape::Sp as OxmlSp;
use crate::oxml::slidemaster::SldMaster as OxmlSldMaster;
#[derive(Debug, Clone)]
pub struct SlideMasterRef {
#[allow(dead_code)]
pub(crate) idx: usize,
pub(crate) partname: String,
pub(crate) rid: String,
pub(crate) oxml: Rc<RefCell<OxmlSldMaster>>,
pub(crate) theme_partname: String,
pub(crate) theme_rid: String,
}
impl SlideMasterRef {
pub fn partname(&self) -> &str {
&self.partname
}
pub fn rid(&self) -> &str {
&self.rid
}
pub fn shapes(&self) -> Vec<OxmlSp> {
self.oxml.borrow().shapes.clone()
}
pub fn shapes_mut(&self) -> std::cell::RefMut<'_, Vec<OxmlSp>> {
std::cell::RefMut::map(self.oxml.borrow_mut(), |s| &mut s.shapes)
}
pub fn placeholders(&self) -> Vec<crate::slide_layouts::Placeholder> {
self.oxml
.borrow()
.shapes
.iter()
.filter(|s| s.is_placeholder)
.map(|s| crate::slide_layouts::Placeholder {
idx: s.ph_idx.unwrap_or(0),
ph_type: s.ph_type.clone().unwrap_or_else(|| "body".to_string()),
name: s.name.clone(),
})
.collect()
}
pub fn background(&self) -> Option<crate::oxml::slide::SlideBackground> {
self.oxml.borrow().background.clone()
}
pub fn set_background(&self, bg: Option<crate::oxml::slide::SlideBackground>) {
self.oxml.borrow_mut().background = bg;
}
pub fn set_background_solid(&self, color: crate::oxml::color::Color) {
self.oxml.borrow_mut().background = Some(crate::oxml::slide::SlideBackground::solid(color));
}
pub fn clear_background(&self) {
self.oxml.borrow_mut().background = None;
}
pub fn add_shape(&self, sp: OxmlSp) {
self.oxml.borrow_mut().shapes.push(sp);
}
pub fn remove_shape(&self, id: u32) -> Option<OxmlSp> {
let mut oxml = self.oxml.borrow_mut();
let pos = oxml.shapes.iter().position(|s| s.id == id)?;
Some(oxml.shapes.remove(pos))
}
}
#[derive(Debug, Default, Clone)]
pub struct SlideMasters {
pub(crate) items: Vec<SlideMasterRef>,
}
impl SlideMasters {
pub fn new() -> Self {
SlideMasters::default()
}
pub fn len(&self) -> usize {
self.items.len()
}
pub fn is_empty(&self) -> bool {
self.items.is_empty()
}
pub fn iter(&self) -> std::slice::Iter<'_, SlideMasterRef> {
self.items.iter()
}
pub fn get(&self, idx: usize) -> Option<&SlideMasterRef> {
self.items.get(idx)
}
pub fn get_mut(&mut self, idx: usize) -> Option<&mut SlideMasterRef> {
self.items.get_mut(idx)
}
pub fn at(&self, idx: usize) -> Option<SlideMaster> {
self.items.get(idx).map(|_| SlideMaster {})
}
pub fn push(&mut self, master: SlideMasterRef) {
self.items.push(master);
}
}
#[derive(Debug, Clone)]
pub struct SlideMaster {}