1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
use std::path;
use std::sync::mpsc;
use termion::event::Key;
use crate::context::AppContext;
use crate::error::JoshutoResult;
use crate::history::DirectoryHistory;
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,
) -> std::io::Result<()> {
let paths = context
.tab_context_ref()
.curr_tab_ref()
.curr_list_ref()
.map(|s| s.get_selected_paths())
.unwrap_or_else(Vec::new);
let paths_len = paths.len();
if paths_len == 0 {
return Err(std::io::Error::new(
std::io::ErrorKind::Other,
"no files selected",
));
}
let ch = {
let prompt_str = format!("Delete {} files? (Y/n)", paths_len);
let mut prompt = TuiPrompt::new(&prompt_str);
prompt.get_key(backend, context)
};
match ch {
Key::Char('Y') | Key::Char('y') | Key::Char('\n') => {
let confirm_delete = if paths_len > 1 {
// prompt user again for deleting multiple files
let ch = {
let prompt_str = "Are you sure? (y/N)";
let mut prompt = TuiPrompt::new(prompt_str);
prompt.get_key(backend, context)
};
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,
};
let dest = path::PathBuf::new();
let worker_thread = IoWorkerThread::new(file_op, paths, dest, options);
if background {
context.worker_context_mut().push_worker(worker_thread);
} else {
let (wtx, _) = mpsc::channel();
worker_thread.start(wtx)?;
}
}
Ok(())
}
_ => Ok(()),
}
}
fn _delete_selected_files(
context: &mut AppContext,
backend: &mut AppBackend,
) -> std::io::Result<()> {
delete_files(context, backend, false)?;
let curr_tab = context.tab_context_ref().curr_tab_ref();
let options = context.config_ref().display_options_ref().clone();
let curr_path = curr_tab.cwd().to_path_buf();
for (_, tab) in context.tab_context_mut().iter_mut() {
let tab_options = tab.option_ref().clone();
tab.history_mut()
.reload(&curr_path, &options, &tab_options)?;
}
Ok(())
}
pub fn delete_selected_files(context: &mut AppContext, backend: &mut AppBackend) -> JoshutoResult {
_delete_selected_files(context, backend)?;
Ok(())
}
fn _delete_selected_files_background(
context: &mut AppContext,
backend: &mut AppBackend,
) -> std::io::Result<()> {
delete_files(context, backend, true)?;
let curr_tab = context.tab_context_ref().curr_tab_ref();
let options = context.config_ref().display_options_ref().clone();
let curr_path = curr_tab.cwd().to_path_buf();
for (_, tab) in context.tab_context_mut().iter_mut() {
let tab_options = tab.option_ref().clone();
tab.history_mut()
.reload(&curr_path, &options, &tab_options)?;
}
Ok(())
}
pub fn delete_selected_files_background(
context: &mut AppContext,
backend: &mut AppBackend,
) -> JoshutoResult {
_delete_selected_files(context, backend)?;
Ok(())
}
|