use crate::*; use opener::open; macro_rules! press { (Shift-$($key:tt)+) => { Event::Key(KeyEvent { code: KeyCode::$($key)+, kind: KeyEventKind::Press, modifiers: KeyModifiers::SHIFT, state: KeyEventState::NONE }) }; ($($key:tt)+) => { Event::Key(KeyEvent { code: KeyCode::$($key)+, kind: KeyEventKind::Press, modifiers: KeyModifiers::NONE, state: KeyEventState::NONE }) }; } mod edit; mod save; mod quit; mod help; impl Handle for Perch { fn handle (&mut self, input: &TuiIn) -> Perhaps { let min = self.offset; let max = self.offset + self.display.h().saturating_sub(1); let event = &*input.event(); match &self.mode { Some(Mode::Edit { .. }) => self.handle_edit(event), Some(Mode::Help { page }) => self.handle_help(event, *page), Some(Mode::Save { choice }) => self.handle_save(event, *choice)?, Some(Mode::Quit { choice }) => self.handle_quit(input, *choice)?, None => match event { press!(F(1)) => { self.help_begin() }, press!(Char('q')) => { self.quit_begin(&input) }, press!(Char('w')) => { self.save_begin() }, press!(Up) => { self.cursor_select(-1); }, press!(Down) => { self.cursor_select( 1); }, press!(PageUp) => { self.cursor_select(-(PAGE_SIZE as isize)); }, press!(PageDown) => { self.cursor_select( PAGE_SIZE as isize); }, press!(Left) => { self.column_select(-1); }, press!(Right) => { self.column_select( 1); }, press!(Char('[')) => { self.column_resize(-1); }, press!(Char(']')) => { self.column_resize( 1); }, press!(Char('{')) => { self.column_collapse(true); self.column_select( 1); }, press!(Char('}')) => { self.column_collapse(false); self.column_select(-1); }, press!(Delete) => { self.edit_clear() }, press!(Enter) => { self.edit_begin() }, press!(Char(' ')) => { self.open_in_player()?; }, _ => {} }, } self.clamp(min, max); Ok(None) } } impl Perch { fn open_in_player (&self) -> Usually<()> { open(self.entries[self.cursor].path.as_ref())?; Ok(()) } fn cursor_select (&mut self, amount: isize) { self.cursor = ((self.cursor as isize) + amount).max(0) as usize; } fn column_select (&mut self, amount: isize) { self.column = ((self.column as isize) + amount).max(0) as usize; } fn column_resize (&mut self, amount: isize) { let column = &mut self.columns.0[self.column]; column.width = ((column.width as isize) + amount).max(0) as usize; } fn column_collapse (&mut self, value: bool) { let column = &mut self.columns.0[self.column]; column.collapsed = value; } }