Skip to content

Commit bb03f78

Browse files
committed
TUI refactor
1 parent da67483 commit bb03f78

File tree

3 files changed

+156
-146
lines changed

3 files changed

+156
-146
lines changed

src/textui/mod.rs

Lines changed: 41 additions & 132 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,14 @@
1212
// see the license for the specific language governing permissions and
1313
// limitations under the license.
1414

15+
pub mod terminal;
16+
mod ui;
17+
1518
use crate::{filehost, serial};
1619
use anyhow::Result;
1720
use crossterm::event::KeyCode;
1821
use serialport::SerialPort;
19-
use tui::widgets::{ListState, TableState};
20-
21-
pub mod terminal;
22-
mod ui;
22+
use ui::{StatefulList, StatefulTable};
2323

2424
/// Specified the currently active widget of the TUI
2525
#[derive(PartialEq, Eq)]
@@ -95,6 +95,7 @@ impl App {
9595
Ok(())
9696
}
9797

98+
// todo this should be moved to ui.rs
9899
pub fn keypress(&mut self, key: crossterm::event::KeyCode) -> Result<()> {
99100
match key {
100101
KeyCode::Char('h') => {
@@ -147,25 +148,43 @@ impl App {
147148
_ => {}
148149
}
149150
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(())
167155
}
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+
},
169188
_ => Ok(()),
170189
}
171190
}
@@ -229,113 +248,3 @@ impl App {
229248
}
230249
}
231250

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-
}

src/textui/terminal.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,9 @@ use crossterm::{
1919
};
2020

2121
use crate::filehost;
22-
use serialport::SerialPort;
2322
use crate::textui::{ui, App, AppWidgets};
2423
use anyhow::Result;
24+
use serialport::SerialPort;
2525
use std::io;
2626
use tui::{
2727
backend::{Backend, CrosstermBackend},
@@ -59,7 +59,7 @@ pub fn start_tui(
5959
Ok(())
6060
}
6161

62-
pub fn run_app<B: Backend>(terminal: &mut Terminal<B>, mut app: App) -> Result<()> {
62+
fn run_app<B: Backend>(terminal: &mut Terminal<B>, mut app: App) -> Result<()> {
6363
loop {
6464
terminal.draw(|f| ui::ui(f, &mut app))?;
6565

0 commit comments

Comments
 (0)