use crate::{layout::LayoutOutput, model::ChartModel, visual::VisualElement};
pub mod base;
pub mod context;
pub mod renderers;
pub mod axis;
pub mod bar;
pub mod bubble;
pub mod candlestick;
pub mod gauge;
pub mod label;
pub mod legend;
pub mod line;
pub mod pie;
pub mod polar_bar;
pub mod polar_scatter;
pub mod radar;
pub mod scatter;
pub mod table;
pub mod title;
pub use axis::AxisComponent;
pub use bar::BarSeriesComponent;
pub use base::{SeriesComponentBase, SeriesComponentExt};
pub use bubble::BubbleSeriesComponent;
pub use candlestick::CandlestickSeriesComponent;
pub use context::{CartesianRenderer, PolarRenderer, SeriesContext, SeriesRenderer};
pub use gauge::GaugeSeriesComponent;
pub use label::{LabelComponent, PieLeaderLineLabel, PieLeaderLineLabelBuilder};
pub use legend::LegendComponent;
pub use line::LineSeriesComponent;
pub use pie::PieSeriesComponent;
pub use polar_bar::PolarBarSeriesComponent;
pub use polar_scatter::PolarScatterSeriesComponent;
pub use radar::RadarSeriesComponent;
pub use renderers::{
LabelConfig, LabelPosition, SeriesStyle, color_utils, create_label_config, grid_utils,
render_cartesian_pipeline, render_polar_pipeline,
};
pub use scatter::ScatterSeriesComponent;
pub use table::TableSeriesComponent;
pub use title::TitleComponent;
pub trait ChartComponent {
fn build_visual_elements(
&self,
resolved: &ChartModel,
layout: &LayoutOutput,
) -> Vec<VisualElement>;
}
pub trait SeriesComponent: ChartComponent {
fn series_index(&self) -> usize;
fn grid_index(&self) -> usize;
fn is_empty(&self) -> bool;
fn get_grid_info<'a>(
&self,
layout: &'a LayoutOutput,
) -> Option<&'a crate::layout::GridLayoutInfo> {
layout
.grids
.iter()
.find(|g| g.grid_index == self.grid_index())
}
fn create_context<'a>(
&self,
resolved: &'a ChartModel,
layout: &'a LayoutOutput,
) -> Option<SeriesContext<'a>> {
let grid_info = self.get_grid_info(layout)?;
Some(SeriesContext::new(
self.series_index(),
self.grid_index(),
resolved,
layout,
grid_info,
))
}
}