feat: allow esc to interrupt session (#2054)
## Summary - allow Esc to interrupt the current session when a task is running - document Esc as an interrupt key in status indicator ## Testing - `just fmt` - `just fix` *(fails: E0658 `let` expressions in this position are unstable)* - `cargo test --all-features` *(fails: E0658 `let` expressions in this position are unstable)* ------ https://chatgpt.com/codex/tasks/task_i_689698cf605883208f57b0317ff6a303
This commit is contained in:
@@ -236,6 +236,20 @@ impl App<'_> {
|
|||||||
self.app_event_tx.send(AppEvent::ExitRequest);
|
self.app_event_tx.send(AppEvent::ExitRequest);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
KeyEvent {
|
||||||
|
code: KeyCode::Esc,
|
||||||
|
kind: KeyEventKind::Press,
|
||||||
|
..
|
||||||
|
} => match &mut self.app_state {
|
||||||
|
AppState::Chat { widget } => {
|
||||||
|
if !widget.on_esc() {
|
||||||
|
self.dispatch_key_event(key_event);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
AppState::Onboarding { .. } => {
|
||||||
|
self.dispatch_key_event(key_event);
|
||||||
|
}
|
||||||
|
},
|
||||||
KeyEvent {
|
KeyEvent {
|
||||||
code: KeyCode::Char('z'),
|
code: KeyCode::Char('z'),
|
||||||
modifiers: crossterm::event::KeyModifiers::CONTROL,
|
modifiers: crossterm::event::KeyModifiers::CONTROL,
|
||||||
|
|||||||
@@ -571,6 +571,14 @@ impl ChatWidget<'_> {
|
|||||||
self.bottom_pane.on_file_search_result(query, matches);
|
self.bottom_pane.on_file_search_result(query, matches);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub(crate) fn on_esc(&mut self) -> bool {
|
||||||
|
if self.bottom_pane.is_task_running() {
|
||||||
|
self.interrupt_running_task();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
false
|
||||||
|
}
|
||||||
|
|
||||||
/// Handle Ctrl-C key press.
|
/// Handle Ctrl-C key press.
|
||||||
/// Returns CancellationEvent::Handled if the event was consumed by the UI, or
|
/// Returns CancellationEvent::Handled if the event was consumed by the UI, or
|
||||||
/// CancellationEvent::Ignored if the caller should handle it (e.g. exit).
|
/// CancellationEvent::Ignored if the caller should handle it (e.g. exit).
|
||||||
|
|||||||
@@ -231,14 +231,14 @@ impl WidgetRef for StatusIndicatorWidget {
|
|||||||
spans.extend(animated_spans);
|
spans.extend(animated_spans);
|
||||||
// Space between header and bracket block
|
// Space between header and bracket block
|
||||||
spans.push(Span::raw(" "));
|
spans.push(Span::raw(" "));
|
||||||
// Non-animated, dim bracket content, with only "Ctrl c" bold
|
// Non-animated, dim bracket content, with keys bold
|
||||||
let bracket_prefix = format!("({elapsed}s • ");
|
let bracket_prefix = format!("({elapsed}s • ");
|
||||||
spans.push(Span::styled(
|
spans.push(Span::styled(
|
||||||
bracket_prefix,
|
bracket_prefix,
|
||||||
Style::default().fg(Color::Gray).add_modifier(Modifier::DIM),
|
Style::default().fg(Color::Gray).add_modifier(Modifier::DIM),
|
||||||
));
|
));
|
||||||
spans.push(Span::styled(
|
spans.push(Span::styled(
|
||||||
"Ctrl C",
|
"Esc",
|
||||||
Style::default()
|
Style::default()
|
||||||
.fg(Color::Gray)
|
.fg(Color::Gray)
|
||||||
.add_modifier(Modifier::DIM | Modifier::BOLD),
|
.add_modifier(Modifier::DIM | Modifier::BOLD),
|
||||||
|
|||||||
Reference in New Issue
Block a user