merge: panel alt-enter newline

This commit is contained in:
Keisuke Hirata 2026-06-15 15:50:32 +09:00
commit 0335cad9ff
No known key found for this signature in database
2 changed files with 85 additions and 3 deletions

View File

@ -93,6 +93,21 @@ mod tests {
); );
} }
#[test]
fn maps_alt_enter_to_newline() {
assert_eq!(
composer_edit_action(modified(KeyCode::Enter, KeyModifiers::ALT)),
Some(ComposerEditAction::InsertNewline)
);
assert_eq!(
composer_edit_action(modified(
KeyCode::Enter,
KeyModifiers::ALT | KeyModifiers::CONTROL,
)),
None
);
}
#[test] #[test]
fn leaves_enter_tab_esc_and_control_letters_for_callers() { fn leaves_enter_tab_esc_and_control_letters_for_callers() {
assert_eq!(composer_edit_action(key(KeyCode::Enter)), None); assert_eq!(composer_edit_action(key(KeyCode::Enter)), None);

View File

@ -2134,6 +2134,14 @@ impl MultiPodApp {
}; };
} }
let composer_action = composer_edit_action(key);
if let Some(action) = composer_action {
if action.is_modifier_action() {
self.apply_composer_edit_action(action);
return MultiPodAction::None;
}
}
match key.code { match key.code {
KeyCode::F(2) => { KeyCode::F(2) => {
if self.panel_diagnostic.is_some() { if self.panel_diagnostic.is_some() {
@ -2199,11 +2207,12 @@ impl MultiPodApp {
.prepare_companion_send() .prepare_companion_send()
.map(MultiPodAction::SendCompanion) .map(MultiPodAction::SendCompanion)
.unwrap_or(MultiPodAction::None), .unwrap_or(MultiPodAction::None),
_ if composer_edit_action(key).is_some() => { _ => {
self.apply_composer_edit_action(composer_edit_action(key).expect("checked above")); if let Some(action) = composer_action {
self.apply_composer_edit_action(action);
}
MultiPodAction::None MultiPodAction::None
} }
_ => MultiPodAction::None,
} }
} }
} }
@ -7983,6 +7992,64 @@ branch = "orchestration/custom-panel"
); );
} }
#[test]
fn multi_alt_enter_inserts_newline_without_companion_send() {
let mut app = ticket_enabled_app(vec![live_info("idle", PodStatus::Idle)]);
app.input.insert_str("first line");
assert!(matches!(
app.handle_key(modified_key(KeyCode::Enter, KeyModifiers::ALT)),
MultiPodAction::None
));
assert_eq!(input_text(&app), "first line\n");
assert!(!app.sending);
assert!(app.notice.is_none());
}
#[test]
fn multi_alt_enter_on_blank_pod_selection_inserts_newline_without_opening() {
let mut app = test_app(vec![live_info("alpha", PodStatus::Idle)]);
let selected_before = app.selected_row.clone();
assert!(matches!(
app.handle_key(modified_key(KeyCode::Enter, KeyModifiers::ALT)),
MultiPodAction::None
));
assert_eq!(input_text(&app), "\n");
assert_eq!(app.selected_row, selected_before);
assert!(app.notice.is_none());
}
#[test]
fn multi_alt_enter_on_blank_ticket_action_inserts_newline_without_dispatch() {
let mut panel = WorkspacePanelViewModel::empty(Path::new("test"));
panel.rows.push(panel_test_ticket_row(
"TICKET-1",
"Ready",
ActionPriority::ReadyForQueue,
NextUserAction::Queue,
"ready",
));
let mut app = app_with_panel(
PodList::from_sources(PodVisibilitySource::ResumePicker, vec![], vec![], None, 10),
panel,
);
let selected_before = app.selected_row.clone();
assert_eq!(app.selected_ticket_action(), Some(NextUserAction::Queue));
assert!(matches!(
app.handle_key(modified_key(KeyCode::Enter, KeyModifiers::ALT)),
MultiPodAction::None
));
assert_eq!(input_text(&app), "\n");
assert_eq!(app.selected_row, selected_before);
assert!(!app.sending);
assert!(app.notice.is_none());
}
#[test] #[test]
fn multi_composer_shared_word_motion_and_delete_keys() { fn multi_composer_shared_word_motion_and_delete_keys() {
let mut app = ticket_enabled_app(vec![live_info("idle", PodStatus::Idle)]); let mut app = ticket_enabled_app(vec![live_info("idle", PodStatus::Idle)]);