1 | **use** plotters_backend::BackendCoord; |

2 | **use** std::ops::Deref; |

3 | |

4 | */// The trait that translates some customized object to the backend coordinate* |

5 | **pub** **trait** CoordTranslate { |

6 | */// Specifies the object to be translated from* |

7 | **type** From; |

8 | |

9 | */// Translate the guest coordinate to the guest coordinate* |

10 | **fn** translate(&self, from: &Self::From) -> BackendCoord; |

11 | |

12 | */// Get the Z-value of current coordinate* |

13 | **fn** depth(&self, _from: &Self::From) -> **i32** { |

14 | `0` |

15 | } |

16 | } |

17 | |

18 | **impl**<C, T> CoordTranslate **for** T |

19 | **where** |

20 | C: CoordTranslate, |

21 | T: Deref<Target = C>, |

22 | { |

23 | **type** From = C::From; |

24 | **fn** translate(&self, from: &Self::From) -> BackendCoord { |

25 | self.deref().translate(from) |

26 | } |

27 | } |

28 | |

29 | */// The trait indicates that the coordinate system supports reverse transform* |

30 | */// This is useful when we need an interactive plot, thus we need to map the event* |

31 | */// from the backend coordinate to the logical coordinate* |

32 | **pub** **trait** ReverseCoordTranslate: CoordTranslate { |

33 | */// Reverse translate the coordinate from the drawing coordinate to the* |

34 | */// logic coordinate.* |

35 | */// Note: the return value is an option, because it's possible that the drawing* |

36 | */// coordinate isn't able to be represented in te guest coordinate system* |

37 | **fn** reverse_translate(&self, input: BackendCoord) -> Option<Self::From>; |

38 | } |

39 | |