plotters_iced/
renderer.rs

1// plotters-iced
2//
3// Iced backend for Plotters
4// Copyright: 2022, Joylei <leingliu@gmail.com>
5// License: MIT
6
7use 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
17/// Graphics Renderer
18pub trait Renderer:
19    iced_widget::core::Renderer + iced_widget::core::text::Renderer + iced_graphics::geometry::Renderer
20{
21    /// draw a [Chart]
22    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}