dry out the input handling
This commit is contained in:
parent
95e24d14b3
commit
95fd86e851
1 changed files with 54 additions and 47 deletions
101
src/app/mod.rs
101
src/app/mod.rs
|
@ -102,59 +102,66 @@ impl App {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn handle_key_event(&mut self, key_event: KeyEvent, event: crossterm::event::Event) {
|
async fn handle_key_event(&mut self, key_event: KeyEvent, event: crossterm::event::Event) {
|
||||||
match self.screen.last_mut().unwrap() {
|
let code = key_event.code;
|
||||||
CurrentScreen::Logging => match key_event.code {
|
let mode = self.screen.last_mut().unwrap();
|
||||||
|
match mode {
|
||||||
|
CurrentScreen::Main
|
||||||
|
| CurrentScreen::Logging
|
||||||
|
| CurrentScreen::Receiving
|
||||||
|
| CurrentScreen::Sending(SendingScreen::Files)
|
||||||
|
| CurrentScreen::Sending(SendingScreen::Peers) => match code {
|
||||||
KeyCode::Esc => self.pop(),
|
KeyCode::Esc => self.pop(),
|
||||||
KeyCode::Left => change_log_level(-1),
|
|
||||||
KeyCode::Right => change_log_level(1),
|
|
||||||
KeyCode::Char('q') => self.exit(),
|
|
||||||
_ => {}
|
|
||||||
},
|
|
||||||
CurrentScreen::Receiving => match key_event.code {
|
|
||||||
KeyCode::Up => self.receiving_state.select_previous(),
|
|
||||||
KeyCode::Down => self.receiving_state.select_next(),
|
|
||||||
KeyCode::Char('a') => self.accept(),
|
|
||||||
KeyCode::Char('d') => self.deny(),
|
|
||||||
KeyCode::Esc => self.pop(),
|
|
||||||
KeyCode::Char('q') => self.exit(),
|
|
||||||
_ => {}
|
|
||||||
},
|
|
||||||
CurrentScreen::Sending(s) => match s {
|
|
||||||
SendingScreen::Files => match key_event.code {
|
|
||||||
KeyCode::Esc => self.pop(),
|
|
||||||
KeyCode::Char('q') => self.exit(),
|
|
||||||
KeyCode::Tab => *s = SendingScreen::Peers,
|
|
||||||
KeyCode::Enter => self.chdir_or_send_file().await,
|
|
||||||
_ => self.file_picker.handle(&event).unwrap_or_default(),
|
|
||||||
},
|
|
||||||
SendingScreen::Peers => match key_event.code {
|
|
||||||
KeyCode::Esc => self.pop(),
|
|
||||||
KeyCode::Char('q') => self.exit(),
|
|
||||||
KeyCode::Tab => *s = SendingScreen::Files,
|
|
||||||
KeyCode::Enter => self.send_content().await,
|
|
||||||
KeyCode::Up => self.peer_state.select_previous(),
|
|
||||||
KeyCode::Down => self.peer_state.select_next(),
|
|
||||||
_ => {}
|
|
||||||
},
|
|
||||||
SendingScreen::Text => match key_event.code {
|
|
||||||
KeyCode::Esc => {
|
|
||||||
self.text = None;
|
|
||||||
*s = SendingScreen::Files;
|
|
||||||
}
|
|
||||||
KeyCode::Tab => *s = SendingScreen::Peers,
|
|
||||||
KeyCode::Enter => self.send_text().await,
|
|
||||||
_ => {}
|
|
||||||
},
|
|
||||||
},
|
|
||||||
_ => match key_event.code {
|
|
||||||
KeyCode::Char('q') => self.exit(),
|
KeyCode::Char('q') => self.exit(),
|
||||||
KeyCode::Char('s') => self.send(),
|
KeyCode::Char('s') => self.send(),
|
||||||
KeyCode::Char('r') => self.recv(),
|
KeyCode::Char('r') => self.recv(),
|
||||||
KeyCode::Char('l') => self.logs(),
|
KeyCode::Char('l') => self.logs(),
|
||||||
KeyCode::Esc => self.pop(),
|
_ => match mode {
|
||||||
_ => {}
|
CurrentScreen::Logging => match code {
|
||||||
|
KeyCode::Left => change_log_level(-1),
|
||||||
|
KeyCode::Right => change_log_level(1),
|
||||||
|
_ => {}
|
||||||
|
},
|
||||||
|
CurrentScreen::Receiving => match code {
|
||||||
|
KeyCode::Up => self.receiving_state.select_previous(),
|
||||||
|
KeyCode::Down => self.receiving_state.select_next(),
|
||||||
|
KeyCode::Char('a') => self.accept(),
|
||||||
|
KeyCode::Char('d') => self.deny(),
|
||||||
|
_ => {}
|
||||||
|
},
|
||||||
|
CurrentScreen::Sending(sending_screen) => match sending_screen {
|
||||||
|
SendingScreen::Files => match code {
|
||||||
|
KeyCode::Char('t') => *sending_screen = SendingScreen::Text,
|
||||||
|
KeyCode::Tab => *sending_screen = SendingScreen::Peers,
|
||||||
|
KeyCode::Enter => self.chdir_or_send_file().await,
|
||||||
|
_ => self.file_picker.handle(&event).unwrap_or_default(),
|
||||||
|
},
|
||||||
|
SendingScreen::Peers => match code {
|
||||||
|
KeyCode::Tab => *sending_screen = SendingScreen::Files,
|
||||||
|
KeyCode::Enter => self.send_content().await,
|
||||||
|
KeyCode::Up => self.peer_state.select_previous(),
|
||||||
|
KeyCode::Down => self.peer_state.select_next(),
|
||||||
|
_ => {}
|
||||||
|
},
|
||||||
|
_ => unreachable!(),
|
||||||
|
},
|
||||||
|
_ => {}
|
||||||
|
},
|
||||||
},
|
},
|
||||||
|
CurrentScreen::Sending(sending_screen) => match sending_screen {
|
||||||
|
SendingScreen::Text => match code {
|
||||||
|
KeyCode::Tab => *sending_screen = SendingScreen::Peers,
|
||||||
|
KeyCode::Enter => self.send_text().await,
|
||||||
|
KeyCode::Esc => {
|
||||||
|
self.text = None;
|
||||||
|
*sending_screen = SendingScreen::Files;
|
||||||
|
}
|
||||||
|
_ => { /* todo: add input widget to handle key input here */ }
|
||||||
|
},
|
||||||
|
_ => unreachable!(),
|
||||||
|
},
|
||||||
|
|
||||||
|
CurrentScreen::Stopping => {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue