use std::sync::Arc;
use super::ChartContext;
use crate::coord::{CoordTranslate, Shift};
use crate::drawing::DrawingArea;
use plotters_backend::DrawingBackend;
#[derive(Clone)]
pub struct ChartState<CT: CoordTranslate> {
drawing_area_pos: (i32, i32),
drawing_area_size: (u32, u32),
coord: CT,
}
impl<'a, DB: DrawingBackend, CT: CoordTranslate> From<ChartContext<'a, DB, CT>> for ChartState<CT> {
fn from(chart: ChartContext<'a, DB, CT>) -> ChartState<CT> {
ChartState {
drawing_area_pos: chart.drawing_area_pos,
drawing_area_size: chart.drawing_area.dim_in_pixel(),
coord: chart.drawing_area.into_coord_spec(),
}
}
}
impl<'a, DB: DrawingBackend, CT: CoordTranslate> ChartContext<'a, DB, CT> {
pub fn into_chart_state(self) -> ChartState<CT> {
self.into()
}
pub fn into_shared_chart_state(self) -> ChartState<Arc<CT>> {
ChartState {
drawing_area_pos: self.drawing_area_pos,
drawing_area_size: self.drawing_area.dim_in_pixel(),
coord: Arc::new(self.drawing_area.into_coord_spec()),
}
}
}
impl<'a, DB, CT> From<&ChartContext<'a, DB, CT>> for ChartState<CT>
where
DB: DrawingBackend,
CT: CoordTranslate + Clone,
{
fn from(chart: &ChartContext<'a, DB, CT>) -> ChartState<CT> {
ChartState {
drawing_area_pos: chart.drawing_area_pos,
drawing_area_size: chart.drawing_area.dim_in_pixel(),
coord: chart.drawing_area.as_coord_spec().clone(),
}
}
}
impl<'a, DB: DrawingBackend, CT: CoordTranslate + Clone> ChartContext<'a, DB, CT> {
pub fn to_chart_state(&self) -> ChartState<CT> {
self.into()
}
}
impl<CT: CoordTranslate> ChartState<CT> {
pub fn restore<'a, DB: DrawingBackend>(
self,
area: &DrawingArea<DB, Shift>,
) -> ChartContext<'a, DB, CT> {
let area = area
.clone()
.shrink(self.drawing_area_pos, self.drawing_area_size);
ChartContext {
x_label_area: [None, None],
y_label_area: [None, None],
drawing_area: area.apply_coord_spec(self.coord),
series_anno: vec![],
drawing_area_pos: self.drawing_area_pos,
}
}
}