diff options
author | Jiayi Zhao <jeff.no.zhao@gmail.com> | 2019-01-05 17:21:21 -0500 |
---|---|---|
committer | Jiayi Zhao <jeff.no.zhao@gmail.com> | 2019-01-05 17:21:21 -0500 |
commit | 646d2e4fffd5aa73da0ee143054c1488fd409f8b (patch) | |
tree | 7971b93ed5e0e3aac3f5a050495fc90f1f3e9571 | |
parent | 5fb4e14acf9f31761bdccdb293bddfa7db5a1df6 (diff) |
move getting user input from ui.rs to input.rs
-rw-r--r-- | src/joshuto.rs | 2 | ||||
-rw-r--r-- | src/joshuto/command/file_operation.rs | 7 | ||||
-rw-r--r-- | src/joshuto/command/new_directory.rs | 3 | ||||
-rw-r--r-- | src/joshuto/command/open_file.rs | 47 | ||||
-rw-r--r-- | src/joshuto/command/search.rs | 4 | ||||
-rw-r--r-- | src/joshuto/input.rs | 139 | ||||
-rw-r--r-- | src/joshuto/ui.rs | 135 |
7 files changed, 172 insertions, 165 deletions
diff --git a/src/joshuto.rs b/src/joshuto.rs index fa8f226..1b5a77d 100644 --- a/src/joshuto.rs +++ b/src/joshuto.rs @@ -14,7 +14,7 @@ pub mod keymap; pub mod mimetype; mod command; mod history; -// mod navigation; +mod input; mod sort; mod structs; mod ui; diff --git a/src/joshuto/command/file_operation.rs b/src/joshuto/command/file_operation.rs index 4f2d534..5c36469 100644 --- a/src/joshuto/command/file_operation.rs +++ b/src/joshuto/command/file_operation.rs @@ -11,6 +11,7 @@ use std::thread; use joshuto; use joshuto::command; +use joshuto::input; use joshuto::keymap; use joshuto::structs; use joshuto::ui; @@ -389,9 +390,9 @@ impl RenameFile { ncurses::doupdate(); let user_input: Option<String> = match self.method { - RenameFileMethod::Append => ui::get_str_append(&win, (0, PROMPT.len() as i32), start_str), - RenameFileMethod::Prepend => ui::get_str_prepend(&win, (0, PROMPT.len() as i32), start_str), - RenameFileMethod::Overwrite => ui::get_str(&win, (0, PROMPT.len() as i32)), + RenameFileMethod::Append => input::get_str_append(&win, (0, PROMPT.len() as i32), start_str), + RenameFileMethod::Prepend => input::get_str_prepend(&win, (0, PROMPT.len() as i32), start_str), + RenameFileMethod::Overwrite => input::get_str(&win, (0, PROMPT.len() as i32)), }; if let Some(s) = user_input { diff --git a/src/joshuto/command/new_directory.rs b/src/joshuto/command/new_directory.rs index 639e1b1..bbc734c 100644 --- a/src/joshuto/command/new_directory.rs +++ b/src/joshuto/command/new_directory.rs @@ -5,6 +5,7 @@ use std::fmt; use std::path; use joshuto; +use joshuto::input; use joshuto::ui; use joshuto::window; @@ -43,7 +44,7 @@ impl command::Runnable for NewDirectory { win.move_to_top(); ncurses::doupdate(); - if let Some(user_input) = ui::get_str(&win, (0, PROMPT.len() as i32)) { + if let Some(user_input) = input::get_str(&win, (0, PROMPT.len() as i32)) { let path = path::PathBuf::from(user_input); match std::fs::create_dir_all(&path) { Ok(_) => { diff --git a/src/joshuto/command/open_file.rs b/src/joshuto/command/open_file.rs index 586defe..1f736c7 100644 --- a/src/joshuto/command/open_file.rs +++ b/src/joshuto/command/open_file.rs @@ -9,6 +9,7 @@ use std::path; use joshuto; use joshuto::command; +use joshuto::input; use joshuto::mimetype; use joshuto::structs; use joshuto::ui; @@ -203,35 +204,35 @@ impl OpenFileWith { const PROMPT: &str = ":open_with "; ncurses::waddstr(win.win, PROMPT); - match ui::get_str(&win, (option_size as i32 + 1, PROMPT.len() as i32)) { - Some(user_input) => { - win.destroy(); - ncurses::update_panels(); - ncurses::doupdate(); - match user_input.parse::<usize>() { - Ok(s) => { - if s < mimetype_options.len() { - ncurses::savetty(); - ncurses::endwin(); - unix::open_with(pathbuf.as_path(), &mimetype_options[s]); - ncurses::resetty(); - ncurses::refresh(); - } - } - Err(_) => { - let args: Vec<String> = user_input.split_whitespace().map(|x| String::from(x)).collect(); + let user_input = input::get_str(&win, (option_size as i32 + 1, PROMPT.len() as i32)); + + win.destroy(); + ncurses::update_panels(); + ncurses::doupdate(); + + + if let Some(user_input) = user_input { + if user_input.len() == 0 { + return; + } + match user_input.parse::<usize>() { + Ok(s) => { + if s < mimetype_options.len() { ncurses::savetty(); ncurses::endwin(); - unix::open_with(pathbuf.as_path(), &args); + unix::open_with(pathbuf.as_path(), &mimetype_options[s]); ncurses::resetty(); ncurses::refresh(); } } - }, - None => { - win.destroy(); - ncurses::update_panels(); - ncurses::doupdate(); + Err(_) => { + let args: Vec<String> = user_input.split_whitespace().map(|x| String::from(x)).collect(); + ncurses::savetty(); + ncurses::endwin(); + unix::open_with(pathbuf.as_path(), &args); + ncurses::resetty(); + ncurses::refresh(); + } } } } diff --git a/src/joshuto/command/search.rs b/src/joshuto/command/search.rs index 2496781..f3747fd 100644 --- a/src/joshuto/command/search.rs +++ b/src/joshuto/command/search.rs @@ -4,7 +4,7 @@ use std; use std::fmt; use joshuto; -use joshuto::ui; +use joshuto::input; use joshuto::window; use joshuto::command; @@ -44,7 +44,7 @@ impl command::Runnable for Search { let mut index: Option<i32> = None; - if let Some(user_input) = ui::get_str(&win, (0, PROMPT.len() as i32)) { + if let Some(user_input) = input::get_str(&win, (0, PROMPT.len() as i32)) { if let Some(curr_list) = context.curr_list.as_ref() { for (i, dirent) in (&curr_list.contents).into_iter().enumerate() { if dirent.file_name_as_string.contains(user_input.as_str()) { diff --git a/src/joshuto/input.rs b/src/joshuto/input.rs new file mode 100644 index 0000000..4694af7 --- /dev/null +++ b/src/joshuto/input.rs @@ -0,0 +1,139 @@ +extern crate ncurses; +extern crate wcwidth; + +use joshuto::keymap; +use joshuto::window; + +pub fn get_str(win: &window::JoshutoPanel, + coord: (i32, i32)) -> Option<String> +{ + let user_input: Vec<(u8, char)> = Vec::new(); + get_str_prefill(win, coord, user_input, coord.1, 0) +} + +pub fn get_str_append(win: &window::JoshutoPanel, + coord: (i32, i32), start_str: String) -> Option<String> +{ + let mut user_input: Vec<(u8, char)> = Vec::new(); + for (_, ch) in start_str.char_indices() { + let char_len = wcwidth::char_width(ch).unwrap_or(1); + user_input.push((char_len, ch)); + } + let mut curs_x = coord.1; + for (size, _) in &user_input { + curs_x = curs_x + (*size) as i32; + } + let curr_index = user_input.len(); + get_str_prefill(win, coord, user_input, curs_x, curr_index) +} + +pub fn get_str_prepend(win: &window::JoshutoPanel, + coord: (i32, i32), start_str: String) -> Option<String> +{ + let mut user_input: Vec<(u8, char)> = Vec::new(); + for (_, ch) in start_str.char_indices() { + let char_len = wcwidth::char_width(ch).unwrap_or(1); + user_input.push((char_len, ch)); + } + get_str_prefill(win, coord, user_input, coord.1, 0) +} + +pub fn get_str_prefill(win: &window::JoshutoPanel, + coord: (i32, i32), mut user_input: Vec<(u8, char)>, + mut curs_x: i32, mut curr_index: usize) -> Option<String> +{ + loop { + ncurses::wmove(win.win, coord.0, coord.1); + for (_, ch) in &user_input { + ncurses::waddstr(win.win, ch.to_string().as_str()); + } + ncurses::waddstr(win.win, " "); + + ncurses::mvwchgat(win.win, coord.0, curs_x, 1, + ncurses::A_STANDOUT(), 0); + ncurses::wrefresh(win.win); + + let ch: i32 = ncurses::wgetch(win.win); + + if ch == keymap::ESCAPE { + return None; + } else if ch == keymap::ENTER { + break; + } else if ch == ncurses::KEY_HOME { + if curr_index != 0 { + curs_x = coord.1; + curr_index = 0; + } + } else if ch == ncurses::KEY_END { + let user_input_len = user_input.len(); + if curr_index != user_input_len { + for i in curr_index..user_input_len { + curs_x = curs_x + user_input[i].0 as i32; + } + curr_index = user_input_len; + } + } else if ch == ncurses::KEY_LEFT { + if curr_index > 0 { + curr_index = curr_index - 1; + curs_x = curs_x - user_input[curr_index].0 as i32; + } + } else if ch == ncurses::KEY_RIGHT { + let user_input_len = user_input.len(); + if curr_index < user_input_len { + curs_x = curs_x + user_input[curr_index].0 as i32; + curr_index = curr_index + 1; + } + } else if ch == keymap::BACKSPACE { + let user_input_len = user_input.len(); + + if user_input_len == 0 { + continue; + } + + if curr_index == user_input_len { + curr_index = curr_index - 1; + if let Some((size, _)) = user_input.pop() { + curs_x = curs_x - size as i32; + } + } else if curr_index > 0 { + curr_index = curr_index - 1; + let (size, _) = user_input.remove(curr_index); + curs_x = curs_x - size as i32; + } + } else if ch == ncurses::KEY_DC { + let user_input_len = user_input.len(); + + if user_input_len == 0 || curr_index == user_input_len { + continue; + } + + if curr_index > 0 { + let (size, _) = user_input.remove(curr_index); + if curr_index > user_input_len { + curr_index = curr_index - 1; + curs_x = curs_x - size as i32; + } + } else if curr_index == 0 { + user_input.remove(curr_index); + } + } else { + let user_input_len = user_input.len(); + + let ch = ch as u8 as char; + let char_len = wcwidth::char_width(ch).unwrap_or(1); + let size_ch = (char_len, ch); + + if curr_index == user_input_len { + user_input.push(size_ch); + } else { + user_input.insert(curr_index, size_ch); + } + curs_x = curs_x + user_input[curr_index].0 as i32; + curr_index = curr_index + 1; + } + } + let user_str: String = user_input.iter().map(|(_, ch)| ch).collect(); + + return Some(user_str); + +} diff --git a/src/joshuto/ui.rs b/src/joshuto/ui.rs index c8e0835..5a4b16d 100644 --- a/src/joshuto/ui.rs +++ b/src/joshuto/ui.rs @@ -4,7 +4,6 @@ extern crate wcwidth; use std::fs; use std::path; -use joshuto::keymap; use joshuto::structs; use joshuto::unix; use joshuto::window; @@ -292,140 +291,6 @@ pub fn redraw_status(joshuto_view : &window::JoshutoView, } } -pub fn get_str(win: &window::JoshutoPanel, - coord: (i32, i32)) -> Option<String> -{ - let user_input: Vec<(u8, char)> = Vec::new(); - get_str_prefill(win, coord, user_input, coord.1, 0) -} - -pub fn get_str_append(win: &window::JoshutoPanel, - coord: (i32, i32), start_str: String) -> Option<String> -{ - let mut user_input: Vec<(u8, char)> = Vec::new(); - for (_, ch) in start_str.char_indices() { - let char_len = wcwidth::char_width(ch).unwrap_or(1); - user_input.push((char_len, ch)); - } - let mut curs_x = coord.1; - for (size, _) in &user_input { - curs_x = curs_x + (*size) as i32; - } - let curr_index = user_input.len(); - get_str_prefill(win, coord, user_input, curs_x, curr_index) -} - -pub fn get_str_prepend(win: &window::JoshutoPanel, - coord: (i32, i32), start_str: String) -> Option<String> -{ - let mut user_input: Vec<(u8, char)> = Vec::new(); - for (_, ch) in start_str.char_indices() { - let char_len = wcwidth::char_width(ch).unwrap_or(1); - user_input.push((char_len, ch)); - } - get_str_prefill(win, coord, user_input, coord.1, 0) -} - -pub fn get_str_prefill(win: &window::JoshutoPanel, - coord: (i32, i32), mut user_input: Vec<(u8, char)>, - mut curs_x: i32, mut curr_index: usize) -> Option<String> -{ - loop { - ncurses::wmove(win.win, coord.0, coord.1); - for (_, ch) in &user_input { - ncurses::waddstr(win.win, ch.to_string().as_str()); - } - ncurses::waddstr(win.win, " "); - - ncurses::mvwchgat(win.win, coord.0, curs_x, 1, - ncurses::A_STANDOUT(), 0); - ncurses::wrefresh(win.win); - - let ch: i32 = ncurses::wgetch(win.win); - - if ch == keymap::ESCAPE { - return None; - } else if ch == keymap::ENTER { - break; - } else if ch == ncurses::KEY_HOME { - if curr_index != 0 { - curs_x = coord.1; - curr_index = 0; - } - } else if ch == ncurses::KEY_END { - let user_input_len = user_input.len(); - if curr_index != user_input_len { - for i in curr_index..user_input_len { - curs_x = curs_x + user_input[i].0 as i32; - } - curr_index = user_input_len; - } - } else if ch == ncurses::KEY_LEFT { - if curr_index > 0 { - curr_index = curr_index - 1; - curs_x = curs_x - user_input[curr_index].0 as i32; - } - } else if ch == ncurses::KEY_RIGHT { - let user_input_len = user_input.len(); - if curr_index < user_input_len { - curs_x = curs_x + user_input[curr_index].0 as i32; - curr_index = curr_index + 1; - } - } else if ch == keymap::BACKSPACE { - let user_input_len = user_input.len(); - - if user_input_len == 0 { - continue; - } - - if curr_index == user_input_len { - curr_index = curr_index - 1; - if let Some((size, _)) = user_input.pop() { - curs_x = curs_x - size as i32; - } - } else if curr_index > 0 { - curr_index = curr_index - 1; - let (size, _) = user_input.remove(curr_index); - curs_x = curs_x - size as i32; - } - } else if ch == ncurses::KEY_DC { - let user_input_len = user_input.len(); - - if user_input_len == 0 || curr_index == user_input_len { - continue; - } - - if curr_index > 0 { - let (size, _) = user_input.remove(curr_index); - if curr_index > user_input_len { - curr_index = curr_index - 1; - curs_x = curs_x - size as i32; - } - } else if curr_index == 0 { - user_input.remove(curr_index); - } - } else { - let user_input_len = user_input.len(); - - let ch = ch as u8 as char; - let char_len = wcwidth::char_width(ch).unwrap_or(1); - let size_ch = (char_len, ch); - - if curr_index == user_input_len { - user_input.push(size_ch); - } else { - user_input.insert(curr_index, size_ch); - } - curs_x = curs_x + user_input[curr_index].0 as i32; - curr_index = curr_index + 1; - } - } - let user_str: String = user_input.iter().map(|(_, ch)| ch).collect(); - - return Some(user_str); - -} - pub fn draw_loading_bar(win: &window::JoshutoPanel, percentage: f32) { let cols: i32 = (win.cols as f32 * percentage) as i32; |