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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
use std::pin::Pin;
use std::future::Future;
use crossterm::event::{KeyCode, KeyEvent};
use ratatui::widgets::TableState;
use super::super::helpers::TextEditor;
use crate::tui::app::scheduler::PendingEvent;
use crate::tui::app::{App, GlobalMode, ModelsMode};
use super::OverlayHandler;
pub struct SearchInputHandler;
impl OverlayHandler for SearchInputHandler {
fn name(&self) -> &'static str {
"SearchInput"
}
fn can_handle(&self, mode: &GlobalMode) -> bool {
matches!(mode, GlobalMode::SearchInput { .. })
}
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::SearchInput { buffer, cursor_pos } = &mut app.ui.global_mode {
match key.code {
KeyCode::Esc => {
app.ui.global_mode = GlobalMode::Normal;
return;
}
KeyCode::Enter => {
let query = buffer.clone();
app.ui.global_mode = GlobalMode::Normal;
app.search.search_input = Some(query.clone());
if let ModelsMode::Search {
query: q,
page,
has_more,
..
} = &mut app.models_mode
{
*q = query.clone();
*page = 0;
*has_more = true;
}
if query.is_empty() {
return;
}
app.add_log(
format!("Searching for '{}'...", query),
crate::config::LogLevel::Info,
);
let _ = app
.pending_tx
.send(PendingEvent::Search {
query: query.clone(),
offset: 0,
})
.await;
app.search.search_table_state = TableState::default();
app.search.search_results_idx = None;
return;
}
KeyCode::Char(c) => {
TextEditor {
buffer,
cursor: cursor_pos,
}
.insert_char(c);
}
KeyCode::Backspace => {
TextEditor {
buffer,
cursor: cursor_pos,
}
.backspace();
}
KeyCode::Delete => {
TextEditor {
buffer,
cursor: cursor_pos,
}
.delete();
}
KeyCode::Left => {
TextEditor {
buffer,
cursor: cursor_pos,
}
.move_left();
}
KeyCode::Right => {
TextEditor {
buffer,
cursor: cursor_pos,
}
.move_right();
}
KeyCode::Home => {
TextEditor {
buffer,
cursor: cursor_pos,
}
.home();
}
KeyCode::End => {
TextEditor {
buffer,
cursor: cursor_pos,
}
.end();
}
_ => {}
}
app.search.search_input = Some(buffer.clone());
}
})
}
}