aboutsummaryrefslogtreecommitdiff
path: root/src/tool/deletion_tool.rs
diff options
context:
space:
mode:
authorArne Dußin2020-11-01 22:53:24 +0100
committerArne Dußin2020-11-01 22:53:24 +0100
commit1ed00daee8f7cb0194d11a2aa32fc8ffc544ae98 (patch)
tree86c31f3bcb28be7d762e5d330e1c8aa195daaef5 /src/tool/deletion_tool.rs
parent678406b21c14af2d1f1bd955368637f83f049011 (diff)
downloadgraf_karto-1ed00daee8f7cb0194d11a2aa32fc8ffc544ae98.tar.gz
graf_karto-1ed00daee8f7cb0194d11a2aa32fc8ffc544ae98.zip
Add basic deletion tool
Diffstat (limited to 'src/tool/deletion_tool.rs')
-rw-r--r--src/tool/deletion_tool.rs69
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,
+ },
+ );
+ }
+ }
}