diff options
Diffstat (limited to 'src/commands/delete_files.rs')
-rw-r--r-- | src/commands/delete_files.rs | 100 |
1 files changed, 53 insertions, 47 deletions
diff --git a/src/commands/delete_files.rs b/src/commands/delete_files.rs index 4f062bc..2f336fa 100644 --- a/src/commands/delete_files.rs +++ b/src/commands/delete_files.rs @@ -10,27 +10,7 @@ use crate::io::{FileOperation, FileOperationOptions, IoWorkerThread}; use crate::ui::widgets::TuiPrompt; use crate::ui::AppBackend; -fn delete_files( - context: &mut AppContext, - backend: &mut AppBackend, - background: bool, - permanently: bool, -) -> JoshutoResult<()> { - let paths = context - .tab_context_ref() - .curr_tab_ref() - .curr_list_ref() - .map(|s| s.get_selected_paths()) - .unwrap_or_default(); - let paths_len = paths.len(); - if paths_len == 0 { - let err = JoshutoError::new( - JoshutoErrorKind::InvalidParameters, - "no files selected".to_string(), - ); - return Err(err); - } - +fn prompt(context: &mut AppContext, backend: &mut AppBackend, paths_len: usize) -> bool { let ch = { let prompt_str = format!("Delete {} files? (Y/n)", paths_len); let mut prompt = TuiPrompt::new(&prompt_str); @@ -39,7 +19,7 @@ fn delete_files( match ch { Key::Char('Y') | Key::Char('y') | Key::Char('\n') => { - let confirm_delete = if paths_len > 1 { + if paths_len > 1 { // prompt user again for deleting multiple files let ch = { let prompt_str = "Are you sure? (y/N)"; @@ -49,42 +29,68 @@ fn delete_files( ch == Key::Char('y') } else { true - }; - if confirm_delete { - let file_op = FileOperation::Delete; - let options = FileOperationOptions { - overwrite: false, - skip_exist: false, - permanently: !context.config_ref().use_trash || permanently, - }; - - let dest = path::PathBuf::new(); - let worker_thread = IoWorkerThread::new(file_op, paths.clone(), dest, options); - if background { - context.worker_context_mut().push_worker(worker_thread); - } else { - let (wtx, _) = mpsc::channel(); - worker_thread.start(wtx)?; - } - - let history = context.tab_context_mut().curr_tab_mut().history_mut(); - for path in paths.iter().filter(|p| p.is_dir()) { - history.remove(path); - } } - Ok(()) } - _ => Ok(()), + _ => false, } } +fn delete_files( + context: &mut AppContext, + paths: Vec<path::PathBuf>, + background: bool, + permanently: bool, +) -> JoshutoResult<()> { + let file_op = FileOperation::Delete; + let options = FileOperationOptions { + overwrite: false, + skip_exist: false, + permanently: !context.config_ref().use_trash || permanently, + }; + + let dest = path::PathBuf::new(); + let worker_thread = IoWorkerThread::new(file_op, paths.clone(), dest, options); + if background { + context.worker_context_mut().push_worker(worker_thread); + } else { + let (wtx, _) = mpsc::channel(); + worker_thread.start(wtx)?; + } + + let history = context.tab_context_mut().curr_tab_mut().history_mut(); + for path in paths.iter().filter(|p| p.is_dir()) { + history.remove(path); + } + + Ok(()) +} + pub fn delete_selected_files( context: &mut AppContext, backend: &mut AppBackend, background: bool, permanently: bool, + noconfirm: bool, ) -> JoshutoResult { - delete_files(context, backend, background, permanently)?; + let paths = context + .tab_context_ref() + .curr_tab_ref() + .curr_list_ref() + .map(|s| s.get_selected_paths()) + .unwrap_or_default(); + + let paths_len = paths.len(); + if paths_len == 0 { + let err = JoshutoError::new( + JoshutoErrorKind::InvalidParameters, + "no files selected".to_string(), + ); + return Err(err); + } + + if noconfirm || prompt(context, backend, paths_len) { + delete_files(context, paths, background, permanently)?; + } let curr_tab = context.tab_context_ref().curr_tab_ref(); let options = context.config_ref().display_options_ref().clone(); |