summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJiayi Zhao <jeff.no.zhao@gmail.com>2019-01-02 11:01:08 -0500
committerJiayi Zhao <jeff.no.zhao@gmail.com>2019-01-02 11:01:08 -0500
commit47d972ad4d0a4128599c50c22afa2620162cff74 (patch)
tree65960b125538eafca998612728cff9432662e838
parent37c0d51386f227d350d5cbebae84b8fedee5a753 (diff)
add support for renaming files
-rw-r--r--src/joshuto/command/change_directory.rs3
-rw-r--r--src/joshuto/command/file_operation.rs100
-rw-r--r--src/joshuto/command/open_file.rs36
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,