From 8698b64957e4567dd13ee6e4ac7a31fc71ddab9d Mon Sep 17 00:00:00 2001 From: filipriec Date: Thu, 27 Feb 2025 11:23:14 +0100 Subject: [PATCH] fixed command mode trigger --- client/src/modes/handlers/edit.rs | 222 +++++++++++++---------------- client/src/modes/handlers/event.rs | 44 +++++- 2 files changed, 138 insertions(+), 128 deletions(-) diff --git a/client/src/modes/handlers/edit.rs b/client/src/modes/handlers/edit.rs index c2f2e37..44fff32 100644 --- a/client/src/modes/handlers/edit.rs +++ b/client/src/modes/handlers/edit.rs @@ -21,151 +21,129 @@ pub async fn handle_edit_event( current_position: &mut u64, total_count: u64, ) -> Result<(bool, String), Box> { - if *command_mode { - // Delegate to the command mode handler - let (should_exit, message, exit_command_mode) = handle_command_event( - key, - config, - form_state, - command_input, - command_message, - app_terminal, - is_saved, - current_position, - total_count, - ).await?; - - if exit_command_mode { - *command_mode = false; + match key.code { + KeyCode::Left => { + form_state.current_cursor_pos = form_state.current_cursor_pos.saturating_sub(1); + *ideal_cursor_column = form_state.current_cursor_pos; + return Ok((false, "".to_string())); } - - if !message.is_empty() { - return Ok((should_exit, message)); - } - } else { - match key.code { - KeyCode::Left => { - form_state.current_cursor_pos = form_state.current_cursor_pos.saturating_sub(1); + KeyCode::Right => { + let current_input = form_state.get_current_input(); + if form_state.current_cursor_pos < current_input.len() { + form_state.current_cursor_pos += 1; *ideal_cursor_column = form_state.current_cursor_pos; - return Ok((false, "".to_string())); } - KeyCode::Right => { - let current_input = form_state.get_current_input(); - if form_state.current_cursor_pos < current_input.len() { - form_state.current_cursor_pos += 1; - *ideal_cursor_column = form_state.current_cursor_pos; - } - return Ok((false, "".to_string())); - } - KeyCode::Char(':') => { - *command_mode = true; - command_input.clear(); - command_message.clear(); - } - KeyCode::Esc => { - if config.is_exit_edit_mode(key.code, key.modifiers) { - if form_state.has_unsaved_changes { - *command_message = "Unsaved changes! Use :w to save or :q! to discard".to_string(); - return Ok((false, command_message.clone())); - } - *is_edit_mode = false; - *edit_mode_cooldown = true; - *command_message = "Read-only mode".to_string(); - - let current_input = form_state.get_current_input(); - if !current_input.is_empty() && form_state.current_cursor_pos >= current_input.len() { - form_state.current_cursor_pos = current_input.len() - 1; - *ideal_cursor_column = form_state.current_cursor_pos; - } - + return Ok((false, "".to_string())); + } + KeyCode::Char(':') => { + *command_mode = true; + command_input.clear(); + command_message.clear(); + return Ok((false, "".to_string())); + } + KeyCode::Esc => { + if config.is_exit_edit_mode(key.code, key.modifiers) { + if form_state.has_unsaved_changes { + *command_message = "Unsaved changes! Use :w to save or :q! to discard".to_string(); return Ok((false, command_message.clone())); } - } - KeyCode::Down => { - form_state.current_field = (form_state.current_field + 1) % form_state.fields.len(); + *is_edit_mode = false; + *edit_mode_cooldown = true; + *command_message = "Read-only mode".to_string(); + let current_input = form_state.get_current_input(); - let max_cursor_pos = current_input.len(); - form_state.current_cursor_pos = (*ideal_cursor_column).min(max_cursor_pos); + if !current_input.is_empty() && form_state.current_cursor_pos >= current_input.len() { + form_state.current_cursor_pos = current_input.len() - 1; + *ideal_cursor_column = form_state.current_cursor_pos; + } + + return Ok((false, command_message.clone())); } - KeyCode::Up => { + } + KeyCode::Down => { + form_state.current_field = (form_state.current_field + 1) % form_state.fields.len(); + let current_input = form_state.get_current_input(); + let max_cursor_pos = current_input.len(); + form_state.current_cursor_pos = (*ideal_cursor_column).min(max_cursor_pos); + } + KeyCode::Up => { + if form_state.current_field == 0 { + form_state.current_field = form_state.fields.len() - 1; + } else { + form_state.current_field = form_state.current_field.saturating_sub(1); + } + let current_input = form_state.get_current_input(); + let max_cursor_pos = current_input.len(); + form_state.current_cursor_pos = (*ideal_cursor_column).min(max_cursor_pos); + } + KeyCode::Tab => { + if key.modifiers.contains(KeyModifiers::SHIFT) { if form_state.current_field == 0 { form_state.current_field = form_state.fields.len() - 1; } else { form_state.current_field = form_state.current_field.saturating_sub(1); } - let current_input = form_state.get_current_input(); - let max_cursor_pos = current_input.len(); - form_state.current_cursor_pos = (*ideal_cursor_column).min(max_cursor_pos); - } - KeyCode::Tab => { - if key.modifiers.contains(KeyModifiers::SHIFT) { - if form_state.current_field == 0 { - 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(); - } - let current_input = form_state.get_current_input(); - let max_cursor_pos = current_input.len(); - form_state.current_cursor_pos = (*ideal_cursor_column).min(max_cursor_pos); - } - KeyCode::BackTab => { - if form_state.current_field == 0 { - form_state.current_field = form_state.fields.len() - 1; - } else { - form_state.current_field = form_state.current_field.saturating_sub(1); - } - let current_input = form_state.get_current_input(); - let max_cursor_pos = current_input.len(); - form_state.current_cursor_pos = (*ideal_cursor_column).min(max_cursor_pos); - } - KeyCode::Enter => { + } else { form_state.current_field = (form_state.current_field + 1) % form_state.fields.len(); - let current_input = form_state.get_current_input(); - let max_cursor_pos = current_input.len(); - form_state.current_cursor_pos = (*ideal_cursor_column).min(max_cursor_pos); } - KeyCode::Char(c) => { + let current_input = form_state.get_current_input(); + let max_cursor_pos = current_input.len(); + form_state.current_cursor_pos = (*ideal_cursor_column).min(max_cursor_pos); + } + KeyCode::BackTab => { + if form_state.current_field == 0 { + form_state.current_field = form_state.fields.len() - 1; + } else { + form_state.current_field = form_state.current_field.saturating_sub(1); + } + let current_input = form_state.get_current_input(); + let max_cursor_pos = current_input.len(); + form_state.current_cursor_pos = (*ideal_cursor_column).min(max_cursor_pos); + } + KeyCode::Enter => { + form_state.current_field = (form_state.current_field + 1) % form_state.fields.len(); + let current_input = form_state.get_current_input(); + let max_cursor_pos = current_input.len(); + form_state.current_cursor_pos = (*ideal_cursor_column).min(max_cursor_pos); + } + KeyCode::Char(c) => { + let cursor_pos = form_state.current_cursor_pos; + let field_value = form_state.get_current_input_mut(); + let mut chars: Vec = field_value.chars().collect(); + if cursor_pos <= chars.len() { + chars.insert(cursor_pos, c); + *field_value = chars.into_iter().collect(); + form_state.current_cursor_pos = cursor_pos + 1; + *ideal_cursor_column = form_state.current_cursor_pos; + form_state.has_unsaved_changes = true; + } + } + KeyCode::Backspace => { + if form_state.current_cursor_pos > 0 { let cursor_pos = form_state.current_cursor_pos; let field_value = form_state.get_current_input_mut(); let mut chars: Vec = field_value.chars().collect(); - if cursor_pos <= chars.len() { - chars.insert(cursor_pos, c); + if cursor_pos <= chars.len() && cursor_pos > 0 { + chars.remove(cursor_pos - 1); *field_value = chars.into_iter().collect(); - form_state.current_cursor_pos = cursor_pos + 1; + form_state.current_cursor_pos = cursor_pos - 1; *ideal_cursor_column = form_state.current_cursor_pos; form_state.has_unsaved_changes = true; } } - KeyCode::Backspace => { - if form_state.current_cursor_pos > 0 { - let cursor_pos = form_state.current_cursor_pos; - let field_value = form_state.get_current_input_mut(); - let mut chars: Vec = field_value.chars().collect(); - if cursor_pos <= chars.len() && cursor_pos > 0 { - chars.remove(cursor_pos - 1); - *field_value = chars.into_iter().collect(); - form_state.current_cursor_pos = cursor_pos - 1; - *ideal_cursor_column = form_state.current_cursor_pos; - form_state.has_unsaved_changes = true; - } - } - } - KeyCode::Delete => { - let cursor_pos = form_state.current_cursor_pos; - let field_value = form_state.get_current_input_mut(); - let chars: Vec = field_value.chars().collect(); - if cursor_pos < chars.len() { - let mut new_chars = chars.clone(); - new_chars.remove(cursor_pos); - *field_value = new_chars.into_iter().collect(); - form_state.has_unsaved_changes = true; - } - } - _ => {} } + KeyCode::Delete => { + let cursor_pos = form_state.current_cursor_pos; + let field_value = form_state.get_current_input_mut(); + let chars: Vec = field_value.chars().collect(); + if cursor_pos < chars.len() { + let mut new_chars = chars.clone(); + new_chars.remove(cursor_pos); + *field_value = new_chars.into_iter().collect(); + form_state.has_unsaved_changes = true; + } + } + _ => {} } *edit_mode_cooldown = false; diff --git a/client/src/modes/handlers/event.rs b/client/src/modes/handlers/event.rs index f53438f..025e872 100644 --- a/client/src/modes/handlers/event.rs +++ b/client/src/modes/handlers/event.rs @@ -6,6 +6,7 @@ use crate::tui::terminal::AppTerminal; use crate::config::config::Config; use crate::ui::handlers::form::FormState; use crate::modes::handlers::edit::handle_edit_event; +use crate::modes::handlers::command_mode::handle_command_event; pub struct EventHandler { pub command_mode: bool, @@ -46,6 +47,42 @@ impl EventHandler { current_position: &mut u64, ) -> Result<(bool, String), Box> { if let Event::Key(key) = event { + // Handle command mode first, regardless of the current editing mode + if self.command_mode { + let (should_exit, message, exit_command_mode) = handle_command_event( + key, + config, + form_state, + &mut self.command_input, + &mut self.command_message, + app_terminal, + is_saved, + current_position, + total_count, + ).await?; + + if exit_command_mode { + self.command_mode = false; + } + + if !message.is_empty() { + return Ok((should_exit, message)); + } + + // If we're still in command mode, don't process other keys + if self.command_mode { + return Ok((false, "".to_string())); + } + } + // Handle special case: Entering command mode with ":" + else if key.code == KeyCode::Char(':') { + self.command_mode = true; + self.command_input.clear(); + self.command_message.clear(); + return Ok((false, "".to_string())); + } + + // Handle mode transitions if !self.is_edit_mode && config.is_enter_edit_mode(key.code, key.modifiers) { // Determine which type of edit mode we're entering if config.is_enter_edit_mode_after(key.code, key.modifiers) { @@ -317,13 +354,8 @@ impl EventHandler { _ => {} } } - // Handle other keys (e.g., command mode) + // Handle other keys in read-only mode match key.code { - KeyCode::Char(':') => { - self.command_mode = true; - self.command_input.clear(); - self.command_message.clear(); - } KeyCode::Esc => { self.command_mode = false; self.command_input.clear();