W66: Editor Delete command in Edit menu (MC CK_Remove)
Add Delete EditorCmd variant and wire it into the F9 Edit menu between Paste and Select All. With a selection, deletes the selected text. Without a selection, deletes one character forward (select_right + delete_selection). Added 1 unit test verifying single-character forward delete. Tests: 1425 pass (was 1424), zero warnings.
This commit is contained in:
@@ -91,6 +91,8 @@ pub enum EditorCmd {
|
||||
Close,
|
||||
/// Toggle insert/overwrite mode (INS key, MC CK_InsertOverwrite).
|
||||
ToggleOverwrite,
|
||||
/// Delete character/selection (MC CK_Remove).
|
||||
Delete,
|
||||
}
|
||||
|
||||
/// Outcome of a menu-bar key press.
|
||||
@@ -215,6 +217,7 @@ impl EditorMenuBar {
|
||||
MenuItem::item("Cut", 'x', EditorCmd::Cut),
|
||||
MenuItem::item("Copy", 'c', EditorCmd::Copy),
|
||||
MenuItem::item("Paste", 'v', EditorCmd::Paste),
|
||||
MenuItem::item("Delete", 'd', EditorCmd::Delete),
|
||||
MenuItem::separator(),
|
||||
MenuItem::item("Select all", 'a', EditorCmd::MarkAll),
|
||||
],
|
||||
|
||||
@@ -1310,6 +1310,23 @@ impl Editor {
|
||||
self.message = Some("Block copied".to_string());
|
||||
}
|
||||
}
|
||||
EditorCmd::Delete => {
|
||||
if self.cursor.has_selection() {
|
||||
self.cursor.delete_selection(&mut self.buffer);
|
||||
self.cursor.set_position(self.buffer.cursor(), &self.buffer);
|
||||
self.modified = self.buffer.is_modified();
|
||||
self.message = Some("Deleted".to_string());
|
||||
} else {
|
||||
// Delete forward one character.
|
||||
self.cursor.set_position(self.buffer.cursor(), &self.buffer);
|
||||
let _ = self.cursor.select_right(&mut self.buffer);
|
||||
if self.cursor.has_selection() {
|
||||
self.cursor.delete_selection(&mut self.buffer);
|
||||
self.cursor.set_position(self.buffer.cursor(), &self.buffer);
|
||||
self.modified = self.buffer.is_modified();
|
||||
}
|
||||
}
|
||||
}
|
||||
EditorCmd::Paste => {
|
||||
if let Some(text) = self.clipboard.clone() {
|
||||
if self.cursor.has_selection() {
|
||||
@@ -3922,6 +3939,17 @@ mod tests {
|
||||
assert!(e.mode.is_prompt());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn delete_forward_without_selection_removes_one_char() {
|
||||
let mut e = make_empty();
|
||||
e.insert_str("ab");
|
||||
e.buffer.set_cursor(0);
|
||||
e.cursor.set_position(0, &e.buffer);
|
||||
let _ = e.dispatch_editor_cmd(crate::editor::menubar::EditorCmd::Delete);
|
||||
assert_eq!(e.buffer.len(), 1);
|
||||
assert_eq!(e.buffer.as_string(), "b");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn toggle_overwrite_cycles_ovr_ins() {
|
||||
let mut e = make_empty();
|
||||
|
||||
Reference in New Issue
Block a user