1use wasm_bindgen::prelude::*;
2use crate::colors::LogoColor;
3use crate::common::*;
4
5pub trait Delegate {
6 fn clear_graphics(&mut self);
7 fn draw_line(&mut self, from: Pos, to: Pos, pen_size: f64, color: LogoColor);
8 fn fill(&mut self, pos: Pos, color: LogoColor);
9 fn show(&mut self, message: &str);
10}
11
12pub struct NoOpDelegate {}
13
14impl Delegate for NoOpDelegate {
15 fn clear_graphics(&mut self) {}
16 fn draw_line(&mut self, _from: Pos, _to: Pos, _pen_size: f64, _color: LogoColor) {}
17 fn fill(&mut self, _pos: Pos, _color: LogoColor) {}
18 fn show(&mut self, _message: &str) {}
19}
20
21#[wasm_bindgen]
22#[derive(Copy, Clone, PartialEq)]
23pub enum PenState {
24 Up,
25 Down,
26 Erase
27}
28
29#[wasm_bindgen]
30#[derive(Copy, Clone)]
31pub struct StateData {
32 pub canvas_width: i32,
33 pub canvas_height: i32,
34 pub turtle_pos: Pos,
35 pub turtle_angle: f64,
36 pub turtle_visible: bool,
37 pub pen_state: PenState,
38 pub pen_size: f64,
39 pub color_idx: i32,
40}
41
42pub struct State<D: Delegate> {
43 pub data: StateData,
44 pub delegate: D,
45}
46
47impl<D: Delegate> State<D> {
48 pub fn new(canvas_width: i32, canvas_height: i32, delegate: D) -> Self {
49 State {
50 data: StateData {
51 canvas_width,
52 canvas_height,
53 turtle_pos: Pos { x: 0f64, y: 0f64 },
54 turtle_angle: 0f64,
55 turtle_visible: true,
56 pen_state: PenState::Down,
57 pen_size: 1f64,
58 color_idx: 9,
59 },
60 delegate
61 }
62 }
63}