use crate::{
draw::{
pen::{
Pen,
PenPos
},
drawing::Drawing
},
color::Color,
angle::Angle,
position::Distance
};
pub struct TurtleSvg {
drawing: Drawing,
pen: Pen,
}
impl Default for TurtleSvg {
fn default() -> Self {
Self {
drawing: Drawing::default(),
pen: Pen::default(),
}
}
}
impl TurtleSvg {
pub fn new() -> Self {
Self::default()
}
pub fn drawing_mut(&mut self) -> &mut Drawing {
&mut self.drawing
}
pub fn pen_mut(&mut self) -> &mut Pen {
&mut self.pen
}
pub fn forward(&mut self, distance: Distance) {
if self.pen.is_down() == false {
return
}
let mut pen = self.pen;
self.drawing.forward(&mut pen, distance);
self.pen = pen;
}
pub fn backward(&mut self, distance: Distance) {
if self.pen.is_down() == false {
return
}
let mut pen = self.pen;
self.drawing.backward(&mut pen, distance);
self.pen = pen;
}
pub fn left<A: Into<Angle>>(&mut self, angle: A) {
let angle = self.pen.angle.degrees() - angle.into().degrees();
self.pen_mut().angle.set_degrees(angle);
}
pub fn right<A: Into<Angle>>(&mut self, angle: A) {
let angle = self.pen.angle.degrees() + angle.into().degrees();
self.pen_mut().angle.set_degrees(angle);
}
pub fn pen_up(&mut self) {
self.pen_mut().up();
}
pub fn pen_down(&mut self) {
self.pen_mut().down();
}
pub fn set_pen_color<C: Into<Color>>(&mut self, color: C) {
self.pen_mut().color = color.into();
}
pub fn set_pen_size(&mut self, thickness: f64) {
self.pen_mut().thickness = thickness;
}
pub fn heading(&self) -> Angle {
self.pen.angle
}
pub fn set_heading<A: Into<Angle>>(&mut self, angle: A) {
self.pen_mut().angle = angle.into();
}
pub fn set_background_color<C: Into<Color>>(&mut self, color: C) {
self.drawing_mut().set_background_color(color);
}
pub fn reset(&mut self) {
*self = Self::default()
}
pub fn go_to<P: Into<PenPos>>(&mut self, position: P) {
self.pen_mut().position = position.into();
}
pub fn position(&mut self) -> PenPos {
self.pen.position
}
}