fn handle_key_event()

in codex-rs/tui/src/bottom_pane/mcp_server_elicitation.rs [1513:1643]


    fn handle_key_event(&mut self, key_event: KeyEvent) {
        if key_event.kind == KeyEventKind::Release {
            return;
        }

        if matches!(key_event.code, KeyCode::Esc) {
            self.dispatch_cancel();
            self.done = true;
            return;
        }

        match key_event {
            KeyEvent {
                code: KeyCode::Char('p'),
                modifiers: KeyModifiers::CONTROL,
                ..
            }
            | KeyEvent {
                code: KeyCode::PageUp,
                modifiers: KeyModifiers::NONE,
                ..
            } => {
                self.move_field(/*next*/ false);
                return;
            }
            KeyEvent {
                code: KeyCode::Char('n'),
                modifiers: KeyModifiers::CONTROL,
                ..
            }
            | KeyEvent {
                code: KeyCode::PageDown,
                modifiers: KeyModifiers::NONE,
                ..
            } => {
                self.move_field(/*next*/ true);
                return;
            }
            KeyEvent {
                code: KeyCode::Left,
                modifiers: KeyModifiers::NONE,
                ..
            }
            | KeyEvent {
                code: KeyCode::Char('h'),
                modifiers: KeyModifiers::NONE,
                ..
            } if self.current_field_is_select() => {
                self.move_field(/*next*/ false);
                return;
            }
            _ if self.current_field_is_select()
                && self.list_keymap.move_left.is_pressed(key_event) =>
            {
                self.move_field(/*next*/ false);
                return;
            }
            KeyEvent {
                code: KeyCode::Right,
                modifiers: KeyModifiers::NONE,
                ..
            }
            | KeyEvent {
                code: KeyCode::Char('l'),
                modifiers: KeyModifiers::NONE,
                ..
            } if self.current_field_is_select() => {
                self.move_field(/*next*/ true);
                return;
            }
            _ if self.current_field_is_select()
                && self.list_keymap.move_right.is_pressed(key_event) =>
            {
                self.move_field(/*next*/ true);
                return;
            }
            _ => {}
        }

        if self.current_field_is_select() {
            self.validation_error = None;
            let options_len = self.options_len();
            match key_event.code {
                KeyCode::Up | KeyCode::Char('k') => {
                    if let Some(answer) = self.current_answer_mut() {
                        answer.selection.move_up_wrap(options_len);
                        answer.answer_committed = false;
                    }
                }
                KeyCode::Down | KeyCode::Char('j') => {
                    if let Some(answer) = self.current_answer_mut() {
                        answer.selection.move_down_wrap(options_len);
                        answer.answer_committed = false;
                    }
                }
                KeyCode::Backspace | KeyCode::Delete => self.clear_selection(),
                KeyCode::Char(' ') => self.select_current_option(/*committed*/ true),
                KeyCode::Enter => {
                    if self.selected_option_index().is_some() {
                        self.select_current_option(/*committed*/ true);
                    }
                    self.go_next_or_submit();
                }
                KeyCode::Char(ch) => {
                    if let Some(option_idx) = self.option_index_for_digit(ch) {
                        if let Some(answer) = self.current_answer_mut() {
                            answer.selection.selected_idx = Some(option_idx);
                        }
                        self.select_current_option(/*committed*/ true);
                        self.go_next_or_submit();
                    }
                }
                _ => {}
            }
            return;
        }

        let before = self.capture_composer_draft();
        let (result, _) = self.composer.handle_key_event(key_event);
        let submitted = self.handle_composer_input_result(result);
        if submitted {
            return;
        }
        let after = self.capture_composer_draft();
        if before != after {
            self.validation_error = None;
            if let Some(answer) = self.current_answer_mut() {
                answer.answer_committed = false;
            }
        }
    }