logo_runtime/
state.rs

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}