proper postiion of the cursor when using sql
This commit is contained in:
@@ -12,7 +12,7 @@ use tokio::sync::mpsc;
|
|||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
use crate::components::common::text_editor::TextEditor;
|
use crate::components::common::text_editor::TextEditor;
|
||||||
use crate::services::ui_service::UiService;
|
use crate::services::ui_service::UiService;
|
||||||
use tui_textarea::CursorMove;
|
use tui_textarea::CursorMove; // Ensure this import is present
|
||||||
|
|
||||||
pub type SaveLogicResultSender = mpsc::Sender<Result<String>>;
|
pub type SaveLogicResultSender = mpsc::Sender<Result<String>>;
|
||||||
|
|
||||||
@@ -125,11 +125,13 @@ pub fn handle_add_logic_navigation(
|
|||||||
|
|
||||||
if let Some(pos) = trigger_pos {
|
if let Some(pos) = trigger_pos {
|
||||||
let mut editor_borrow = add_logic_state.script_content_editor.borrow_mut();
|
let mut editor_borrow = add_logic_state.script_content_editor.borrow_mut();
|
||||||
|
|
||||||
if suggestion == "sql" {
|
if suggestion == "sql" {
|
||||||
replace_autocomplete_text(&mut editor_borrow, pos, filter_len, "sql");
|
replace_autocomplete_text(&mut editor_borrow, pos, filter_len, "sql");
|
||||||
editor_borrow.insert_str("('')");
|
editor_borrow.insert_str("('')");
|
||||||
editor_borrow.move_cursor(CursorMove::Back); // Move cursor between ''
|
// Move cursor back twice to be between the single quotes
|
||||||
|
editor_borrow.move_cursor(CursorMove::Back); // Before ')'
|
||||||
|
editor_borrow.move_cursor(CursorMove::Back); // Before ''' (inside '')
|
||||||
*command_message = "Inserted: @sql('')".to_string();
|
*command_message = "Inserted: @sql('')".to_string();
|
||||||
} else {
|
} else {
|
||||||
let is_table_selection = add_logic_state.is_table_name_suggestion(&suggestion);
|
let is_table_selection = add_logic_state.is_table_name_suggestion(&suggestion);
|
||||||
@@ -144,15 +146,14 @@ pub fn handle_add_logic_navigation(
|
|||||||
add_logic_state.script_editor_autocomplete_active = true;
|
add_logic_state.script_editor_autocomplete_active = true;
|
||||||
add_logic_state.script_editor_filter_text.clear();
|
add_logic_state.script_editor_filter_text.clear();
|
||||||
add_logic_state.trigger_column_autocomplete_for_table(suggestion.clone());
|
add_logic_state.trigger_column_autocomplete_for_table(suggestion.clone());
|
||||||
|
|
||||||
// Asynchronous column fetch (remains the same)
|
|
||||||
let profile_name = add_logic_state.profile_name.clone();
|
let profile_name = add_logic_state.profile_name.clone();
|
||||||
let table_name_for_fetch = suggestion.clone(); // Use a new variable for clarity
|
let table_name_for_fetch = suggestion.clone();
|
||||||
let mut client_clone = grpc_client.clone();
|
let mut client_clone = grpc_client.clone();
|
||||||
tokio::spawn(async move {
|
tokio::spawn(async move {
|
||||||
match UiService::fetch_columns_for_table(&mut client_clone, &profile_name, &table_name_for_fetch).await {
|
match UiService::fetch_columns_for_table(&mut client_clone, &profile_name, &table_name_for_fetch).await {
|
||||||
Ok(_columns) => {
|
Ok(_columns) => {
|
||||||
// Result handled by main UI loop checking script_editor_awaiting_column_autocomplete
|
// Result handled by main UI loop
|
||||||
}
|
}
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
tracing::error!("Failed to fetch columns for {}.{}: {}", profile_name, table_name_for_fetch, e);
|
tracing::error!("Failed to fetch columns for {}.{}: {}", profile_name, table_name_for_fetch, e);
|
||||||
@@ -168,7 +169,6 @@ pub fn handle_add_logic_navigation(
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Fallthrough: No suggestion selected, pass Enter to editor
|
|
||||||
add_logic_state.deactivate_script_editor_autocomplete();
|
add_logic_state.deactivate_script_editor_autocomplete();
|
||||||
{
|
{
|
||||||
let mut editor_borrow = add_logic_state.script_content_editor.borrow_mut();
|
let mut editor_borrow = add_logic_state.script_content_editor.borrow_mut();
|
||||||
@@ -181,11 +181,9 @@ pub fn handle_add_logic_navigation(
|
|||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
// ... (Esc and _ cases remain the same) ...
|
|
||||||
KeyCode::Esc => {
|
KeyCode::Esc => {
|
||||||
add_logic_state.deactivate_script_editor_autocomplete();
|
add_logic_state.deactivate_script_editor_autocomplete();
|
||||||
*command_message = "Autocomplete cancelled".to_string();
|
*command_message = "Autocomplete cancelled".to_string();
|
||||||
// Fall through to normal Esc handling
|
|
||||||
}
|
}
|
||||||
_ => {
|
_ => {
|
||||||
add_logic_state.deactivate_script_editor_autocomplete();
|
add_logic_state.deactivate_script_editor_autocomplete();
|
||||||
@@ -204,7 +202,6 @@ pub fn handle_add_logic_navigation(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ... (AUTOCOMPLETE TRIGGER, Escape to exit fullscreen, ALL OTHER KEYS remain the same) ...
|
|
||||||
if key_event.code == KeyCode::Char('@') && key_event.modifiers == KeyModifiers::NONE {
|
if key_event.code == KeyCode::Char('@') && key_event.modifiers == KeyModifiers::NONE {
|
||||||
let should_trigger = match add_logic_state.editor_keybinding_mode {
|
let should_trigger = match add_logic_state.editor_keybinding_mode {
|
||||||
EditorKeybindingMode::Vim => *is_edit_mode,
|
EditorKeybindingMode::Vim => *is_edit_mode,
|
||||||
@@ -227,7 +224,7 @@ pub fn handle_add_logic_navigation(
|
|||||||
add_logic_state.script_editor_trigger_position = Some(cursor_before);
|
add_logic_state.script_editor_trigger_position = Some(cursor_before);
|
||||||
add_logic_state.script_editor_autocomplete_active = true;
|
add_logic_state.script_editor_autocomplete_active = true;
|
||||||
add_logic_state.script_editor_filter_text.clear();
|
add_logic_state.script_editor_filter_text.clear();
|
||||||
add_logic_state.update_script_editor_suggestions(); // This will now use the new logic
|
add_logic_state.update_script_editor_suggestions();
|
||||||
add_logic_state.has_unsaved_changes = true;
|
add_logic_state.has_unsaved_changes = true;
|
||||||
*command_message = "Autocomplete: @ (Tab/↑↓ to navigate, Enter to select, Esc to cancel)".to_string();
|
*command_message = "Autocomplete: @ (Tab/↑↓ to navigate, Enter to select, Esc to cancel)".to_string();
|
||||||
return true;
|
return true;
|
||||||
@@ -290,9 +287,7 @@ pub fn handle_add_logic_navigation(
|
|||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
// === END FULLSCREEN ISOLATION ===
|
|
||||||
|
|
||||||
// ... (Regular navigation logic for non-fullscreen elements remains the same) ...
|
|
||||||
let action = config.get_general_action(key_event.code, key_event.modifiers);
|
let action = config.get_general_action(key_event.code, key_event.modifiers);
|
||||||
let current_focus = add_logic_state.current_focus;
|
let current_focus = add_logic_state.current_focus;
|
||||||
let mut handled = true;
|
let mut handled = true;
|
||||||
@@ -373,8 +368,8 @@ pub fn handle_add_logic_navigation(
|
|||||||
match current_focus {
|
match current_focus {
|
||||||
AddLogicFocus::ScriptContentPreview => {
|
AddLogicFocus::ScriptContentPreview => {
|
||||||
new_focus = AddLogicFocus::InsideScriptContent;
|
new_focus = AddLogicFocus::InsideScriptContent;
|
||||||
*is_edit_mode = false;
|
*is_edit_mode = false;
|
||||||
app_state.ui.focus_outside_canvas = false;
|
app_state.ui.focus_outside_canvas = false;
|
||||||
let mode_hint = match add_logic_state.editor_keybinding_mode {
|
let mode_hint = match add_logic_state.editor_keybinding_mode {
|
||||||
EditorKeybindingMode::Vim => "VIM mode - 'i'/'a'/'o' to edit",
|
EditorKeybindingMode::Vim => "VIM mode - 'i'/'a'/'o' to edit",
|
||||||
_ => "Enter/Ctrl+E to edit",
|
_ => "Enter/Ctrl+E to edit",
|
||||||
@@ -429,14 +424,13 @@ pub fn handle_add_logic_navigation(
|
|||||||
handled
|
handled
|
||||||
}
|
}
|
||||||
|
|
||||||
// ... (replace_autocomplete_text helper function remains the same) ...
|
|
||||||
fn replace_autocomplete_text(
|
fn replace_autocomplete_text(
|
||||||
editor: &mut tui_textarea::TextArea,
|
editor: &mut tui_textarea::TextArea,
|
||||||
trigger_pos: (usize, usize),
|
trigger_pos: (usize, usize),
|
||||||
filter_len: usize,
|
filter_len: usize,
|
||||||
replacement: &str,
|
replacement: &str,
|
||||||
) {
|
) {
|
||||||
use tui_textarea::CursorMove;
|
// use tui_textarea::CursorMove; // Already imported at the top of the module
|
||||||
let filter_start_pos = (trigger_pos.0, trigger_pos.1 + 1);
|
let filter_start_pos = (trigger_pos.0, trigger_pos.1 + 1);
|
||||||
editor.move_cursor(CursorMove::Jump(filter_start_pos.0 as u16, filter_start_pos.1 as u16));
|
editor.move_cursor(CursorMove::Jump(filter_start_pos.0 as u16, filter_start_pos.1 as u16));
|
||||||
for _ in 0..filter_len {
|
for _ in 0..filter_len {
|
||||||
|
|||||||
Reference in New Issue
Block a user