diff options
Diffstat (limited to 'src/gate.rs')
| -rw-r--r-- | src/gate.rs | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/src/gate.rs b/src/gate.rs new file mode 100644 index 0000000..bb27a6d --- /dev/null +++ b/src/gate.rs @@ -0,0 +1,111 @@ +use macroquad::prelude::*; + +pub struct Rec { + x: f32, + y: f32, + w: f32, + h: f32, + color: Color, +} + +#[derive(Default, Debug, PartialEq)] +enum State { + #[default] + Idle, + DragStart, + Dragging, + DragStop, +} + +pub struct Connection { + radius: f32, + color: Color, +} + +impl Rec { + pub fn new(x: f32, y: f32, w: f32, h: f32, color: Color) -> Self { + Rec { x, y, w, h, color } + } + + fn contains(&self, pos: (f32, f32)) -> bool { + pos.0 >= self.x && pos.0 <= self.x + self.w && pos.1 >= self.y && pos.1 <= self.y + self.h + } +} + +impl Connection { + pub fn new(radius: f32, color: Color) -> Connection { + Connection { radius, color } + } +} + +pub struct Gate { + rect: Rec, + input: Vec<Connection>, + output: Connection, + state: State, +} + +impl Gate { + pub fn new(rect: Rec, input: Vec<Connection>, output: Connection) -> Gate { + Gate { + rect, + input, + output, + state: State::default(), + } + } + + pub fn draw(&mut self) { + if is_mouse_button_pressed(MouseButton::Left) && self.rect.contains(mouse_position()) { + self.state = State::DragStart; + } else if is_mouse_button_down(MouseButton::Left) + && self.rect.contains(mouse_position()) + && self.state == State::DragStart + || self.state == State::Dragging + { + self.state = State::Dragging; + } + if is_mouse_button_released(MouseButton::Left) { + self.state = State::DragStop; + } + + println!("{:?}", self.state); + + match self.state { + State::Dragging => { + self.rect.x = mouse_position().0; + self.rect.y = mouse_position().1; + self.draw_helper(); + } + _ => { + self.draw_helper(); + } + } + } + + fn draw_helper(&mut self) { + draw_rectangle( + self.rect.x, + self.rect.y, + self.rect.w, + self.rect.h, + self.rect.color, + ); + + for (cnt, node) in self.input.iter().enumerate() { + draw_circle( + self.rect.x, + self.rect.y + 25. + (30. * cnt as f32), + node.radius, + node.color, + ); + } + + draw_circle( + self.rect.x + self.rect.w, + self.rect.y + self.rect.h / 2., + self.output.radius, + self.output.color, + ); + } +} |
