1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
use std::future::Future;
use std::pin::Pin;
use crossterm::event::{KeyCode, KeyEvent};
use super::super::helpers::mark_settings_dirty;
use crate::tui::app::{App, GlobalMode};
use super::OverlayHandler;
pub struct ChatTemplatePickerHandler;
impl OverlayHandler for ChatTemplatePickerHandler {
fn can_handle(&self, mode: &GlobalMode) -> bool {
matches!(mode, GlobalMode::ChatTemplatePicker { .. })
}
fn handle<'a>(
&'a self,
app: &'a mut App,
key: KeyEvent,
) -> Pin<Box<dyn Future<Output = ()> + Send + 'a>> {
Box::pin(async move {
if let GlobalMode::ChatTemplatePicker {
entries, selected, ..
} = &mut app.ui.global_mode
{
match key.code {
KeyCode::Enter => {
let entry = &entries[*selected];
match entry.as_str() {
"Auto (detect)" => {
app.settings.auto_chat_template = true;
app.settings.chat_template = None;
}
"None" => {
app.settings.auto_chat_template = false;
app.settings.chat_template = None;
}
"Select a Template file..." => {
let base_path =
super::directory_picker::default_chat_templates_dir();
let files =
super::directory_picker::load_jinja_files_recursive(&base_path);
if files.is_empty() {
app.add_log(
crate::t!("log.no_jinja_files"),
crate::config::LogLevel::Warning,
);
app.ui.global_mode = GlobalMode::Normal;
return;
}
app.ui.global_mode = GlobalMode::ChatTemplateFilePicker {
entries: files,
selected: 0,
};
return;
}
_ => {
app.settings.auto_chat_template = false;
app.settings.chat_template = Some(entry.clone());
}
}
mark_settings_dirty(app, false);
app.ui.global_mode = GlobalMode::Normal;
}
KeyCode::Up => {
*selected = selected.saturating_sub(1);
}
KeyCode::Down => {
*selected = (*selected + 1).min(entries.len().saturating_sub(1));
}
KeyCode::Esc => {
app.ui.global_mode = GlobalMode::Normal;
}
_ => {}
}
}
})
}
}