rectangle.rs 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. use std::fmt::Debug;
  2. use binrw::{BinRead, BinWrite};
  3. use diff::Diff;
  4. use crate::{
  5. field_of::FieldOf,
  6. types::{Coordinate, ObjectType, F64},
  7. };
  8. use super::{ObjectCore, ObjectModifier, Translate};
  9. #[derive(BinRead, BinWrite, Clone, Debug, Diff, PartialEq)]
  10. #[diff(attr(
  11. #[derive(Debug, PartialEq)]
  12. ))]
  13. pub struct Rectangle {
  14. pub core: ObjectCore,
  15. #[brw(magic(8u32))] // Number of following fields in struct
  16. pub drawn_corner_a: FieldOf<Coordinate>,
  17. pub drawn_corner_b: FieldOf<Coordinate>,
  18. pub round_bottom_left: F64,
  19. pub round_bottom_right: F64,
  20. pub round_top_right: F64,
  21. pub round_top_left: F64,
  22. pub modifier: ObjectModifier,
  23. }
  24. impl Default for Rectangle {
  25. fn default() -> Self {
  26. Self {
  27. core: ObjectCore::default(ObjectType::Rectangle),
  28. drawn_corner_a: Coordinate { x: 0.0, y: 0.0 }.into(),
  29. drawn_corner_b: Coordinate { x: 0.0, y: 0.0 }.into(),
  30. round_bottom_left: 0.0.into(),
  31. round_bottom_right: 0.0.into(),
  32. round_top_right: 0.0.into(),
  33. round_top_left: 0.0.into(),
  34. modifier: ObjectModifier::default(),
  35. }
  36. }
  37. }
  38. // origin_x = x_corretion + (drawn_a.x + drawn_b.x) / 2 * x_scale
  39. // x_correction = origin_x - (drawn_a.x + drawn_b.x) / 2 * x_scale
  40. impl Translate for Rectangle {
  41. fn move_absolute(&mut self, origin: Option<Coordinate>, z: Option<f64>) {
  42. origin.map(|origin| {
  43. let delta: Coordinate = origin - *self.core.origin;
  44. self.modifier.move_relative(delta);
  45. });
  46. self.core.move_absolute(origin, z);
  47. }
  48. fn move_relative(&mut self, delta: Option<Coordinate>, z: Option<f64>) {
  49. delta.map(|delta| {
  50. self.modifier.move_relative(delta);
  51. });
  52. self.core.move_relative(delta, z);
  53. }
  54. }