use super::Tool; use crate::colours::DEFAULT_COLOURS; use crate::map::Map; use crate::math::{Rect, Vec2}; use crate::transform::Transform; use raylib::core::drawing::{RaylibDraw, RaylibDrawHandle}; pub struct RectRoomTool { /// The rectangle that is currently being drawn by the user. Once it is finished, it will be /// pushed into the room_rects. unfinished_rect: Option<(Vec2, Vec2)>, } impl RectRoomTool { /// Create a new room tool where no rooms have been drawn yet. pub fn new() -> Self { Self { unfinished_rect: None, } } } impl Tool for RectRoomTool { fn deactivate(&mut self) { self.unfinished_rect = None; } fn update(&mut self, _map: &Map, mouse_pos_m: &Vec2) { if let Some((_, ref mut pos2)) = &mut self.unfinished_rect { *pos2 = *mouse_pos_m; } } fn draw(&self, rld: &mut RaylibDrawHandle, transform: &Transform) { if let Some((pos1, pos2)) = self.unfinished_rect { rld.draw_rectangle_rec( transform.rect_m_to_px(&Rect::bounding_rect(pos1, pos2)), DEFAULT_COLOURS.room_selected, ); } } fn place_single(&mut self, map: &mut Map, mouse_pos_m: &Vec2) { // Try to finish the rectangle if it has been started. if let Some((pos1, pos2)) = self.unfinished_rect { if pos1 == pos2 { warn!("Cannot place rectangle with start and endpoint being the same"); return; } map.push_rect_room(Rect::bounding_rect(pos1, pos2)); self.unfinished_rect = None; } else { self.unfinished_rect = Some((*mouse_pos_m, *mouse_pos_m)); } } fn finish(&mut self, map: &mut Map) { if let Some((pos1, pos2)) = self.unfinished_rect { if pos1 == pos2 { warn!("Cannot place rectangle with start and endpoint being the same"); return; } map.push_rect_room(Rect::bounding_rect(pos1, pos2)); self.unfinished_rect = None; } } fn abort(&mut self) { self.unfinished_rect = None; } }