1use ratatui::text::{Line, Span};
2
3use super::{
4 settings::{color_settings::ColorSettings, key_settings::KeySettings},
5 App,
6};
7
8#[derive(Debug, Clone)]
9pub struct HelpLine {
10 pub command: String,
11 pub description: String,
12}
13
14impl HelpLine {
15 pub fn new(command: &str, description: &str) -> Self {
16 Self {
17 command: command.to_string(),
18 description: description.to_string(),
19 }
20 }
21
22 pub fn to_line(&self, color_settings: &ColorSettings) -> Line<'static> {
23 let mut line = Line::default();
24 line.spans.push(Span::styled(
25 self.command.to_string(),
26 color_settings.help_command,
27 ));
28 line.spans
29 .push(Span::styled(": ", color_settings.menu_text));
30 line.spans.push(Span::styled(
31 self.description.clone(),
32 color_settings.help_description,
33 ));
34 line.left_aligned()
35 }
36}
37
38impl App {
39 pub fn key_event_to_string(event: crossterm::event::KeyEvent) -> String {
40 let mut result = String::new();
41 if event
42 .modifiers
43 .contains(crossterm::event::KeyModifiers::CONTROL)
44 {
45 result.push_str(&t!("keys.mods.control"));
46 }
47 if event
48 .modifiers
49 .contains(crossterm::event::KeyModifiers::ALT)
50 {
51 result.push_str(&t!("keys.mods.alt"));
52 }
53 if event
54 .modifiers
55 .contains(crossterm::event::KeyModifiers::SHIFT)
56 {
57 result.push_str(&t!("keys.mods.shift"));
58 }
59 if event
60 .modifiers
61 .contains(crossterm::event::KeyModifiers::SUPER)
62 {
63 result.push_str(&t!("keys.mods.super"));
64 }
65 if event
66 .modifiers
67 .contains(crossterm::event::KeyModifiers::HYPER)
68 {
69 result.push_str(&t!("keys.mods.hyper"));
70 }
71 if event
72 .modifiers
73 .contains(crossterm::event::KeyModifiers::META)
74 {
75 result.push_str(&t!("keys.mods.meta"));
76 }
77
78 result.push_str(&match event.code {
79 crossterm::event::KeyCode::Left => "←".into(),
80 crossterm::event::KeyCode::Right => "→".into(),
81 crossterm::event::KeyCode::Up => "↑".into(),
82 crossterm::event::KeyCode::Down => "↓".into(),
83 crossterm::event::KeyCode::F(n) => {
84 format!("F{n}")
85 }
86 crossterm::event::KeyCode::Char(c) => match c {
87 ' ' => t!("keys.space").into(),
88 '\t' => t!("keys.tab").into(),
89 '\n' => "LF".into(),
90 '\r' => "CR".into(),
91 _ => c.to_ascii_uppercase().to_string(),
92 },
93 crossterm::event::KeyCode::Enter => t!("keys.enter").into(),
94 crossterm::event::KeyCode::Esc => t!("keys.esc").into(),
95 crossterm::event::KeyCode::Backspace => t!("keys.backspace").into(),
96 crossterm::event::KeyCode::Delete => t!("keys.delete").into(),
97 crossterm::event::KeyCode::Home => t!("keys.home").into(),
98 crossterm::event::KeyCode::End => t!("keys.end").into(),
99 crossterm::event::KeyCode::PageUp => t!("keys.page_up").into(),
100 crossterm::event::KeyCode::PageDown => t!("keys.page_down").into(),
101 crossterm::event::KeyCode::Insert => t!("keys.insert").into(),
102 crossterm::event::KeyCode::Tab => t!("keys.tab").into(),
103 crossterm::event::KeyCode::Null => t!("keys.null").into(),
104 crossterm::event::KeyCode::CapsLock => t!("keys.caps_lock").into(),
105 crossterm::event::KeyCode::ScrollLock => t!("keys.scroll_lock").into(),
106 crossterm::event::KeyCode::NumLock => t!("keys.num_lock").into(),
107 crossterm::event::KeyCode::PrintScreen => t!("keys.print_screen").into(),
108 crossterm::event::KeyCode::Pause => t!("keys.pause").into(),
109 c => format!("{c:?}"),
110 });
111 result
112 }
113
114 pub(super) fn help_list(key_settings: &KeySettings) -> Vec<HelpLine> {
115 vec![
116 HelpLine::new(
117 &Self::key_event_to_string(key_settings.up),
118 &t!("app.help.up"),
119 ),
120 HelpLine::new(
121 &Self::key_event_to_string(key_settings.down),
122 &t!("app.help.down"),
123 ),
124 HelpLine::new(
125 &Self::key_event_to_string(key_settings.left),
126 &t!("app.help.left"),
127 ),
128 HelpLine::new(
129 &Self::key_event_to_string(key_settings.right),
130 &t!("app.help.right"),
131 ),
132 HelpLine::new(
133 &Self::key_event_to_string(key_settings.next),
134 &t!("app.help.next"),
135 ),
136 HelpLine::new(
137 &Self::key_event_to_string(key_settings.previous),
138 &t!("app.help.previous"),
139 ),
140 HelpLine::new(
141 &Self::key_event_to_string(key_settings.page_up),
142 &t!("app.help.page_up"),
143 ),
144 HelpLine::new(
145 &Self::key_event_to_string(key_settings.page_down),
146 &t!("app.help.page_down"),
147 ),
148 HelpLine::new(
149 &Self::key_event_to_string(key_settings.goto_start),
150 &t!("app.help.goto_start"),
151 ),
152 HelpLine::new(
153 &Self::key_event_to_string(key_settings.goto_end),
154 &t!("app.help.goto_end"),
155 ),
156 HelpLine::new(
157 &Self::key_event_to_string(key_settings.run),
158 &t!("app.help.run"),
159 ),
160 HelpLine::new(
161 &Self::key_event_to_string(key_settings.save),
162 &t!("app.help.save"),
163 ),
164 HelpLine::new(
165 &Self::key_event_to_string(key_settings.save_as),
166 &t!("app.help.save_as"),
167 ),
168 HelpLine::new(
169 &Self::key_event_to_string(key_settings.save_and_quit),
170 &t!("app.help.save_and_quit"),
171 ),
172 HelpLine::new(
173 &Self::key_event_to_string(key_settings.quit),
174 &t!("app.help.quit"),
175 ),
176 HelpLine::new(
177 &Self::key_event_to_string(key_settings.open),
178 &t!("app.help.open"),
179 ),
180 HelpLine::new(
181 &Self::key_event_to_string(key_settings.change_view),
182 &t!("app.help.change_view"),
183 ),
184 HelpLine::new(
185 &Self::key_event_to_string(key_settings.change_selected_pane),
186 &t!("app.help.change_selected_pane"),
187 ),
188 HelpLine::new(
189 &Self::key_event_to_string(key_settings.fullscreen),
190 &t!("app.help.fullscreen"),
191 ),
192 HelpLine::new(
193 &Self::key_event_to_string(key_settings.jump),
194 &t!("app.help.jump"),
195 ),
196 HelpLine::new(
197 &Self::key_event_to_string(key_settings.find_symbol),
198 &t!("app.help.find_symbol"),
199 ),
200 HelpLine::new(
201 &Self::key_event_to_string(key_settings.find_text),
202 &t!("app.help.find_text"),
203 ),
204 HelpLine::new(
205 &Self::key_event_to_string(key_settings.patch_text),
206 &t!("app.help.patch_text"),
207 ),
208 HelpLine::new(
209 &Self::key_event_to_string(key_settings.patch_assembly),
210 &t!("app.help.patch_assembly"),
211 ),
212 HelpLine::new(
213 &Self::key_event_to_string(key_settings.log),
214 &t!("app.help.log"),
215 ),
216 HelpLine::new(
217 &Self::key_event_to_string(key_settings.confirm),
218 &t!("app.help.confirm"),
219 ),
220 HelpLine::new(
221 &Self::key_event_to_string(key_settings.close_popup),
222 &t!("app.help.close_popup"),
223 ),
224 HelpLine::new(
225 &Self::key_event_to_string(key_settings.new_line),
226 &t!("app.help.new_line"),
227 ),
228 HelpLine::new(
229 &Self::key_event_to_string(key_settings.clear_log),
230 &t!("app.help.clear_log"),
231 ),
232 HelpLine::new(
233 &Self::key_event_to_string(key_settings.undo),
234 &t!("app.help.undo"),
235 ),
236 HelpLine::new(
237 &Self::key_event_to_string(key_settings.redo),
238 &t!("app.help.redo"),
239 ),
240 HelpLine::new(
241 &Self::key_event_to_string(key_settings.help),
242 &t!("app.help.help"),
243 ),
244 ]
245 }
246}