diff options
| author | Arne Dußin | 2020-11-01 22:53:24 +0100 |
|---|---|---|
| committer | Arne Dußin | 2020-11-01 22:53:24 +0100 |
| commit | 1ed00daee8f7cb0194d11a2aa32fc8ffc544ae98 (patch) | |
| tree | 86c31f3bcb28be7d762e5d330e1c8aa195daaef5 /src/tool | |
| parent | 678406b21c14af2d1f1bd955368637f83f049011 (diff) | |
| download | graf_karto-1ed00daee8f7cb0194d11a2aa32fc8ffc544ae98.tar.gz graf_karto-1ed00daee8f7cb0194d11a2aa32fc8ffc544ae98.zip | |
Add basic deletion tool
Diffstat (limited to 'src/tool')
| -rw-r--r-- | src/tool/deletion_tool.rs | 69 |
1 files changed, 63 insertions, 6 deletions
diff --git a/src/tool/deletion_tool.rs b/src/tool/deletion_tool.rs index 3eca92a..de4e255 100644 --- a/src/tool/deletion_tool.rs +++ b/src/tool/deletion_tool.rs @@ -1,20 +1,77 @@ use super::Tool; use crate::map_data::MapData; +use crate::math::{Rect, Vec2}; use crate::transform::Transform; -use raylib::core::drawing::RaylibDrawHandle; +use raylib::core::drawing::{RaylibDraw, RaylibDrawHandle}; +use raylib::ffi::{Color, MouseButton}; use raylib::RaylibHandle; -pub struct DeletionTool {} +pub struct DeletionTool { + deletion_rect: Option<(Vec2<f32>, Vec2<f32>)>, +} impl DeletionTool { pub fn new() -> Self { - Self {} + Self { + deletion_rect: None, + } + } + + /// Delete all map-data that is contained inside the provided rectangular space. + pub fn delete_rect(map_data: &mut MapData, rect: Rect<f32>) { + map_data + .rooms_mut() + .retain(|&room| !rect.contains_rect(room)); + map_data + .walls_mut() + .retain(|&(pos1, pos2)| !rect.contains(pos1) || !rect.contains(pos2)); } } impl Tool for DeletionTool { - fn update(&mut self, map_data: &MapData, rl: &RaylibHandle, transform: &Transform) {} - fn active_update(&mut self, map_data: &mut MapData, rl: &RaylibHandle, transform: &Transform) {} + fn active_update(&mut self, map_data: &mut MapData, rl: &RaylibHandle, transform: &Transform) { + let mouse_pos_m = transform.point_px_to_m(rl.get_mouse_position().into()); + if let Some((_, ref mut pos2)) = &mut self.deletion_rect { + *pos2 = mouse_pos_m; + } + + if rl.is_mouse_button_pressed(MouseButton::MOUSE_LEFT_BUTTON) { + if let Some((pos1, pos2)) = self.deletion_rect { + Self::delete_rect(map_data, Rect::bounding_rect(pos1, pos2)); + self.deletion_rect = None; + } else { + self.deletion_rect = Some((mouse_pos_m, mouse_pos_m)) + } + } - fn draw(&self, map_data: &MapData, _rld: &mut RaylibDrawHandle, _transform: &Transform) {} + // Abort deletion. + if rl.is_mouse_button_pressed(MouseButton::MOUSE_RIGHT_BUTTON) { + self.deletion_rect = None; + } + } + + fn draw(&self, map_data: &MapData, rld: &mut RaylibDrawHandle, transform: &Transform) { + if let Some((pos1, pos2)) = self.deletion_rect { + let rect_px = transform.rect_m_to_px(Rect::bounding_rect(pos1, pos2)); + rld.draw_rectangle_rec( + rect_px, + Color { + r: 200, + g: 150, + b: 150, + a: 50, + }, + ); + rld.draw_rectangle_lines_ex( + rect_px, + 4, + Color { + r: 200, + g: 150, + b: 150, + a: 150, + }, + ); + } + } } |
