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:
2026-07-07 16:01:01 +03:00
parent 0d494d8e89
commit 87b85ca083
2 changed files with 31 additions and 0 deletions
@@ -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();