summaryrefslogtreecommitdiffstats
path: root/src/commands/delete_files.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/commands/delete_files.rs')
-rw-r--r--src/commands/delete_files.rs100
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();