Skip to main content

codetether_agent/tui/app/state/
model_picker_nav.rs

1//! Synchronous model picker navigation and filter methods.
2
3impl super::AppState {
4    pub fn filtered_models(&self) -> Vec<&str> {
5        if self.model_filter.is_empty() {
6            self.available_models.iter().map(String::as_str).collect()
7        } else {
8            let filter = self.model_filter.to_lowercase();
9            self.available_models
10                .iter()
11                .map(String::as_str)
12                .filter(|model| model.to_lowercase().contains(&filter))
13                .collect()
14        }
15    }
16
17    pub fn set_available_models(&mut self, models: Vec<String>) {
18        self.available_models = models;
19        if self.selected_model_index >= self.filtered_models().len() {
20            self.selected_model_index = self.filtered_models().len().saturating_sub(1);
21        }
22    }
23
24    pub fn open_model_picker(&mut self) {
25        self.model_picker_active = true;
26        self.model_filter.clear();
27        self.selected_model_index = 0;
28        self.status = "Model picker".to_string();
29    }
30
31    pub fn close_model_picker(&mut self) {
32        self.model_picker_active = false;
33        self.model_filter.clear();
34        self.selected_model_index = 0;
35    }
36
37    pub fn model_select_prev(&mut self) {
38        self.selected_model_index = self.selected_model_index.saturating_sub(1);
39    }
40
41    pub fn model_select_next(&mut self) {
42        if self.selected_model_index + 1 < self.filtered_models().len() {
43            self.selected_model_index += 1;
44        }
45    }
46
47    pub fn model_filter_push(&mut self, c: char) {
48        self.model_filter.push(c);
49        self.selected_model_index = 0;
50    }
51
52    pub fn model_filter_backspace(&mut self) {
53        self.model_filter.pop();
54        self.selected_model_index = 0;
55    }
56
57    pub fn selected_model(&self) -> Option<&str> {
58        self.filtered_models()
59            .get(self.selected_model_index)
60            .copied()
61    }
62}