diff options
| author | Arne Dußin | 2021-01-06 22:56:37 +0100 |
|---|---|---|
| committer | Arne Dußin | 2021-01-06 22:56:37 +0100 |
| commit | fa1afb6be3ba2d521eb0791edc0bb8e631a85327 (patch) | |
| tree | e0a365444784efaaeb1eea6373b34559b6d57fbc /src/cli/mod.rs | |
| parent | 1c81d7c70fe891e6ded49d49d6a09f04ce74dd6e (diff) | |
| parent | 30b23db9e86fdf72a4e7de72213df274ce19123e (diff) | |
| download | graf_karto-fa1afb6be3ba2d521eb0791edc0bb8e631a85327.tar.gz graf_karto-fa1afb6be3ba2d521eb0791edc0bb8e631a85327.zip | |
Merge branch 'master' into snapping
Diffstat (limited to 'src/cli/mod.rs')
| -rw-r--r-- | src/cli/mod.rs | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/src/cli/mod.rs b/src/cli/mod.rs new file mode 100644 index 0000000..e96070f --- /dev/null +++ b/src/cli/mod.rs @@ -0,0 +1,104 @@ +//! In-window Command line interface. Used for operations that are just easier than with GUI. +//! +//! Sometimes it is nice to have a GUI, for instance when a selection has to be made, things have to +//! be moved etc., however for operations like saving/loading and exporting, no such thing has to be +//! done and the GUI is really just slowing you down (at least in my opinion). For these operations, +//! it is much better to simply have a command do that specific thing. It is also much easier to +//! implement a new command, so features can be tested more quickly. For some things, there should +//! still be a GUI option. With the example of saving/loading, it is much easier to find some hidden +//! folder in a GUI, so that is definitely a consideration for the future. + +pub mod cmd; +pub use self::cmd::*; + +use crate::colours::DEFAULT_COLOURS; +use crate::math::Vec2; +use crate::Editor; +use raylib::drawing::{RaylibDraw, RaylibDrawHandle}; +use raylib::ffi::KeyboardKey; +use raylib::RaylibHandle; + +/// The command line interface. Should be created only once per program instance. +pub struct CLI { + text: String, + active: bool, +} + +impl CLI { + /// Create a CLI for this instance + pub fn new() -> Self { + Self { + text: String::new(), + active: false, + } + } + + /// Activates the CLI, which will now capture keyboard input and execute commands accordingly. + pub fn activate(&mut self) { + if !self.active { + self.text = ";".to_owned(); + self.active = true; + } + } + + /// Handle input for the command line and perform any commands the user may want to run. + pub fn update(&mut self, rl: &mut RaylibHandle, editor: &mut Editor) { + /* Check if the CLI is currently active. If not and it should not be activated according to + * keyboard input, there is nothing to do. + */ + if !self.active { + if rl.is_key_pressed(KeyboardKey::KEY_SEMICOLON) { + // Don't write the keypress again. + rl.get_key_pressed(); + self.activate(); + } else { + return; + } + } + + // The CLI is currently active. Handle input to it. + if let Some(key) = rl.get_key_pressed_number() { + self.text.push(key as u8 as char); + } else if rl.is_key_pressed(KeyboardKey::KEY_BACKSPACE) { + self.text.pop(); + } else if rl.is_key_pressed(KeyboardKey::KEY_ESCAPE) { + self.text.clear(); + } + + // When the text is empty, there is also no command marker, so set as inactive and leave. + if self.text.is_empty() { + self.active = false; + return; + } + + // Perform the entered command, when the enter-key is pressed. + if rl.is_key_pressed(KeyboardKey::KEY_ENTER) { + self.active = false; + match cmd::parse_command(&self.text[1..]) { + Ok(cmd) => match cmd.process(editor) { + Ok(res) => self.text = format!("SUCCESS: {}", res), + Err(err) => self.text = format!("ERROR: {}", err), + }, + Err(err) => self.text = format!("SYNTAX ERROR: {}", err), + } + } + } + + /// Draw the command line at the bottom of the window. + pub fn draw(&self, rld: &mut RaylibDrawHandle) { + let pos = Vec2::new(150., rld.get_screen_height() as f32 - 25.); + + rld.draw_rectangle_v( + pos, + Vec2::new(rld.get_screen_width() as f32 - pos.x, 25.), + DEFAULT_COLOURS.cli_background, + ); + rld.draw_text( + &self.text, + 155, + rld.get_screen_height() - 22, + 20, + DEFAULT_COLOURS.cli_foreground, + ); + } +} |
