hex_patch/app/
help.rs

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}