diff options
Diffstat (limited to 'src/util')
-rw-r--r-- | src/util/input.rs | 47 | ||||
-rw-r--r-- | src/util/keyparse.rs | 15 | ||||
-rw-r--r-- | src/util/sort.rs | 4 |
3 files changed, 50 insertions, 16 deletions
diff --git a/src/util/input.rs b/src/util/input.rs index 48e416c..8e00789 100644 --- a/src/util/input.rs +++ b/src/util/input.rs @@ -1,12 +1,15 @@ -use std::collections::hash_map::Entry; use std::io; use std::path; use signal_hook::consts::signal; -use termion::event::{MouseButton, MouseEvent}; +use termion::event::{Event, Key, MouseButton, MouseEvent}; use tui::layout::{Constraint, Direction, Layout}; +<<<<<<< HEAD +use crate::commands::{cursor_move, parent_cursor_move, AppExecute, CommandKeybind, KeyCommand}; +======= use crate::commands::{cursor_move, parent_cursor_move, AppExecute, KeyCommand}; +>>>>>>> main use crate::config::AppKeyMapping; use crate::context::AppContext; use crate::event::AppEvent; @@ -15,8 +18,44 @@ use crate::history::DirectoryHistory; use crate::io::{FileOp, IoWorkerProgress}; use crate::preview::preview_file::FilePreview; use crate::ui; +use crate::ui::views::TuiCommandMenu; use crate::util::format; +pub fn get_input_while_composite<'a>( + backend: &mut ui::TuiBackend, + context: &mut AppContext, + keymap: &'a AppKeyMapping, +) -> Option<&'a KeyCommand> { + let mut keymap = keymap; + + context.flush_event(); + + loop { + backend.render(TuiCommandMenu::new(context, keymap)); + + if let Ok(event) = context.poll_event() { + match event { + AppEvent::Termion(event) => { + match event { + Event::Key(Key::Esc) => return None, + event => match keymap.as_ref().get(&event) { + Some(CommandKeybind::SimpleKeybind(s)) => { + return Some(s); + } + Some(CommandKeybind::CompositeKeybind(m)) => { + keymap = m; + } + None => return None, + }, + } + context.flush_event(); + } + event => process_noninteractive(event, context), + } + } + } +} + pub fn process_noninteractive(event: AppEvent, context: &mut AppContext) { match event { AppEvent::IoWorkerProgress(res) => process_worker_progress(context, res), @@ -67,6 +106,10 @@ pub fn process_finished_worker(context: &mut AppContext, res: std::io::Result<Io context.message_queue_mut().push_error(msg); } } + + if !context.worker_context_ref().is_busy() && !context.worker_context_ref().is_empty() { + context.worker_context_mut().start_next_job(); + } } pub fn process_dir_preview(context: &mut AppContext, dirlist: JoshutoDirList) { diff --git a/src/util/keyparse.rs b/src/util/keyparse.rs index e850cc2..fb39628 100644 --- a/src/util/keyparse.rs +++ b/src/util/keyparse.rs @@ -50,24 +50,15 @@ pub fn str_to_key(s: &str) -> Option<Key> { if s.starts_with("ctrl+") { let ch = s.chars().nth("ctrl+".len()); - let key = match ch { - Some(ch) => Some(Key::Ctrl(ch)), - None => None, - }; + let key = ch.map(Key::Ctrl); return key; } else if s.starts_with("alt+") { let ch = s.chars().nth("alt+".len()); - let key = match ch { - Some(ch) => Some(Key::Alt(ch)), - None => None, - }; + let key = ch.map(Key::Alt); return key; } else if s.len() == 1 { let ch = s.chars().next(); - let key = match ch { - Some(ch) => Some(Key::Char(ch)), - None => None, - }; + let key = ch.map(Key::Char); return key; } None diff --git a/src/util/sort.rs b/src/util/sort.rs index 4f9f931..b85de49 100644 --- a/src/util/sort.rs +++ b/src/util/sort.rs @@ -162,7 +162,7 @@ fn mtime_sort(file1: &JoshutoDirEntry, file2: &JoshutoDirEntry) -> cmp::Ordering let f2_mtime: time::SystemTime = f2_meta.modified()?; Ok(f1_mtime.cmp(&f2_mtime)) } - compare(&file1, &file2).unwrap_or(cmp::Ordering::Equal) + compare(file1, file2).unwrap_or(cmp::Ordering::Equal) } fn size_sort(file1: &JoshutoDirEntry, file2: &JoshutoDirEntry) -> cmp::Ordering { @@ -183,7 +183,7 @@ fn lexical_sort( let f1_name = f1.file_name(); let f2_name = f2.file_name(); if sort_option.case_sensitive { - f1_name.cmp(&f2_name) + f1_name.cmp(f2_name) } else { let f1_name = f1_name.to_lowercase(); let f2_name = f2_name.to_lowercase(); |