cursor placement is now remembered

This commit is contained in:
filipriec
2025-02-20 13:39:29 +01:00
parent 6b58c26009
commit 22d2619a4a

View File

@@ -12,6 +12,7 @@ pub struct EventHandler {
pub command_message: String, pub command_message: String,
pub is_edit_mode: bool, pub is_edit_mode: bool,
pub edit_mode_cooldown: bool, pub edit_mode_cooldown: bool,
pub saved_cursor_column: usize,
} }
impl EventHandler { impl EventHandler {
@@ -22,6 +23,7 @@ impl EventHandler {
command_message: String::new(), command_message: String::new(),
is_edit_mode: false, is_edit_mode: false,
edit_mode_cooldown: false, edit_mode_cooldown: false,
saved_cursor_column: 0,
} }
} }
@@ -40,10 +42,8 @@ impl EventHandler {
self.is_edit_mode = true; self.is_edit_mode = true;
self.edit_mode_cooldown = true; self.edit_mode_cooldown = true;
self.command_message = "Edit mode".to_string(); self.command_message = "Edit mode".to_string();
app_terminal.set_cursor_style(SetCursorStyle::BlinkingBar)?; // Add this line app_terminal.set_cursor_style(SetCursorStyle::BlinkingBar)?;
// Initialize cursor position when entering edit mode // Don't change cursor position - current_cursor_pos should be kept from read-only mode
let current_input = form_state.get_current_input();
form_state.current_cursor_pos = current_input.len();
return Ok((false, self.command_message.clone())); return Ok((false, self.command_message.clone()));
} else if self.is_edit_mode && config.is_exit_edit_mode(key.code, key.modifiers) { } else if self.is_edit_mode && config.is_exit_edit_mode(key.code, key.modifiers) {
// Prevent exiting edit mode if there are unsaved changes // Prevent exiting edit mode if there are unsaved changes
@@ -327,21 +327,6 @@ impl EventHandler {
self.command_input.clear(); self.command_input.clear();
self.command_message.clear(); self.command_message.clear();
} }
KeyCode::Tab => {
if key.modifiers.contains(KeyModifiers::SHIFT) {
if form_state.current_field == 0 {
// Wrap to the last field when at the top
form_state.current_field = form_state.fields.len() - 1;
} else {
form_state.current_field = form_state.current_field.saturating_sub(1);
}
} else {
form_state.current_field = (form_state.current_field + 1) % form_state.fields.len();
}
// Reset cursor position to end of field when changing fields
let current_input = form_state.get_current_input();
form_state.current_cursor_pos = current_input.len();
}
KeyCode::Esc => { KeyCode::Esc => {
if config.is_exit_edit_mode(key.code, key.modifiers) { if config.is_exit_edit_mode(key.code, key.modifiers) {
if form_state.has_unsaved_changes { if form_state.has_unsaved_changes {
@@ -354,39 +339,79 @@ impl EventHandler {
return Ok((false, self.command_message.clone())); return Ok((false, self.command_message.clone()));
} }
} }
KeyCode::BackTab => {
if form_state.current_field == 0 {
// Wrap to the last field when at the top
form_state.current_field = form_state.fields.len() - 1;
} else {
form_state.current_field = form_state.current_field.saturating_sub(1);
}
// Reset cursor position to end of field when changing fields
let current_input = form_state.get_current_input();
form_state.current_cursor_pos = current_input.len();
},
KeyCode::Down => { KeyCode::Down => {
// Save current horizontal position before changing fields
self.saved_cursor_column = form_state.current_cursor_pos;
form_state.current_field = (form_state.current_field + 1) % form_state.fields.len(); form_state.current_field = (form_state.current_field + 1) % form_state.fields.len();
// Reset cursor position to end of field when changing fields
// Get the new field's content and set cursor to saved column or end of field
let current_input = form_state.get_current_input(); let current_input = form_state.get_current_input();
form_state.current_cursor_pos = current_input.len(); form_state.current_cursor_pos = self.saved_cursor_column.min(current_input.len());
}, },
KeyCode::Up => { KeyCode::Up => {
// Save current horizontal position before changing fields
self.saved_cursor_column = form_state.current_cursor_pos;
if form_state.current_field == 0 { if form_state.current_field == 0 {
// Wrap to the last field when at the top // Wrap to the last field when at the top
form_state.current_field = form_state.fields.len() - 1; form_state.current_field = form_state.fields.len() - 1;
} else { } else {
form_state.current_field = form_state.current_field.saturating_sub(1); form_state.current_field = form_state.current_field.saturating_sub(1);
} }
// Reset cursor position to end of field when changing fields
// Get the new field's content and set cursor to saved column or end of field
let current_input = form_state.get_current_input(); let current_input = form_state.get_current_input();
form_state.current_cursor_pos = current_input.len(); form_state.current_cursor_pos = self.saved_cursor_column.min(current_input.len());
}, },
KeyCode::Enter => {
form_state.current_field = (form_state.current_field + 1) % form_state.fields.len(); KeyCode::Tab => {
// Reset cursor position to end of field when changing fields // Save current horizontal position before changing fields
self.saved_cursor_column = form_state.current_cursor_pos;
if key.modifiers.contains(KeyModifiers::SHIFT) {
if form_state.current_field == 0 {
// Wrap to the last field when at the top
form_state.current_field = form_state.fields.len() - 1;
} else {
form_state.current_field = form_state.current_field.saturating_sub(1);
}
} else {
form_state.current_field = (form_state.current_field + 1) % form_state.fields.len();
}
// Use saved column position
let current_input = form_state.get_current_input(); let current_input = form_state.get_current_input();
form_state.current_cursor_pos = current_input.len(); form_state.current_cursor_pos = self.saved_cursor_column.min(current_input.len());
},
KeyCode::BackTab => {
// Save current horizontal position before changing fields
self.saved_cursor_column = form_state.current_cursor_pos;
if form_state.current_field == 0 {
// Wrap to the last field when at the top
form_state.current_field = form_state.fields.len() - 1;
} else {
form_state.current_field = form_state.current_field.saturating_sub(1);
}
// Use saved column position
let current_input = form_state.get_current_input();
form_state.current_cursor_pos = self.saved_cursor_column.min(current_input.len());
},
KeyCode::Enter => {
// Save current horizontal position before changing fields
self.saved_cursor_column = form_state.current_cursor_pos;
form_state.current_field = (form_state.current_field + 1) % form_state.fields.len();
// Use saved column position
let current_input = form_state.get_current_input();
form_state.current_cursor_pos = self.saved_cursor_column.min(current_input.len());
}, },
KeyCode::Char(c) => { KeyCode::Char(c) => {
// Save cursor position before mutable borrow // Save cursor position before mutable borrow