|
12 | 12 | // see the license for the specific language governing permissions and |
13 | 13 | // limitations under the license. |
14 | 14 |
|
| 15 | +pub mod terminal; |
| 16 | +mod ui; |
| 17 | + |
15 | 18 | use crate::{filehost, serial}; |
16 | 19 | use anyhow::Result; |
17 | 20 | use crossterm::event::KeyCode; |
18 | 21 | use serialport::SerialPort; |
19 | | -use tui::widgets::{ListState, TableState}; |
20 | | - |
21 | | -pub mod terminal; |
22 | | -mod ui; |
| 22 | +use ui::{StatefulList, StatefulTable}; |
23 | 23 |
|
24 | 24 | /// Specified the currently active widget of the TUI |
25 | 25 | #[derive(PartialEq, Eq)] |
@@ -95,6 +95,7 @@ impl App { |
95 | 95 | Ok(()) |
96 | 96 | } |
97 | 97 |
|
| 98 | + // todo this should be moved to ui.rs |
98 | 99 | pub fn keypress(&mut self, key: crossterm::event::KeyCode) -> Result<()> { |
99 | 100 | match key { |
100 | 101 | KeyCode::Char('h') => { |
@@ -147,25 +148,43 @@ impl App { |
147 | 148 | _ => {} |
148 | 149 | } |
149 | 150 | match self.active_widget { |
150 | | - AppWidgets::CBMBrowser => self.cbm_browser.keypress(key), |
151 | | - AppWidgets::FileAction => self.file_action.keypress(key), |
152 | | - AppWidgets::FileSelector => { |
153 | | - match key { |
154 | | - KeyCode::Down => { |
155 | | - self.filetable.next(); |
156 | | - Ok(()) |
157 | | - }, |
158 | | - KeyCode::Up => { |
159 | | - self.filetable.previous(); |
160 | | - Ok(()) |
161 | | - }, |
162 | | - KeyCode::Char('s') => { |
163 | | - self.sort_filehost(); |
164 | | - Ok(()) |
165 | | - }, |
166 | | - _ => {Ok(())} |
| 151 | + AppWidgets::CBMBrowser => match key { |
| 152 | + KeyCode::Down => { |
| 153 | + self.cbm_browser.next(); |
| 154 | + Ok(()) |
167 | 155 | } |
168 | | - } |
| 156 | + KeyCode::Up => { |
| 157 | + self.cbm_browser.previous(); |
| 158 | + Ok(()) |
| 159 | + } |
| 160 | + _ => Ok(()), |
| 161 | + }, |
| 162 | + AppWidgets::FileAction => match key { |
| 163 | + KeyCode::Down => { |
| 164 | + self.file_action.next(); |
| 165 | + Ok(()) |
| 166 | + } |
| 167 | + KeyCode::Up => { |
| 168 | + self.file_action.previous(); |
| 169 | + Ok(()) |
| 170 | + } |
| 171 | + _ => Ok(()), |
| 172 | + }, |
| 173 | + AppWidgets::FileSelector => match key { |
| 174 | + KeyCode::Down => { |
| 175 | + self.filetable.next(); |
| 176 | + Ok(()) |
| 177 | + } |
| 178 | + KeyCode::Up => { |
| 179 | + self.filetable.previous(); |
| 180 | + Ok(()) |
| 181 | + } |
| 182 | + KeyCode::Char('s') => { |
| 183 | + self.sort_filehost(); |
| 184 | + Ok(()) |
| 185 | + } |
| 186 | + _ => Ok(()), |
| 187 | + }, |
169 | 188 | _ => Ok(()), |
170 | 189 | } |
171 | 190 | } |
@@ -229,113 +248,3 @@ impl App { |
229 | 248 | } |
230 | 249 | } |
231 | 250 |
|
232 | | -pub struct StatefulList<T> { |
233 | | - pub state: ListState, |
234 | | - pub items: Vec<T>, |
235 | | -} |
236 | | - |
237 | | -impl<T> StatefulList<T> { |
238 | | - pub fn with_items(items: Vec<T>) -> StatefulList<T> { |
239 | | - StatefulList { |
240 | | - state: ListState::default(), |
241 | | - items, |
242 | | - } |
243 | | - } |
244 | | - |
245 | | - fn next(&mut self) { |
246 | | - let i = match self.state.selected() { |
247 | | - Some(i) => { |
248 | | - if i >= self.items.len() - 1 { |
249 | | - 0 |
250 | | - } else { |
251 | | - i + 1 |
252 | | - } |
253 | | - } |
254 | | - None => 0, |
255 | | - }; |
256 | | - self.state.select(Some(i)); |
257 | | - } |
258 | | - |
259 | | - fn previous(&mut self) { |
260 | | - let i = match self.state.selected() { |
261 | | - Some(i) => { |
262 | | - if i == 0 { |
263 | | - self.items.len() - 1 |
264 | | - } else { |
265 | | - i - 1 |
266 | | - } |
267 | | - } |
268 | | - None => 0, |
269 | | - }; |
270 | | - self.state.select(Some(i)); |
271 | | - } |
272 | | - |
273 | | - pub fn is_selected(&self) -> bool { |
274 | | - self.state.selected() != None |
275 | | - } |
276 | | - |
277 | | - pub fn unselect(&mut self) { |
278 | | - self.state.select(None); |
279 | | - } |
280 | | - |
281 | | - pub fn keypress(&mut self, key: crossterm::event::KeyCode) -> Result<()> { |
282 | | - match key { |
283 | | - KeyCode::Down => self.next(), |
284 | | - KeyCode::Up => self.previous(), |
285 | | - _ => {} |
286 | | - } |
287 | | - Ok(()) |
288 | | - } |
289 | | -} |
290 | | - |
291 | | -pub struct StatefulTable<T> { |
292 | | - pub state: TableState, |
293 | | - pub items: Vec<T>, |
294 | | -} |
295 | | - |
296 | | -impl<T> StatefulTable<T> { |
297 | | - pub fn with_items(items: Vec<T>) -> StatefulTable<T> { |
298 | | - StatefulTable { |
299 | | - state: TableState::default(), |
300 | | - items, |
301 | | - } |
302 | | - } |
303 | | - |
304 | | - fn next(&mut self) { |
305 | | - let i = match self.state.selected() { |
306 | | - Some(i) => { |
307 | | - if i >= self.items.len() - 1 { |
308 | | - 0 |
309 | | - } else { |
310 | | - i + 1 |
311 | | - } |
312 | | - } |
313 | | - None => 0, |
314 | | - }; |
315 | | - self.state.select(Some(i)); |
316 | | - } |
317 | | - |
318 | | - fn previous(&mut self) { |
319 | | - let i = match self.state.selected() { |
320 | | - Some(i) => { |
321 | | - if i == 0 { |
322 | | - self.items.len() - 1 |
323 | | - } else { |
324 | | - i - 1 |
325 | | - } |
326 | | - } |
327 | | - None => 0, |
328 | | - }; |
329 | | - self.state.select(Some(i)); |
330 | | - } |
331 | | - |
332 | | - #[allow(dead_code)] |
333 | | - pub fn is_selected(&self) -> bool { |
334 | | - self.state.selected() != None |
335 | | - } |
336 | | - |
337 | | - #[allow(dead_code)] |
338 | | - pub fn unselect(&mut self) { |
339 | | - self.state.select(None); |
340 | | - } |
341 | | -} |
0 commit comments