fixing autocomplete, bombarded code, nothing in here

This commit is contained in:
filipriec
2025-04-11 22:39:09 +02:00
parent e7e8b0b3f6
commit e145d63ba6
3 changed files with 53 additions and 64 deletions

View File

@@ -50,8 +50,10 @@ move_last_line = ["x"]
exit_edit_mode = ["esc","ctrl+e"] exit_edit_mode = ["esc","ctrl+e"]
delete_char_forward = ["delete"] delete_char_forward = ["delete"]
delete_char_backward = ["backspace"] delete_char_backward = ["backspace"]
next_field = ["tab", "enter"] next_field = ["enter"]
prev_field = ["shift+tab", "backtab"] prev_field = ["backtab"]
suggestion_down = ["shift+tab"]
suggestion_up = ["tab"]
move_left = ["left"] move_left = ["left"]
move_right = ["right"] move_right = ["right"]

View File

@@ -46,69 +46,7 @@ pub fn render_register(
]) ])
.split(inner_area); .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 --- // --- ERROR MESSAGE ---
if let Some(err) = &state.error_message { if let Some(err) = &state.error_message {

View File

@@ -80,6 +80,55 @@ pub async fn handle_edit_event(
// Edit-specific actions // Edit-specific actions
if let Some(action) = config.get_edit_action_for_key(key.code, key.modifiers) { 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 --- // --- Autocomplete Handling for Role Field ---
if app_state.ui.show_register && register_state.current_field() == 4 { if app_state.ui.show_register && register_state.current_field() == 4 {
match action { match action {