summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJiayi Zhao <jeff.no.zhao@gmail.com>2019-01-05 17:21:21 -0500
committerJiayi Zhao <jeff.no.zhao@gmail.com>2019-01-05 17:21:21 -0500
commit646d2e4fffd5aa73da0ee143054c1488fd409f8b (patch)
tree7971b93ed5e0e3aac3f5a050495fc90f1f3e9571
parent5fb4e14acf9f31761bdccdb293bddfa7db5a1df6 (diff)
move getting user input from ui.rs to input.rs
-rw-r--r--src/joshuto.rs2
-rw-r--r--src/joshuto/command/file_operation.rs7
-rw-r--r--src/joshuto/command/new_directory.rs3
-rw-r--r--src/joshuto/command/open_file.rs47
-rw-r--r--src/joshuto/command/search.rs4
-rw-r--r--src/joshuto/input.rs139
-rw-r--r--src/joshuto/ui.rs135
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;