aboutsummaryrefslogtreecommitdiff
path: root/src/tool/mod.rs
diff options
context:
space:
mode:
authorArne Dußin2020-10-31 01:36:58 +0100
committerArne Dußin2020-10-31 01:36:58 +0100
commit4579d5cb376fdcc58c70d9d7ea8a5064d686ec1d (patch)
tree98bb4b3415601348bffc1176d189264b01c1c558 /src/tool/mod.rs
parentc5b16dd0511997331b8cc8c3647fff95effbe8ec (diff)
downloadgraf_karto-4579d5cb376fdcc58c70d9d7ea8a5064d686ec1d.tar.gz
graf_karto-4579d5cb376fdcc58c70d9d7ea8a5064d686ec1d.zip
Add wall tool
The wall tool is currently just one pixels lines, which must be changed in the future, of course, but this is also to test changing between tools.
Diffstat (limited to 'src/tool/mod.rs')
-rw-r--r--src/tool/mod.rs61
1 files changed, 55 insertions, 6 deletions
diff --git a/src/tool/mod.rs b/src/tool/mod.rs
index e0d4f1e..3e6200f 100644
--- a/src/tool/mod.rs
+++ b/src/tool/mod.rs
@@ -1,16 +1,65 @@
pub mod room_tool;
pub use room_tool::RoomTool;
+pub mod wall_tool;
+pub use wall_tool::WallTool;
+
use crate::transform::Transform;
-use raylib::core::drawing::RaylibDraw;
+use raylib::core::drawing::RaylibDrawHandle;
+use raylib::ffi::KeyboardKey;
use raylib::RaylibHandle;
+#[derive(Debug)]
+#[repr(u8)]
+pub enum ToolType {
+ RoomTool,
+ WallTool,
+ NumTools,
+}
+
pub trait Tool {
- fn update(&mut self, rl: &RaylibHandle, transform: &Transform);
+ fn update(&mut self, rl: &RaylibHandle, transform: &Transform) {}
+ fn active_update(&mut self, rl: &RaylibHandle, transform: &Transform);
+
+ fn draw(&self, _rld: &mut RaylibDrawHandle, _transform: &Transform) {}
+}
+
+pub struct ToolShed {
+ tools: Vec<Box<dyn Tool>>,
+ active: usize,
+}
+
+impl ToolShed {
+ pub fn new() -> Self {
+ let mut tools: Vec<Box<dyn Tool>> = Vec::with_capacity(ToolType::NumTools as usize);
+ assert_eq!(ToolType::RoomTool as u8, 0);
+ tools.push(Box::new(RoomTool::new()));
+ assert_eq!(ToolType::WallTool as u8, 1);
+ tools.push(Box::new(WallTool::new()));
+
+ Self { tools, active: 0 }
+ }
+
+ pub fn update(&mut self, rl: &RaylibHandle, transform: &Transform) {
+ // Handle keybindings for tool change
+ self.active = if rl.is_key_pressed(KeyboardKey::KEY_R) {
+ ToolType::RoomTool as usize
+ } else if rl.is_key_pressed(KeyboardKey::KEY_W) {
+ ToolType::WallTool as usize
+ } else {
+ self.active
+ };
+
+ for tool in &mut self.tools {
+ tool.update(rl, transform);
+ }
+
+ self.tools[self.active].active_update(rl, transform);
+ }
- fn draw<D>(&self, _rld: &mut D, _transform: &Transform)
- where
- D: RaylibDraw,
- {
+ pub fn draw_tools(&self, rld: &mut RaylibDrawHandle, transform: &Transform) {
+ for tool in &self.tools {
+ tool.draw(rld, transform);
+ }
}
}