From e145d63ba6e182ae84aeaf3d0f7116bad74b8477 Mon Sep 17 00:00:00 2001 From: filipriec Date: Fri, 11 Apr 2025 22:39:09 +0200 Subject: [PATCH] fixing autocomplete, bombarded code, nothing in here --- client/config.toml | 6 ++- client/src/components/auth/register.rs | 62 -------------------------- client/src/modes/canvas/edit.rs | 49 ++++++++++++++++++++ 3 files changed, 53 insertions(+), 64 deletions(-) diff --git a/client/config.toml b/client/config.toml index 5850bcc..5db709b 100644 --- a/client/config.toml +++ b/client/config.toml @@ -50,8 +50,10 @@ move_last_line = ["x"] exit_edit_mode = ["esc","ctrl+e"] delete_char_forward = ["delete"] delete_char_backward = ["backspace"] -next_field = ["tab", "enter"] -prev_field = ["shift+tab", "backtab"] +next_field = ["enter"] +prev_field = ["backtab"] +suggestion_down = ["shift+tab"] +suggestion_up = ["tab"] move_left = ["left"] move_right = ["right"] diff --git a/client/src/components/auth/register.rs b/client/src/components/auth/register.rs index 5be5664..f86b396 100644 --- a/client/src/components/auth/register.rs +++ b/client/src/components/auth/register.rs @@ -46,69 +46,7 @@ pub fn render_register( ]) .split(inner_area); - // --- FORM RENDERING (Manual) --- - let form_area = chunks[0]; - let field_labels = [ - "Username", - "Email (Optional)", - "Password (Optional)", - "Confirm Password", - "Role (Optional)", - ]; - let num_fields = field_labels.len(); - // Layout for labels and inputs within the form area - let form_layout = Layout::default() - .direction(Direction::Horizontal) - .constraints([Constraint::Percentage(30), Constraint::Percentage(70)]) - .split(form_area); - - let label_area = form_layout[0]; - let input_area = form_layout[1]; - - // Calculate vertical layout for input rows - let input_rows = Layout::default() - .direction(Direction::Vertical) - .constraints(vec![Constraint::Length(1); num_fields]) - .split(input_area); - - let mut role_input_rect = Rect::default(); // Store role input rect for dropdown positioning - - // Render labels and inputs row by row - for i in 0..num_fields { - let is_active_field = state.current_field() == i; - - // Render Label - let label = Paragraph::new(format!("{}:", field_labels[i])) - .style(Style::default().fg(theme.fg)) - .alignment(Alignment::Right); - let label_rect = Rect { - x: label_area.x, - y: input_rows[i].y, - width: label_area.width.saturating_sub(1), - height: 1, - }; - f.render_widget(label, label_rect); - - // Render Input - let input_value = state.inputs()[i]; // Get value using CanvasState trait - let input_widget = Paragraph::new(input_value.as_str()) - .style(if is_active_field { - Style::default().fg(theme.highlight) - } else { - Style::default().fg(theme.fg) - }); - f.render_widget(input_widget, input_rows[i]); - - if i == 4 { // Store the role input field's Rect - role_input_rect = input_rows[i]; - } - - // Set cursor for the active field - if is_active_field && is_edit_mode { - f.set_cursor(input_rows[i].x + state.current_cursor_pos() as u16, input_rows[i].y); - } - } // --- ERROR MESSAGE --- if let Some(err) = &state.error_message { diff --git a/client/src/modes/canvas/edit.rs b/client/src/modes/canvas/edit.rs index 76332b8..37adf58 100644 --- a/client/src/modes/canvas/edit.rs +++ b/client/src/modes/canvas/edit.rs @@ -80,6 +80,55 @@ pub async fn handle_edit_event( // Edit-specific actions if let Some(action) = config.get_edit_action_for_key(key.code, key.modifiers) { + // --- Autocomplete Dropdown Interaction Handling (PRIORITY) --- + if app_state.ui.show_register && register_state.current_field() == 4 && register_state.show_role_suggestions { + match action { + "suggestion_down" => { + 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 >= max_index { 0 } else { current_index + 1 }); + return Ok("Suggestion changed".to_string()); + } + "suggestion_up" => { + 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) }); + return Ok("Suggestion changed".to_string()); + } + "select_suggestion" => { + if let Some(selected_index) = register_state.selected_suggestion_index { + if let Some(selected_role) = register_state.role_suggestions.get(selected_index) { + register_state.role = selected_role.clone(); + // Hide dropdown after selection + register_state.show_role_suggestions = false; + register_state.selected_suggestion_index = None; + register_state.role_suggestions.clear(); + // Move cursor to end of selected role + let new_cursor_pos = register_state.role.len(); + register_state.set_current_cursor_pos(new_cursor_pos); + *ideal_cursor_column = new_cursor_pos; + return Ok(format!("Selected role: {}", register_state.role)); + } + } + return Ok("No suggestion selected".to_string()); + } + "hide_suggestions" => { + register_state.show_role_suggestions = false; + register_state.selected_suggestion_index = None; + return Ok("Suggestions hidden".to_string()); + } + // Allow field navigation to hide suggestions + "next_field" | "prev_field" => { + register_state.show_role_suggestions = false; + register_state.selected_suggestion_index = None; + // Fall through to execute the navigation action below + } + _ => {} // Other edit actions might be ignored while dropdown is active + } + } + // --- End Autocomplete Interaction Handling --- + + // --- Autocomplete Handling for Role Field --- if app_state.ui.show_register && register_state.current_field() == 4 { match action {