codetether_agent/tui/app/state/
model_picker_nav.rs1impl 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}