plotters_iced/
renderer.rs1use iced_widget::{
8 canvas::{Cache, Frame, Geometry},
9 core::{Layout, Size, Vector},
10 text::Shaping,
11};
12use plotters::prelude::DrawingArea;
13
14use crate::backend::IcedChartBackend;
15use crate::Chart;
16
17pub trait Renderer:
19 iced_widget::core::Renderer + iced_widget::core::text::Renderer + iced_graphics::geometry::Renderer
20{
21 fn draw_chart<Message, C>(
23 &mut self,
24 state: &C::State,
25 chart: &C,
26 layout: Layout<'_>,
27 shaping: Shaping,
28 ) where
29 C: Chart<Message>;
30}
31
32impl crate::chart::Renderer for iced_widget::renderer::Renderer {
33 fn draw<F: Fn(&mut Frame)>(&self, size: Size, f: F) -> Geometry {
34 let mut frame = Frame::new(self, size);
35 f(&mut frame);
36 frame.into_geometry()
37 }
38
39 fn draw_cache<F: Fn(&mut Frame)>(&self, cache: &Cache, size: Size, f: F) -> Geometry {
40 cache.draw(self, size, f)
41 }
42}
43
44impl Renderer for iced_widget::renderer::Renderer {
45 fn draw_chart<Message, C>(
46 &mut self,
47 state: &C::State,
48 chart: &C,
49 layout: Layout<'_>,
50 shaping: Shaping,
51 ) where
52 C: Chart<Message>,
53 {
54 let bounds = layout.bounds();
55 if bounds.width < 1.0 || bounds.height < 1.0 {
56 return;
57 }
58 let geometry = chart.draw(self, bounds.size(), |frame| {
59 let backend = IcedChartBackend::new(frame, self, shaping);
60 let root: DrawingArea<_, _> = backend.into();
61 chart.draw_chart(state, root);
62 });
63 let translation = Vector::new(bounds.x, bounds.y);
64 iced_widget::core::Renderer::with_translation(self, translation, |renderer| {
65 iced_graphics::geometry::Renderer::draw_geometry(renderer, geometry);
66 });
67 }
68}