use super::types::EdgeSide;
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
pub enum EdgePlacement {
#[default]
Compress,
Overlay,
}
#[derive(Debug, Clone, Default)]
pub struct EdgeSlot {
pub id: String,
pub side: EdgeSide,
pub thickness: f32,
pub visible: bool,
pub order: u32,
pub placement: EdgePlacement,
}
#[derive(Debug, Clone, Default)]
pub struct EdgePanels {
slots: Vec<EdgeSlot>,
}
impl EdgePanels {
pub fn new() -> Self {
Self::default()
}
pub fn add(&mut self, slot: EdgeSlot) {
self.remove(&slot.id);
self.slots.push(slot);
}
pub fn remove(&mut self, id: &str) {
self.slots.retain(|s| s.id != id);
}
pub fn clear(&mut self) {
self.slots.clear();
}
pub fn get(&self, id: &str) -> Option<&EdgeSlot> {
self.slots.iter().find(|s| s.id == id)
}
pub fn get_mut(&mut self, id: &str) -> Option<&mut EdgeSlot> {
self.slots.iter_mut().find(|s| s.id == id)
}
pub fn iter(&self) -> impl Iterator<Item = &EdgeSlot> {
self.slots.iter()
}
pub fn slots_for(&self, side: EdgeSide) -> impl Iterator<Item = &EdgeSlot> {
let mut v: Vec<&EdgeSlot> = self.slots
.iter()
.filter(move |s| s.side == side && s.visible)
.collect();
v.sort_by_key(|s| s.order);
v.into_iter()
}
pub fn total_thickness(&self, side: EdgeSide) -> f32 {
self.slots_for(side).map(|s| s.thickness).sum()
}
}