use iced_graphics::core::event::Status;
use iced_widget::canvas::Cache;
use iced_widget::core::Rectangle;
use iced_widget::core::mouse::Interaction;
use iced_widget::{
canvas::{Event, Frame, Geometry},
core::{Size, mouse::Cursor},
};
use plotters::{chart::ChartBuilder, coord::Shift, drawing::DrawingArea};
use plotters_backend::DrawingBackend;
pub trait Renderer {
fn draw<F: Fn(&mut Frame)>(&self, bounds: Size, draw_fn: F) -> Geometry;
fn draw_cache<F: Fn(&mut Frame)>(&self, cache: &Cache, bounds: Size, draw_fn: F) -> Geometry;
}
impl<Message, C: ?Sized> Chart<Message> for &C
where
C: Chart<Message>,
{
type State = C::State;
#[inline]
fn build_chart<DB: DrawingBackend>(&self, state: &Self::State, builder: ChartBuilder<DB>) {
C::build_chart(self, state, builder);
}
#[inline]
fn draw_chart<DB: DrawingBackend>(&self, state: &Self::State, root: DrawingArea<DB, Shift>) {
C::draw_chart(self, state, root);
}
#[inline]
fn draw<R: Renderer, F: Fn(&mut Frame)>(&self, renderer: &R, size: Size, f: F) -> Geometry {
C::draw(self, renderer, size, f)
}
#[inline]
fn update(
&self,
state: &mut Self::State,
event: &Event,
bounds: Rectangle,
cursor: Cursor,
) -> (Status, Option<Message>) {
C::update(self, state, event, bounds, cursor)
}
#[inline]
fn mouse_interaction(
&self,
state: &Self::State,
bounds: Rectangle,
cursor: Cursor,
) -> Interaction {
C::mouse_interaction(self, state, bounds, cursor)
}
}
pub trait Chart<Message> {
type State: Default + 'static;
fn build_chart<DB: DrawingBackend>(&self, state: &Self::State, builder: ChartBuilder<DB>);
#[inline]
fn draw_chart<DB: DrawingBackend>(&self, state: &Self::State, root: DrawingArea<DB, Shift>) {
let builder = ChartBuilder::on(&root);
self.build_chart(state, builder);
}
#[inline]
fn draw<R: Renderer, F: Fn(&mut Frame)>(&self, renderer: &R, size: Size, f: F) -> Geometry {
R::draw(renderer, size, f)
}
#[allow(unused_variables)]
#[inline]
#[allow(unused)]
fn update(
&self,
state: &mut Self::State,
event: &Event,
bounds: Rectangle,
cursor: Cursor,
) -> (Status, Option<Message>) {
(Status::Ignored, None)
}
#[inline]
#[allow(unused)]
fn mouse_interaction(
&self,
state: &Self::State,
bounds: Rectangle,
cursor: Cursor,
) -> Interaction {
Interaction::Idle
}
}