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
use std::future::Future;
use std::pin::Pin;
use crossterm::event::{KeyCode, KeyEvent};
use super::super::helpers::{TextEditor, sync_global_settings, wrap_field_picker};
use crate::tui::app::{App, GlobalMode};
use super::OverlayHandler;
pub struct YarnRoPESettingsHandler;
impl OverlayHandler for YarnRoPESettingsHandler {
fn can_handle(&self, mode: &GlobalMode) -> bool {
matches!(mode, GlobalMode::YarnRoPESettings { .. })
}
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::YarnRoPESettings {
scale,
freq_base,
freq_scale,
selected_field,
editing,
edit_buffer,
edit_cursor_pos,
..
} = &mut app.ui.global_mode
{
match key.code {
KeyCode::Enter => {
if *editing {
match *selected_field {
0i32 => {
if let Ok(p) = edit_buffer.parse::<f32>() {
app.settings.rope_scale = p;
}
scale.clone_from(edit_buffer);
}
1i32 => {
if let Ok(p) = edit_buffer.parse::<f32>() {
app.settings.rope_freq_base = p;
}
freq_base.clone_from(edit_buffer);
}
2i32 => {
if let Ok(p) = edit_buffer.parse::<f32>() {
app.settings.rope_freq_scale = p;
}
freq_scale.clone_from(edit_buffer);
}
_ => {}
}
*editing = false;
sync_global_settings(app);
return;
}
if *selected_field == -1 {
app.settings.rope_yarn_enabled = !app.settings.rope_yarn_enabled;
*editing = true;
*selected_field = -1;
edit_buffer.clone_from(&format!("{}", app.settings.rope_yarn_enabled));
*edit_cursor_pos = edit_buffer.chars().count();
return;
}
if *selected_field == 0i32 {
edit_buffer.clone_from(scale);
*editing = true;
*edit_cursor_pos = edit_buffer.chars().count();
return;
}
if *selected_field == 1i32 {
edit_buffer.clone_from(freq_base);
*editing = true;
*edit_cursor_pos = edit_buffer.chars().count();
return;
}
if *selected_field == 2i32 {
edit_buffer.clone_from(freq_scale);
*editing = true;
*edit_cursor_pos = edit_buffer.chars().count();
}
}
KeyCode::Char(' ') if *selected_field == -1 => {
app.settings.rope_yarn_enabled = !app.settings.rope_yarn_enabled;
}
KeyCode::Up | KeyCode::Char('k') if !*editing => {
wrap_field_picker(selected_field, -1, 2, true);
}
KeyCode::Down | KeyCode::Char('j') if !*editing => {
wrap_field_picker(selected_field, -1, 2, false);
}
KeyCode::Esc => {
if *editing {
*editing = false;
edit_buffer.clear();
} else {
app.ui.global_mode = GlobalMode::Normal;
}
}
KeyCode::Char(c) if *editing => {
TextEditor {
buffer: edit_buffer,
cursor: edit_cursor_pos,
}
.insert_char(c);
}
KeyCode::Backspace if *editing => {
TextEditor {
buffer: edit_buffer,
cursor: edit_cursor_pos,
}
.backspace();
}
_ => {}
}
}
})
}
}