FIXED CRUCIAL BUG of two same shortcuts defined in the config
This commit is contained in:
@@ -341,55 +341,14 @@ impl EventHandler {
|
||||
}
|
||||
|
||||
AppMode::Edit => {
|
||||
if config.get_edit_action_for_key(key_code, modifiers) == Some("exit_edit_mode") {
|
||||
self.is_edit_mode = false;
|
||||
self.edit_mode_cooldown = true;
|
||||
|
||||
let has_changes = if app_state.ui.show_login || app_state.ui.show_register{
|
||||
login_state.has_unsaved_changes()
|
||||
} else {
|
||||
form_state.has_unsaved_changes()
|
||||
};
|
||||
|
||||
self.command_message = if has_changes {
|
||||
"Exited edit mode (unsaved changes remain)".to_string()
|
||||
} else {
|
||||
"Read-only mode".to_string()
|
||||
};
|
||||
|
||||
terminal.set_cursor_style(SetCursorStyle::SteadyBlock)?;
|
||||
|
||||
let current_input = if app_state.ui.show_login || app_state.ui.show_register{
|
||||
login_state.get_current_input()
|
||||
} else {
|
||||
form_state.get_current_input()
|
||||
};
|
||||
let current_cursor_pos = if app_state.ui.show_login || app_state.ui.show_register{
|
||||
login_state.current_cursor_pos()
|
||||
} else {
|
||||
form_state.current_cursor_pos()
|
||||
};
|
||||
|
||||
if !current_input.is_empty() && current_cursor_pos >= current_input.len() {
|
||||
let new_pos = current_input.len() - 1;
|
||||
if app_state.ui.show_login || app_state.ui.show_register{
|
||||
login_state.set_current_cursor_pos(new_pos);
|
||||
self.ideal_cursor_column = login_state.current_cursor_pos();
|
||||
} else {
|
||||
form_state.set_current_cursor_pos(new_pos);
|
||||
self.ideal_cursor_column = form_state.current_cursor_pos();
|
||||
}
|
||||
}
|
||||
return Ok(EventOutcome::Ok(self.command_message.clone()));
|
||||
}
|
||||
|
||||
if let Some(action) = config.get_action_for_key_in_mode(
|
||||
&config.keybindings.common,
|
||||
key_code,
|
||||
modifiers
|
||||
) {
|
||||
// First, check for common actions (save, revert, etc.) that apply in Edit mode
|
||||
// These might take precedence or have different behavior than the edit handler
|
||||
if let Some(action) = config.get_common_action(key_code, modifiers) {
|
||||
// Handle common actions like save, revert, force_quit, save_and_quit
|
||||
// Ensure these actions return EventOutcome directly if they might exit the app
|
||||
match action {
|
||||
"save" | "force_quit" | "save_and_quit" | "revert" => {
|
||||
// This call likely returns EventOutcome, handle it directly
|
||||
return common_mode::handle_core_action(
|
||||
action,
|
||||
form_state,
|
||||
@@ -404,27 +363,72 @@ impl EventHandler {
|
||||
total_count,
|
||||
).await;
|
||||
},
|
||||
// Handle other common actions if necessary
|
||||
_ => {}
|
||||
}
|
||||
// If a common action was handled but didn't return/exit,
|
||||
// we might want to stop further processing for this key event.
|
||||
// Depending on the action, you might return Ok(EventOutcome::Ok(...)) here.
|
||||
// For now, assume common actions either exit or don't prevent further processing.
|
||||
}
|
||||
|
||||
let message = edit::handle_edit_event(
|
||||
// If no common action took precedence, delegate to the edit-specific handler
|
||||
let edit_result = edit::handle_edit_event(
|
||||
key,
|
||||
config,
|
||||
form_state,
|
||||
login_state,
|
||||
register_state,
|
||||
&mut self.ideal_cursor_column,
|
||||
&mut self.command_message,
|
||||
current_position,
|
||||
total_count,
|
||||
grpc_client,
|
||||
app_state,
|
||||
).await?;
|
||||
).await;
|
||||
|
||||
self.key_sequence_tracker.reset();
|
||||
return Ok(EventOutcome::Ok(message));
|
||||
},
|
||||
match edit_result {
|
||||
Ok(edit::EditEventOutcome::ExitEditMode) => {
|
||||
// The edit handler signaled to exit the mode
|
||||
self.is_edit_mode = false;
|
||||
self.edit_mode_cooldown = true;
|
||||
let has_changes = if app_state.ui.show_login { login_state.has_unsaved_changes() }
|
||||
else if app_state.ui.show_register { register_state.has_unsaved_changes() }
|
||||
else { form_state.has_unsaved_changes() };
|
||||
self.command_message = if has_changes {
|
||||
"Exited edit mode (unsaved changes remain)".to_string()
|
||||
} else {
|
||||
"Read-only mode".to_string()
|
||||
};
|
||||
terminal.set_cursor_style(SetCursorStyle::SteadyBlock)?;
|
||||
// Adjust cursor position if needed
|
||||
let current_input = if app_state.ui.show_login { login_state.get_current_input() }
|
||||
else if app_state.ui.show_register { register_state.get_current_input() }
|
||||
else { form_state.get_current_input() };
|
||||
let current_cursor_pos = if app_state.ui.show_login { login_state.current_cursor_pos() }
|
||||
else if app_state.ui.show_register { register_state.current_cursor_pos() }
|
||||
else { form_state.current_cursor_pos() };
|
||||
if !current_input.is_empty() && current_cursor_pos >= current_input.len() {
|
||||
let new_pos = current_input.len() - 1;
|
||||
let target_state: &mut dyn CanvasState = if app_state.ui.show_login { login_state } else if app_state.ui.show_register { register_state } else { form_state };
|
||||
target_state.set_current_cursor_pos(new_pos);
|
||||
self.ideal_cursor_column = new_pos;
|
||||
}
|
||||
return Ok(EventOutcome::Ok(self.command_message.clone()));
|
||||
}
|
||||
Ok(edit::EditEventOutcome::Message(msg)) => {
|
||||
// Stay in edit mode, update message if not empty
|
||||
if !msg.is_empty() {
|
||||
self.command_message = msg;
|
||||
}
|
||||
self.key_sequence_tracker.reset(); // Reset sequence tracker on successful edit action
|
||||
return Ok(EventOutcome::Ok(self.command_message.clone()));
|
||||
}
|
||||
Err(e) => {
|
||||
// Handle error from the edit handler
|
||||
return Err(e);
|
||||
}
|
||||
}
|
||||
}, // End AppMode::Edit
|
||||
|
||||
AppMode::Command => {
|
||||
let outcome = command_mode::handle_command_event(
|
||||
|
||||
Reference in New Issue
Block a user