fn handle_key_event()

in codex-rs/tui/src/bottom_pane/list_selection_view.rs [910:1018]


    fn handle_key_event(&mut self, key_event: KeyEvent) {
        // Searchable lists reserve printable characters for query input. This
        // keeps vim-style plain j/k/h/l useful in non-search lists without
        // making those letters impossible to type into a filter.
        let allow_plain_char_navigation =
            !self.is_searchable || !is_plain_text_key_event(key_event);

        match key_event {
            _ if allow_plain_char_navigation && self.keymap.move_up.is_pressed(key_event) => {
                self.move_up()
            }
            _ if allow_plain_char_navigation && self.keymap.move_down.is_pressed(key_event) => {
                self.move_down()
            }
            _ if allow_plain_char_navigation && self.keymap.page_up.is_pressed(key_event) => {
                self.page_up()
            }
            _ if allow_plain_char_navigation && self.keymap.page_down.is_pressed(key_event) => {
                self.page_down()
            }
            _ if allow_plain_char_navigation && self.keymap.jump_top.is_pressed(key_event) => {
                self.jump_top()
            }
            _ if allow_plain_char_navigation && self.keymap.jump_bottom.is_pressed(key_event) => {
                self.jump_bottom()
            }
            _ if allow_plain_char_navigation
                && self.tabs_enabled()
                && self.keymap.move_left.is_pressed(key_event) =>
            {
                self.switch_tab(/*step*/ -1)
            }
            _ if allow_plain_char_navigation
                && self.tabs_enabled()
                && self.keymap.move_right.is_pressed(key_event) =>
            {
                self.switch_tab(/*step*/ 1)
            }
            KeyEvent {
                code: KeyCode::Backspace,
                ..
            } if self.is_searchable => {
                self.search_query.pop();
                self.apply_filter();
            }
            KeyEvent {
                code: KeyCode::Char(' '),
                modifiers: KeyModifiers::NONE,
                ..
            } if self.selected_item_has_toggle()
                && (!self.is_searchable || self.search_query.is_empty()) =>
            {
                self.toggle_selected()
            }
            KeyEvent {
                code: KeyCode::Char(' '),
                modifiers: KeyModifiers::NONE,
                ..
            } if self.is_searchable
                && self.search_query.is_empty()
                && self.selected_item_has_toggle_placeholder() => {}
            _ if self.keymap.cancel.is_pressed(key_event) => {
                self.on_ctrl_c();
            }
            _ if self.keymap.accept.is_pressed(key_event) => self.accept(),
            KeyEvent {
                code: KeyCode::Char(c),
                ..
            } if c.is_ascii_control() => {}
            KeyEvent {
                code: KeyCode::Char(c),
                modifiers,
                ..
            } if self.is_searchable
                && !modifiers.contains(KeyModifiers::CONTROL)
                && !modifiers.contains(KeyModifiers::ALT) =>
            {
                self.search_query.push(c);
                self.apply_filter();
            }
            KeyEvent {
                code: KeyCode::Char(c),
                modifiers,
                ..
            } if !self.is_searchable
                && !modifiers.contains(KeyModifiers::CONTROL)
                && !modifiers.contains(KeyModifiers::ALT) =>
            {
                if let Some(idx) = self.items.iter().position(|item| {
                    item.display_shortcut
                        .is_some_and(|shortcut| shortcut.is_press(key_event))
                        && Self::item_is_enabled(item)
                }) {
                    self.state.selected_idx = Some(idx);
                    self.accept();
                    return;
                }
                if let Some(idx) = c
                    .to_digit(10)
                    .map(|d| d as usize)
                    .and_then(|number| self.actual_idx_for_enabled_number(number))
                {
                    self.state.selected_idx = Some(idx);
                    self.accept();
                }
            }
            _ => {}
        }
    }