diff options
-rw-r--r-- | src/app.rs | 33 | ||||
-rw-r--r-- | src/command.rs | 45 |
2 files changed, 70 insertions, 8 deletions
@@ -1,7 +1,7 @@ | |||
1 | use crate::{ | 1 | use crate::{ |
2 | bitmap::{MapPoint, Pixmap}, | 2 | bitmap::{MapPoint, Pixmap}, |
3 | command::CommandBox, | 3 | command::CommandBox, |
4 | consts::colors::*, | 4 | consts::{colors::*, FONT_PATH}, |
5 | dither, rect, | 5 | dither, rect, |
6 | symmetry::Symmetry, | 6 | symmetry::Symmetry, |
7 | undo::{ModifyRecord, OpKind, Operation, UndoStack}, | 7 | undo::{ModifyRecord, OpKind, Operation, UndoStack}, |
@@ -352,6 +352,20 @@ impl<'ctx> AppState<'ctx> { | |||
352 | BLACK, | 352 | BLACK, |
353 | (0, winsize_y - cmd_height), | 353 | (0, winsize_y - cmd_height), |
354 | ); | 354 | ); |
355 | |||
356 | self.canvas.set_draw_color(PINK); | ||
357 | let mut font = self.ttf_context.load_font(FONT_PATH, 17).unwrap(); | ||
358 | font.set_style(sdl2::ttf::FontStyle::NORMAL); | ||
359 | font.set_hinting(sdl2::ttf::Hinting::Mono); | ||
360 | let prev_text = &self.command_box.text[..self.command_box.cursor]; | ||
361 | let prev_text_dim = font.size_of_latin1(prev_text.as_bytes()).unwrap(); | ||
362 | let cursor = rect!( | ||
363 | prev_text_dim.0, | ||
364 | winsize_y - cmd_height + 2, | ||
365 | 2, | ||
366 | cmd_height - 4 | ||
367 | ); | ||
368 | self.canvas.fill_rect(cursor).unwrap(); | ||
355 | } | 369 | } |
356 | 370 | ||
357 | fn draw_mouse(&mut self) { | 371 | fn draw_mouse(&mut self) { |
@@ -641,7 +655,9 @@ impl<'ctx> AppState<'ctx> { | |||
641 | } | 655 | } |
642 | } | 656 | } |
643 | if let Event::KeyDown { | 657 | if let Event::KeyDown { |
644 | keycode: Some(k), .. | 658 | keycode: Some(k), |
659 | keymod, | ||
660 | .. | ||
645 | } = event | 661 | } = event |
646 | { | 662 | { |
647 | match k { | 663 | match k { |
@@ -651,9 +667,16 @@ impl<'ctx> AppState<'ctx> { | |||
651 | Keycode::Right => self.command_box.forward(), | 667 | Keycode::Right => self.command_box.forward(), |
652 | Keycode::Up => self.command_box.hist_prev(), | 668 | Keycode::Up => self.command_box.hist_prev(), |
653 | Keycode::Down => self.command_box.hist_next(), | 669 | Keycode::Down => self.command_box.hist_next(), |
654 | Keycode::Return => { | 670 | _ if keymod == Mod::LCTRLMOD => match k { |
655 | self.eval_command(); | 671 | Keycode::A => self.command_box.cursor_start(), |
656 | } | 672 | Keycode::E => self.command_box.cursor_end(), |
673 | Keycode::F => self.command_box.forward(), | ||
674 | Keycode::B => self.command_box.backward(), | ||
675 | Keycode::K => self.command_box.delete_to_end(), | ||
676 | Keycode::U => self.command_box.delete_to_start(), | ||
677 | _ => (), | ||
678 | }, | ||
679 | Keycode::Return => self.eval_command(), | ||
657 | Keycode::Escape => { | 680 | Keycode::Escape => { |
658 | self.command_box.clear(); | 681 | self.command_box.clear(); |
659 | self.mode = Mode::Draw; | 682 | self.mode = Mode::Draw; |
diff --git a/src/command.rs b/src/command.rs index 064d767..d80f1f2 100644 --- a/src/command.rs +++ b/src/command.rs | |||
@@ -22,11 +22,11 @@ impl CommandBox { | |||
22 | } | 22 | } |
23 | } | 23 | } |
24 | 24 | ||
25 | fn cursor_end(&mut self) { | 25 | pub fn cursor_end(&mut self) { |
26 | self.cursor = self.text.len(); | 26 | self.cursor = self.text.len(); |
27 | } | 27 | } |
28 | 28 | ||
29 | fn cursor_start(&mut self) { | 29 | pub fn cursor_start(&mut self) { |
30 | self.cursor = 0; | 30 | self.cursor = 0; |
31 | } | 31 | } |
32 | 32 | ||
@@ -47,8 +47,17 @@ impl CommandBox { | |||
47 | } | 47 | } |
48 | } | 48 | } |
49 | 49 | ||
50 | pub fn delete_to_end(&mut self) { | ||
51 | self.text.truncate(self.cursor); | ||
52 | } | ||
53 | |||
54 | pub fn delete_to_start(&mut self) { | ||
55 | self.text = self.text.chars().skip(self.cursor).collect(); | ||
56 | self.cursor = 0; | ||
57 | } | ||
58 | |||
50 | pub fn push_str(&mut self, v: &str) { | 59 | pub fn push_str(&mut self, v: &str) { |
51 | self.text.push_str(v); | 60 | self.text.insert_str(self.cursor, v); |
52 | self.cursor += v.len(); | 61 | self.cursor += v.len(); |
53 | } | 62 | } |
54 | 63 | ||
@@ -143,6 +152,36 @@ mod command_tests { | |||
143 | } | 152 | } |
144 | 153 | ||
145 | #[test] | 154 | #[test] |
155 | fn entering_text_between() { | ||
156 | let mut cmd = setup_with("save as file.png"); | ||
157 | cmd.backward(); | ||
158 | cmd.backward(); | ||
159 | cmd.backward(); | ||
160 | cmd.push_str("ext"); | ||
161 | assert_eq!(&cmd.text, "save as file.extpng"); | ||
162 | } | ||
163 | |||
164 | #[test] | ||
165 | fn delete_to_end() { | ||
166 | let mut cmd = setup_with("save as file.png"); | ||
167 | cmd.backward(); | ||
168 | cmd.backward(); | ||
169 | cmd.backward(); | ||
170 | cmd.delete_to_end(); | ||
171 | assert_eq!(&cmd.text, "save as file."); | ||
172 | } | ||
173 | |||
174 | #[test] | ||
175 | fn delete_to_start() { | ||
176 | let mut cmd = setup_with("save as file.png"); | ||
177 | cmd.backward(); | ||
178 | cmd.backward(); | ||
179 | cmd.backward(); | ||
180 | cmd.delete_to_start(); | ||
181 | assert_eq!(&cmd.text, "png"); | ||
182 | } | ||
183 | |||
184 | #[test] | ||
146 | fn backspacing_from_end() { | 185 | fn backspacing_from_end() { |
147 | let mut cmd = setup_with("save"); | 186 | let mut cmd = setup_with("save"); |
148 | cmd.backspace(); | 187 | cmd.backspace(); |