From 5e101bef14a06eac396f6494d68c08105c2508b1 Mon Sep 17 00:00:00 2001 From: filipriec Date: Sat, 12 Apr 2025 23:56:14 +0200 Subject: [PATCH] tab is triggering the suggestion dropdown menu, but ctrl+n and ctrl+p only cycle through it --- client/config.toml | 6 +++--- client/src/components/auth/register.rs | 13 +++++++----- client/src/functions/modes/edit/auth_e.rs | 8 +++++--- client/src/modes/canvas/edit.rs | 25 +++++++++-------------- 4 files changed, 26 insertions(+), 26 deletions(-) diff --git a/client/config.toml b/client/config.toml index f432d72..a0230a7 100644 --- a/client/config.toml +++ b/client/config.toml @@ -51,11 +51,11 @@ exit_edit_mode = ["esc","ctrl+e"] delete_char_forward = ["delete"] delete_char_backward = ["backspace"] next_field = ["enter"] -prev_field = ["backtab"] +prev_field = ["shift+enter"] move_left = ["left"] move_right = ["right"] -suggestion_down = ["shift+tab"] -suggestion_up = ["tab"] +suggestion_down = ["ctrl+n", "tab"] +suggestion_up = ["ctrl+p", "shift+tab"] select_suggestion = ["enter"] exit_suggestion_mode = ["esc"] diff --git a/client/src/components/auth/register.rs b/client/src/components/auth/register.rs index 218c154..f899fc7 100644 --- a/client/src/components/auth/register.rs +++ b/client/src/components/auth/register.rs @@ -6,6 +6,7 @@ use crate::{ components::common::{dialog, autocomplete}, state::state::AppState, state::canvas_state::CanvasState, + modes::handlers::mode_manager::AppMode, }; use ratatui::{ layout::{Alignment, Constraint, Direction, Layout, Rect, Margin}, @@ -136,11 +137,13 @@ pub fn render_register( ); // --- Render Autocomplete Dropdown (Draw AFTER buttons) --- - if let Some(suggestions) = state.get_suggestions() { - let selected = state.get_selected_suggestion_index(); - if !suggestions.is_empty() { - if let Some(input_rect) = active_field_rect { - autocomplete::render_autocomplete_dropdown(f, input_rect, f.size(), theme, suggestions, selected); + if app_state.current_mode == AppMode::Edit { + if let Some(suggestions) = state.get_suggestions() { + let selected = state.get_selected_suggestion_index(); + if !suggestions.is_empty() { + if let Some(input_rect) = active_field_rect { + autocomplete::render_autocomplete_dropdown(f, input_rect, f.size(), theme, suggestions, selected); + } } } } diff --git a/client/src/functions/modes/edit/auth_e.rs b/client/src/functions/modes/edit/auth_e.rs index 674d306..e27a24c 100644 --- a/client/src/functions/modes/edit/auth_e.rs +++ b/client/src/functions/modes/edit/auth_e.rs @@ -311,7 +311,7 @@ pub async fn execute_edit_action( register_state.selected_suggestion_index = Some(if current_index >= max_index { 0 } else { current_index + 1 }); Ok("Suggestion changed down".to_string()) } - "suggestion_up" if register_state.show_role_suggestions => { + "suggestion_up" if register_state.in_suggestion_mode => { let max_index = register_state.role_suggestions.len().saturating_sub(1); let current_index = register_state.selected_suggestion_index.unwrap_or(0); register_state.selected_suggestion_index = Some(if current_index == 0 { max_index } else { current_index.saturating_sub(1) }); @@ -336,10 +336,12 @@ pub async fn execute_edit_action( register_state.in_suggestion_mode = false; Ok("Suggestions hidden".to_string()) } - _ => Ok("".to_string()) // Action doesn't apply in this state (e.g., suggestions not shown) + "suggestion_down" | "suggestion_up" | "select_suggestion" => { + Ok("Suggestion action ignored: Not in suggestion mode.".to_string()) + } + _ => Ok("".to_string()) } } else { - // Action received but not applicable to the current field Ok("".to_string()) } } else { diff --git a/client/src/modes/canvas/edit.rs b/client/src/modes/canvas/edit.rs index ed08a85..a6f7770 100644 --- a/client/src/modes/canvas/edit.rs +++ b/client/src/modes/canvas/edit.rs @@ -8,7 +8,7 @@ use crate::state::pages::form::FormState; use crate::functions::modes::edit::{auth_e, form_e}; use crate::modes::handlers::event::EventOutcome; use crate::state::state::AppState; -use crossterm::event::{KeyCode, KeyEvent}; +use crossterm::event::{KeyCode, KeyEvent, KeyModifiers}; pub async fn handle_edit_event( key: KeyEvent, @@ -82,24 +82,19 @@ pub async fn handle_edit_event( if let Some(action) = config.get_edit_action_for_key(key.code, key.modifiers) { // --- Special Handling for Tab/Shift+Tab in Role Field --- if app_state.ui.show_register && register_state.current_field() == 4 { - match action { - "suggestion_up" | "suggestion_down" => { // Mapped to Tab/Shift+Tab - if !register_state.in_suggestion_mode { - register_state.update_role_suggestions(); - if !register_state.role_suggestions.is_empty() { - register_state.in_suggestion_mode = true; - register_state.selected_suggestion_index = Some(0); - return Ok("Suggestions shown".to_string()); - } else { - return Ok("No suggestions available".to_string()); - } - } + if !register_state.in_suggestion_mode && key.code == KeyCode::Tab && key.modifiers == KeyModifiers::NONE { + register_state.update_role_suggestions(); + if !register_state.role_suggestions.is_empty() { + register_state.in_suggestion_mode = true; + register_state.selected_suggestion_index = Some(0); // Select first suggestion + return Ok("Suggestions shown".to_string()); + } else { + return Ok("No suggestions available".to_string()); } - _ => {} } } // --- End Special Handling --- - + return if app_state.ui.show_login { auth_e::execute_edit_action( action,