feat: interrupt running task on ctrl-z (#1880)
- Arguably a bugfix as previously CTRL-Z didn't do anything. - Only in TUI mode for now. This may make sense in other modes... to be researched. - The TUI runs the terminal in raw mode and the signals arrive as key events, so we handle CTRL-Z as a key event just like CTRL-C. - Not adding UI for it as a composer redesign is coming, and we can just add it then. - We should follow with CTRL-Z a second time doing the native terminal action.
This commit is contained in:
@@ -238,6 +238,16 @@ impl App<'_> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
KeyEvent {
|
||||||
|
code: KeyCode::Char('z'),
|
||||||
|
modifiers: crossterm::event::KeyModifiers::CONTROL,
|
||||||
|
kind: KeyEventKind::Press,
|
||||||
|
..
|
||||||
|
} => {
|
||||||
|
if let AppState::Chat { widget } = &mut self.app_state {
|
||||||
|
widget.on_ctrl_z();
|
||||||
|
}
|
||||||
|
}
|
||||||
KeyEvent {
|
KeyEvent {
|
||||||
code: KeyCode::Char('d'),
|
code: KeyCode::Char('d'),
|
||||||
modifiers: crossterm::event::KeyModifiers::CONTROL,
|
modifiers: crossterm::event::KeyModifiers::CONTROL,
|
||||||
|
|||||||
@@ -110,6 +110,22 @@ fn create_initial_user_message(text: String, image_paths: Vec<PathBuf>) -> Optio
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl ChatWidget<'_> {
|
impl ChatWidget<'_> {
|
||||||
|
fn interrupt_running_task(&mut self) {
|
||||||
|
if self.bottom_pane.is_task_running() {
|
||||||
|
self.active_history_cell = None;
|
||||||
|
self.bottom_pane.clear_ctrl_c_quit_hint();
|
||||||
|
self.submit_op(Op::Interrupt);
|
||||||
|
self.bottom_pane.set_task_running(false);
|
||||||
|
self.bottom_pane.clear_live_ring();
|
||||||
|
self.live_builder = RowBuilder::new(self.live_builder.width());
|
||||||
|
self.current_stream = None;
|
||||||
|
self.stream_header_emitted = false;
|
||||||
|
self.answer_buffer.clear();
|
||||||
|
self.reasoning_buffer.clear();
|
||||||
|
self.content_buffer.clear();
|
||||||
|
self.request_redraw();
|
||||||
|
}
|
||||||
|
}
|
||||||
fn layout_areas(&self, area: Rect) -> [Rect; 2] {
|
fn layout_areas(&self, area: Rect) -> [Rect; 2] {
|
||||||
Layout::vertical([
|
Layout::vertical([
|
||||||
Constraint::Max(
|
Constraint::Max(
|
||||||
@@ -569,18 +585,7 @@ impl ChatWidget<'_> {
|
|||||||
CancellationEvent::Ignored => {}
|
CancellationEvent::Ignored => {}
|
||||||
}
|
}
|
||||||
if self.bottom_pane.is_task_running() {
|
if self.bottom_pane.is_task_running() {
|
||||||
self.active_history_cell = None;
|
self.interrupt_running_task();
|
||||||
self.bottom_pane.clear_ctrl_c_quit_hint();
|
|
||||||
self.submit_op(Op::Interrupt);
|
|
||||||
self.bottom_pane.set_task_running(false);
|
|
||||||
self.bottom_pane.clear_live_ring();
|
|
||||||
self.live_builder = RowBuilder::new(self.live_builder.width());
|
|
||||||
self.current_stream = None;
|
|
||||||
self.stream_header_emitted = false;
|
|
||||||
self.answer_buffer.clear();
|
|
||||||
self.reasoning_buffer.clear();
|
|
||||||
self.content_buffer.clear();
|
|
||||||
self.request_redraw();
|
|
||||||
CancellationEvent::Ignored
|
CancellationEvent::Ignored
|
||||||
} else if self.bottom_pane.ctrl_c_quit_hint_visible() {
|
} else if self.bottom_pane.ctrl_c_quit_hint_visible() {
|
||||||
self.submit_op(Op::Shutdown);
|
self.submit_op(Op::Shutdown);
|
||||||
@@ -591,6 +596,10 @@ impl ChatWidget<'_> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub(crate) fn on_ctrl_z(&mut self) {
|
||||||
|
self.interrupt_running_task();
|
||||||
|
}
|
||||||
|
|
||||||
pub(crate) fn composer_is_empty(&self) -> bool {
|
pub(crate) fn composer_is_empty(&self) -> bool {
|
||||||
self.bottom_pane.composer_is_empty()
|
self.bottom_pane.composer_is_empty()
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user