mirror of
https://codeberg.org/unspeaker/perch.git
synced 2025-12-06 09:36:42 +01:00
82 lines
3.1 KiB
Rust
82 lines
3.1 KiB
Rust
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<TuiIn> for Perch {
|
|
fn handle (&mut self, input: &TuiIn) -> Perhaps<bool> {
|
|
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;
|
|
}
|
|
}
|