1use crate::{
2 draw::{
3 pen::{
4 Pen,
5 PenPos
6 },
7 drawing::Drawing
8 },
9 color::Color,
10 angle::Angle,
11 position::Distance
12};
13
14pub struct TurtleSvg {
16 drawing: Drawing,
17 pen: Pen,
18}
19
20impl Default for TurtleSvg {
21 fn default() -> Self {
22 Self {
23 drawing: Drawing::default(),
24 pen: Pen::default(),
25 }
26 }
27}
28
29impl TurtleSvg {
30 pub fn new() -> Self {
31 Self::default()
32 }
33
34 pub fn drawing_mut(&mut self) -> &mut Drawing {
36 &mut self.drawing
37 }
38
39 pub fn pen_mut(&mut self) -> &mut Pen {
41 &mut self.pen
42 }
43
44 pub fn forward(&mut self, distance: Distance) {
46 if self.pen.is_down() == false {
47 return
48 }
49
50 let mut pen = self.pen;
51
52 self.drawing.forward(&mut pen, distance);
53
54 self.pen = pen;
55 }
56
57 pub fn backward(&mut self, distance: Distance) {
59 if self.pen.is_down() == false {
60 return
61 }
62
63 let mut pen = self.pen;
64
65 self.drawing.backward(&mut pen, distance);
66
67 self.pen = pen;
68 }
69
70 pub fn left<A: Into<Angle>>(&mut self, angle: A) {
72 let angle = self.pen.angle.degrees() - angle.into().degrees();
73
74 self.pen_mut().angle.set_degrees(angle);
75 }
76
77 pub fn right<A: Into<Angle>>(&mut self, angle: A) {
79 let angle = self.pen.angle.degrees() + angle.into().degrees();
80
81 self.pen_mut().angle.set_degrees(angle);
82 }
83
84 pub fn pen_up(&mut self) {
86 self.pen_mut().up();
87 }
88
89 pub fn pen_down(&mut self) {
91 self.pen_mut().down();
92 }
93
94 pub fn set_pen_color<C: Into<Color>>(&mut self, color: C) {
96 self.pen_mut().color = color.into();
97 }
98
99 pub fn set_pen_size(&mut self, thickness: f64) {
101 self.pen_mut().thickness = thickness;
102 }
103
104 pub fn heading(&self) -> Angle {
106 self.pen.angle
107 }
108
109 pub fn set_heading<A: Into<Angle>>(&mut self, angle: A) {
111 self.pen_mut().angle = angle.into();
112 }
113
114 pub fn set_background_color<C: Into<Color>>(&mut self, color: C) {
116 self.drawing_mut().set_background_color(color);
117 }
118
119 pub fn reset(&mut self) {
121 *self = Self::default()
122 }
123
124 pub fn go_to<P: Into<PenPos>>(&mut self, position: P) {
126 self.pen_mut().position = position.into();
127 }
128
129 pub fn position(&mut self) -> PenPos {
131 self.pen.position
132 }
133}