aboutsummaryrefslogtreecommitdiff
path: root/src/cli/mod.rs
diff options
context:
space:
mode:
authorArne Dußin2021-01-06 22:56:37 +0100
committerArne Dußin2021-01-06 22:56:37 +0100
commitfa1afb6be3ba2d521eb0791edc0bb8e631a85327 (patch)
treee0a365444784efaaeb1eea6373b34559b6d57fbc /src/cli/mod.rs
parent1c81d7c70fe891e6ded49d49d6a09f04ce74dd6e (diff)
parent30b23db9e86fdf72a4e7de72213df274ce19123e (diff)
downloadgraf_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.rs104
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,
+ );
+ }
+}