pub mod executor;
pub use executor::ChartExecutor;
use std::sync::Arc;
use imbl::{HashMap, Vector};
use logisheets_base::{CellId, SheetId};
use logisheets_workbook::prelude::{ChartData, PassthroughPart};
#[derive(Debug, Clone)]
pub struct ChartMarker {
pub cell: CellId,
pub col_off: i64,
pub row_off: i64,
}
#[derive(Debug, Clone)]
pub struct Chart {
pub id: String,
pub from: ChartMarker,
pub to: ChartMarker,
pub part_path: String,
pub data: ChartData,
pub raw: Arc<Vec<PassthroughPart>>,
}
#[derive(Debug, Clone, Default)]
pub struct ChartManager {
pub charts: HashMap<SheetId, Vector<Chart>>,
}
impl ChartManager {
pub fn new() -> Self {
Self::default()
}
pub fn add(&mut self, sheet_id: SheetId, chart: Chart) {
let mut v = self.charts.get(&sheet_id).cloned().unwrap_or_default();
v.push_back(chart);
self.charts.insert(sheet_id, v);
}
pub fn charts_of_sheet(&self, sheet_id: SheetId) -> Vec<Chart> {
self.charts
.get(&sheet_id)
.map(|v| v.iter().cloned().collect())
.unwrap_or_default()
}
pub fn move_chart(
&mut self,
sheet_id: SheetId,
chart_id: &str,
from: ChartMarker,
to: ChartMarker,
) -> bool {
let mut v = match self.charts.get(&sheet_id) {
Some(v) => v.clone(),
None => return false,
};
let idx = v.iter().position(|c| c.id == chart_id);
let idx = match idx {
Some(i) => i,
None => return false,
};
let mut chart = v[idx].clone();
chart.from = from;
chart.to = to;
v.set(idx, chart);
self.charts.insert(sheet_id, v);
true
}
pub fn update_content(
&mut self,
sheet_id: SheetId,
chart_id: &str,
data: ChartData,
raw: Arc<Vec<PassthroughPart>>,
) -> bool {
let mut v = match self.charts.get(&sheet_id) {
Some(v) => v.clone(),
None => return false,
};
let idx = match v.iter().position(|c| c.id == chart_id) {
Some(i) => i,
None => return false,
};
let mut chart = v[idx].clone();
chart.data = data;
chart.raw = raw;
v.set(idx, chart);
self.charts.insert(sheet_id, v);
true
}
pub fn remove_chart(&mut self, sheet_id: SheetId, chart_id: &str) -> bool {
let mut v = match self.charts.get(&sheet_id) {
Some(v) => v.clone(),
None => return false,
};
let idx = match v.iter().position(|c| c.id == chart_id) {
Some(i) => i,
None => return false,
};
v.remove(idx);
self.charts.insert(sheet_id, v);
true
}
}