edit mode cursor persisting position
This commit is contained in:
@@ -13,6 +13,7 @@ pub struct EventHandler {
|
|||||||
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,
|
pub saved_cursor_column: usize,
|
||||||
|
pub ideal_cursor_column: usize,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl EventHandler {
|
impl EventHandler {
|
||||||
@@ -24,6 +25,7 @@ impl EventHandler {
|
|||||||
is_edit_mode: false,
|
is_edit_mode: false,
|
||||||
edit_mode_cooldown: false,
|
edit_mode_cooldown: false,
|
||||||
saved_cursor_column: 0,
|
saved_cursor_column: 0,
|
||||||
|
ideal_cursor_column: 0,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -312,16 +314,20 @@ impl EventHandler {
|
|||||||
KeyCode::Left => {
|
KeyCode::Left => {
|
||||||
// Move cursor left
|
// Move cursor left
|
||||||
form_state.current_cursor_pos = form_state.current_cursor_pos.saturating_sub(1);
|
form_state.current_cursor_pos = form_state.current_cursor_pos.saturating_sub(1);
|
||||||
|
// Update ideal position to match actual position
|
||||||
|
self.ideal_cursor_column = form_state.current_cursor_pos;
|
||||||
return Ok((false, "".to_string()));
|
return Ok((false, "".to_string()));
|
||||||
}
|
},
|
||||||
KeyCode::Right => {
|
KeyCode::Right => {
|
||||||
// Move cursor right
|
// Move cursor right
|
||||||
let current_input = form_state.get_current_input();
|
let current_input = form_state.get_current_input();
|
||||||
if form_state.current_cursor_pos < current_input.len() {
|
if form_state.current_cursor_pos < current_input.len() {
|
||||||
form_state.current_cursor_pos += 1;
|
form_state.current_cursor_pos += 1;
|
||||||
|
// Update ideal position to match actual position
|
||||||
|
self.ideal_cursor_column = form_state.current_cursor_pos;
|
||||||
}
|
}
|
||||||
return Ok((false, "".to_string()));
|
return Ok((false, "".to_string()));
|
||||||
}
|
},
|
||||||
KeyCode::Char(':') => {
|
KeyCode::Char(':') => {
|
||||||
self.command_mode = true;
|
self.command_mode = true;
|
||||||
self.command_input.clear();
|
self.command_input.clear();
|
||||||
@@ -339,22 +345,16 @@ impl EventHandler {
|
|||||||
return Ok((false, self.command_message.clone()));
|
return Ok((false, self.command_message.clone()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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();
|
||||||
|
|
||||||
// Get the new field's content and set cursor to saved column or end of field
|
// Get the new field's content and set cursor using ideal position
|
||||||
let current_input = form_state.get_current_input();
|
let current_input = form_state.get_current_input();
|
||||||
form_state.current_cursor_pos = self.saved_cursor_column.min(current_input.len());
|
form_state.current_cursor_pos = self.ideal_cursor_column.min(current_input.len());
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// Fix Up key handling
|
||||||
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;
|
||||||
@@ -362,15 +362,13 @@ impl EventHandler {
|
|||||||
form_state.current_field = form_state.current_field.saturating_sub(1);
|
form_state.current_field = form_state.current_field.saturating_sub(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get the new field's content and set cursor to saved column or end of field
|
// Get the new field's content and set cursor using ideal position
|
||||||
let current_input = form_state.get_current_input();
|
let current_input = form_state.get_current_input();
|
||||||
form_state.current_cursor_pos = self.saved_cursor_column.min(current_input.len());
|
form_state.current_cursor_pos = self.ideal_cursor_column.min(current_input.len());
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// Fix Tab key handling
|
||||||
KeyCode::Tab => {
|
KeyCode::Tab => {
|
||||||
// Save current horizontal position before changing fields
|
|
||||||
self.saved_cursor_column = form_state.current_cursor_pos;
|
|
||||||
|
|
||||||
if key.modifiers.contains(KeyModifiers::SHIFT) {
|
if key.modifiers.contains(KeyModifiers::SHIFT) {
|
||||||
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
|
||||||
@@ -382,15 +380,13 @@ impl EventHandler {
|
|||||||
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();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Use saved column position
|
// Use ideal column position instead of saved_cursor_column
|
||||||
let current_input = form_state.get_current_input();
|
let current_input = form_state.get_current_input();
|
||||||
form_state.current_cursor_pos = self.saved_cursor_column.min(current_input.len());
|
form_state.current_cursor_pos = self.ideal_cursor_column.min(current_input.len());
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// Fix BackTab key handling
|
||||||
KeyCode::BackTab => {
|
KeyCode::BackTab => {
|
||||||
// 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;
|
||||||
@@ -398,20 +394,18 @@ impl EventHandler {
|
|||||||
form_state.current_field = form_state.current_field.saturating_sub(1);
|
form_state.current_field = form_state.current_field.saturating_sub(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Use saved column position
|
// Use ideal column position instead of saved_cursor_column
|
||||||
let current_input = form_state.get_current_input();
|
let current_input = form_state.get_current_input();
|
||||||
form_state.current_cursor_pos = self.saved_cursor_column.min(current_input.len());
|
form_state.current_cursor_pos = self.ideal_cursor_column.min(current_input.len());
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// Fix Enter key handling
|
||||||
KeyCode::Enter => {
|
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();
|
form_state.current_field = (form_state.current_field + 1) % form_state.fields.len();
|
||||||
|
|
||||||
// Use saved column position
|
// Use ideal column position instead of saved_cursor_column
|
||||||
let current_input = form_state.get_current_input();
|
let current_input = form_state.get_current_input();
|
||||||
form_state.current_cursor_pos = self.saved_cursor_column.min(current_input.len());
|
form_state.current_cursor_pos = self.ideal_cursor_column.min(current_input.len());
|
||||||
},
|
},
|
||||||
KeyCode::Char(c) => {
|
KeyCode::Char(c) => {
|
||||||
// Save cursor position before mutable borrow
|
// Save cursor position before mutable borrow
|
||||||
@@ -428,11 +422,11 @@ impl EventHandler {
|
|||||||
|
|
||||||
// Move cursor forward after updating the field
|
// Move cursor forward after updating the field
|
||||||
form_state.current_cursor_pos = cursor_pos + 1;
|
form_state.current_cursor_pos = cursor_pos + 1;
|
||||||
|
// Update ideal cursor position too
|
||||||
|
self.ideal_cursor_column = form_state.current_cursor_pos;
|
||||||
form_state.has_unsaved_changes = true; // Mark as unsaved
|
form_state.has_unsaved_changes = true; // Mark as unsaved
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
|
||||||
// Fix for the Backspace handler
|
|
||||||
KeyCode::Backspace => {
|
KeyCode::Backspace => {
|
||||||
// Only delete if cursor is not at the beginning
|
// Only delete if cursor is not at the beginning
|
||||||
if form_state.current_cursor_pos > 0 {
|
if form_state.current_cursor_pos > 0 {
|
||||||
@@ -450,11 +444,12 @@ impl EventHandler {
|
|||||||
|
|
||||||
// Update cursor position after modifying the field
|
// Update cursor position after modifying the field
|
||||||
form_state.current_cursor_pos = cursor_pos - 1;
|
form_state.current_cursor_pos = cursor_pos - 1;
|
||||||
|
// Update ideal cursor position too
|
||||||
|
self.ideal_cursor_column = form_state.current_cursor_pos;
|
||||||
form_state.has_unsaved_changes = true; // Mark as unsaved
|
form_state.has_unsaved_changes = true; // Mark as unsaved
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
|
||||||
// Fix for the Delete handler
|
// Fix for the Delete handler
|
||||||
KeyCode::Delete => {
|
KeyCode::Delete => {
|
||||||
// Save cursor position before mutable borrow
|
// Save cursor position before mutable borrow
|
||||||
|
|||||||
Reference in New Issue
Block a user