• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 use std::ops::Range;
2 
3 use plotters_backend::{BackendCoord, DrawingBackend};
4 
5 use crate::chart::{ChartContext, DualCoordChartContext, MeshStyle};
6 use crate::coord::{
7     cartesian::Cartesian2d,
8     ranged1d::{AsRangedCoord, Ranged, ValueFormatter},
9     Shift,
10 };
11 use crate::drawing::DrawingArea;
12 
13 mod draw_impl;
14 
15 impl<'a, DB, XT, YT, X, Y> ChartContext<'a, DB, Cartesian2d<X, Y>>
16 where
17     DB: DrawingBackend,
18     X: Ranged<ValueType = XT> + ValueFormatter<XT>,
19     Y: Ranged<ValueType = YT> + ValueFormatter<YT>,
20 {
is_overlapping_drawing_area( &self, area: Option<&DrawingArea<DB, Shift>>, ) -> bool21     pub(crate) fn is_overlapping_drawing_area(
22         &self,
23         area: Option<&DrawingArea<DB, Shift>>,
24     ) -> bool {
25         if let Some(area) = area {
26             let (x0, y0) = area.get_base_pixel();
27             let (w, h) = area.dim_in_pixel();
28             let (x1, y1) = (x0 + w as i32, y0 + h as i32);
29             let (dx0, dy0) = self.drawing_area.get_base_pixel();
30             let (w, h) = self.drawing_area.dim_in_pixel();
31             let (dx1, dy1) = (dx0 + w as i32, dy0 + h as i32);
32 
33             let (ox0, ox1) = (x0.max(dx0), x1.min(dx1));
34             let (oy0, oy1) = (y0.max(dy0), y1.min(dy1));
35 
36             ox1 > ox0 && oy1 > oy0
37         } else {
38             false
39         }
40     }
41 
42     /// Initialize a mesh configuration object and mesh drawing can be finalized by calling
43     /// the function `MeshStyle::draw`.
configure_mesh(&mut self) -> MeshStyle<'a, '_, X, Y, DB>44     pub fn configure_mesh(&mut self) -> MeshStyle<'a, '_, X, Y, DB> {
45         MeshStyle::new(self)
46     }
47 }
48 
49 impl<'a, DB: DrawingBackend, X: Ranged, Y: Ranged> ChartContext<'a, DB, Cartesian2d<X, Y>> {
50     /// Get the range of X axis
x_range(&self) -> Range<X::ValueType>51     pub fn x_range(&self) -> Range<X::ValueType> {
52         self.drawing_area.get_x_range()
53     }
54 
55     /// Get range of the Y axis
y_range(&self) -> Range<Y::ValueType>56     pub fn y_range(&self) -> Range<Y::ValueType> {
57         self.drawing_area.get_y_range()
58     }
59 
60     /// Maps the coordinate to the backend coordinate. This is typically used
61     /// with an interactive chart.
backend_coord(&self, coord: &(X::ValueType, Y::ValueType)) -> BackendCoord62     pub fn backend_coord(&self, coord: &(X::ValueType, Y::ValueType)) -> BackendCoord {
63         self.drawing_area.map_coordinate(coord)
64     }
65 }
66 
67 impl<'a, DB: DrawingBackend, X: Ranged, Y: Ranged> ChartContext<'a, DB, Cartesian2d<X, Y>> {
68     /// Convert this chart context into a dual axis chart context and attach a second coordinate spec
69     /// on the chart context. For more detailed information, see documentation for [struct DualCoordChartContext](struct.DualCoordChartContext.html)
70     ///
71     /// - `x_coord`: The coordinate spec for the X axis
72     /// - `y_coord`: The coordinate spec for the Y axis
73     /// - **returns** The newly created dual spec chart context
74     #[allow(clippy::type_complexity)]
set_secondary_coord<SX: AsRangedCoord, SY: AsRangedCoord>( self, x_coord: SX, y_coord: SY, ) -> DualCoordChartContext< 'a, DB, Cartesian2d<X, Y>, Cartesian2d<SX::CoordDescType, SY::CoordDescType>, >75     pub fn set_secondary_coord<SX: AsRangedCoord, SY: AsRangedCoord>(
76         self,
77         x_coord: SX,
78         y_coord: SY,
79     ) -> DualCoordChartContext<
80         'a,
81         DB,
82         Cartesian2d<X, Y>,
83         Cartesian2d<SX::CoordDescType, SY::CoordDescType>,
84     > {
85         let mut pixel_range = self.drawing_area.get_pixel_range();
86         pixel_range.1 = pixel_range.1.end..pixel_range.1.start;
87 
88         DualCoordChartContext::new(self, Cartesian2d::new(x_coord, y_coord, pixel_range))
89     }
90 }
91