diff options
author | Jiayi Zhao <jeff.no.zhao@gmail.com> | 2019-01-02 11:01:08 -0500 |
---|---|---|
committer | Jiayi Zhao <jeff.no.zhao@gmail.com> | 2019-01-02 11:01:08 -0500 |
commit | 47d972ad4d0a4128599c50c22afa2620162cff74 (patch) | |
tree | 65960b125538eafca998612728cff9432662e838 | |
parent | 37c0d51386f227d350d5cbebae84b8fedee5a753 (diff) |
add support for renaming files
-rw-r--r-- | src/joshuto/command/change_directory.rs | 3 | ||||
-rw-r--r-- | src/joshuto/command/file_operation.rs | 100 | ||||
-rw-r--r-- | src/joshuto/command/open_file.rs | 36 |
3 files changed, 83 insertions, 56 deletions
diff --git a/src/joshuto/command/change_directory.rs b/src/joshuto/command/change_directory.rs index 4698e47..c71256c 100644 --- a/src/joshuto/command/change_directory.rs +++ b/src/joshuto/command/change_directory.rs @@ -2,16 +2,13 @@ extern crate fs_extra; extern crate ncurses; use std; -use std::env; use std::fmt; use std::path; use std::process; use joshuto; use joshuto::command; -use joshuto::structs; use joshuto::ui; -use joshuto::unix; #[derive(Debug)] pub struct ChangeDirectory { diff --git a/src/joshuto/command/file_operation.rs b/src/joshuto/command/file_operation.rs index c1c4f65..526bfcf 100644 --- a/src/joshuto/command/file_operation.rs +++ b/src/joshuto/command/file_operation.rs @@ -58,11 +58,6 @@ enum FileOp { Copy, } -pub struct FileClipboard { - files: Vec<path::PathBuf>, - fileop: FileOp, -} - #[derive(Debug)] pub struct CutFiles; @@ -156,10 +151,12 @@ impl PasteFiles { match fs_extra::copy_items_with_progress(&files, &destination, &self.options, handle) { - Ok(s) => {}, - Err(e) => {}, + Ok(_) => { + files.clear(); + }, + Err(_) => { + }, } - files.clear(); } } @@ -263,6 +260,53 @@ pub struct RenameFile; impl RenameFile { pub fn new() -> Self { RenameFile } pub fn command() -> &'static str { "RenameFile" } + + pub fn rename_file(path: &path::PathBuf, context: &mut joshuto::JoshutoContext) + { + if let Some(file_name) = path.file_name() { + let mut term_rows: i32 = 0; + let mut term_cols: i32 = 0; + ncurses::getmaxyx(ncurses::stdscr(), &mut term_rows, &mut term_cols); + + let mut win = window::JoshutoPanel::new(1, term_cols, (term_rows as usize - 1, 0)); + ncurses::keypad(win.win, true); + + const PROMPT: &str = ":rename_file "; + ncurses::wprintw(win.win, PROMPT); + + win.move_to_top(); + ncurses::doupdate(); + + ncurses::wmove(win.win, 0, PROMPT.len() as i32); + + match ui::get_str(&win, (0, PROMPT.len() as i32)) { + Some(s) => { + let mut new_path = path.parent().unwrap().to_path_buf(); + new_path.push(s); + match fs::rename(&path, &new_path) { + Ok(_) => { + context.reload_dirlists(); + + ui::redraw_view(&context.views.left_win, context.parent_list.as_ref()); + ui::redraw_view(&context.views.mid_win, context.curr_list.as_ref()); + ui::redraw_view(&context.views.right_win, context.preview_list.as_ref()); + + ui::redraw_status(&context.views, context.curr_list.as_ref(), + &context.curr_path, + &context.config_t.username, &context.config_t.hostname); + }, + Err(e) => { + ui::wprint_err(&context.views.bot_win, e.to_string().as_str()); + }, + } + }, + None => {}, + } + win.destroy(); + ncurses::update_panels(); + ncurses::doupdate(); + } + } } impl command::JoshutoCommand for RenameFile {} @@ -277,36 +321,16 @@ impl std::fmt::Display for RenameFile { impl command::Runnable for RenameFile { fn execute(&self, context: &mut joshuto::JoshutoContext) { - - ui::wprint_msg(&context.views.bot_win, - format!("Delete selected files? (Y/n)").as_str()); - ncurses::doupdate(); - - let ch = ncurses::wgetch(context.views.bot_win.win); - if ch == Keycode::LOWER_Y as i32 || ch == Keycode::ENTER as i32 { - if let Some(s) = context.curr_list.as_mut() { - if let Some(paths) = collect_selected_paths(s) { - for path in &paths { - if path.is_dir() { - std::fs::remove_dir_all(&path); - } else { - std::fs::remove_file(&path); - } - } - } - } - context.reload_dirlists(); - - ui::wprint_msg(&context.views.bot_win, "Deleted files"); - - ui::redraw_view(&context.views.left_win, context.parent_list.as_ref()); - ui::redraw_view(&context.views.mid_win, context.curr_list.as_ref()); - ui::redraw_view(&context.views.right_win, context.preview_list.as_ref()); - } else { - ui::redraw_status(&context.views, context.curr_list.as_ref(), - &context.curr_path, - &context.config_t.username, &context.config_t.hostname); + let dirlist = match context.curr_list.as_ref() { + Some(s) => match s.get_curr_entry() { + Some(s) => Some(s.entry.path()), + None => None, + }, + None => None, + }; + + if let Some(path) = dirlist { + Self::rename_file(&path, context); } - ncurses::doupdate(); } } diff --git a/src/joshuto/command/open_file.rs b/src/joshuto/command/open_file.rs index 5a811cb..260eb6e 100644 --- a/src/joshuto/command/open_file.rs +++ b/src/joshuto/command/open_file.rs @@ -1,12 +1,10 @@ extern crate fs_extra; extern crate ncurses; +extern crate mime_guess; use std; -use std::collections::HashMap; use std::env; -use std::fs; use std::fmt; -use std::mem; use std::path; use joshuto; @@ -51,7 +49,7 @@ impl command::Runnable for OpenFile { } if path.is_file() { - unix::open_file(&context.mimetype_t.mimetypes, &context.views.bot_win, path.as_path()); + unix::open_file(&context.mimetype_t, &context.views.bot_win, path.as_path()); } else if path.is_dir() { match env::set_current_dir(&path) { Ok(_) => {}, @@ -197,18 +195,26 @@ impl OpenFileWith { let mut term_cols: i32 = 0; ncurses::getmaxyx(ncurses::stdscr(), &mut term_rows, &mut term_cols); - let mimetype = unix::get_mime_type(pathbuf.as_path()); - - let mut empty_vec: Vec<Vec<String>> = Vec::new(); - let mimetype_options: &Vec<Vec<String>>; - match mimetype_t.mimetypes.get(&mimetype) { - Some(s) => { - mimetype_options = s; - }, - None => { - mimetype_options = &empty_vec; + let file_ext: Option<&str> = match pathbuf.extension() { + Some(s) => s.to_str(), + None => None, + }; + + let mimetype: Option<&str> = match file_ext { + Some(extstr) => mime_guess::get_mime_type_str(extstr), + None => None, + }; + + let empty_vec: Vec<Vec<String>> = Vec::new(); + let mimetype_options: &Vec<Vec<String>> = match mimetype { + Some(mimetype) => { + match mimetype_t.mimetypes.get(mimetype) { + Some(s) => s, + None => &empty_vec, + } }, - } + None => &empty_vec, + }; let option_size = mimetype_options.len(); let mut win = window::JoshutoPanel::new(option_size as i32 + 2, term_cols, |