diff --git a/Userland/Applications/FileManager/FileOperationProgressWidget.cpp b/Userland/Applications/FileManager/FileOperationProgressWidget.cpp index 2c22635700..f88b09440e 100644 --- a/Userland/Applications/FileManager/FileOperationProgressWidget.cpp +++ b/Userland/Applications/FileManager/FileOperationProgressWidget.cpp @@ -26,6 +26,7 @@ FileOperationProgressWidget::FileOperationProgressWidget(FileOperation operation auto& button = *find_descendant_of_type_named("button"); + // FIXME: Show a different animation for deletions auto& file_copy_animation = *find_descendant_of_type_named("file_copy_animation"); file_copy_animation.load_from_file("/res/graphics/file-flying-animation.gif"); file_copy_animation.animate(); @@ -53,6 +54,10 @@ FileOperationProgressWidget::FileOperationProgressWidget(FileOperation operation files_copied_label.set_text("Moving files..."); current_file_action_label.set_text("Moving: "); break; + case FileOperation::Delete: + files_copied_label.set_text("Deleting files..."); + current_file_action_label.set_text("Deleting: "); + break; default: VERIFY_NOT_REACHED(); } @@ -168,6 +173,9 @@ void FileOperationProgressWidget::did_progress(off_t bytes_done, off_t total_byt case FileOperation::Move: files_copied_label.set_text(String::formatted("Moving file {} of {}", files_done, total_file_count)); break; + case FileOperation::Delete: + files_copied_label.set_text(String::formatted("Deleting file {} of {}", files_done, total_file_count)); + break; default: VERIFY_NOT_REACHED(); } diff --git a/Userland/Applications/FileManager/FileUtils.cpp b/Userland/Applications/FileManager/FileUtils.cpp index 4cd3664ea8..c8f2b3ae1d 100644 --- a/Userland/Applications/FileManager/FileUtils.cpp +++ b/Userland/Applications/FileManager/FileUtils.cpp @@ -8,45 +8,14 @@ #include "FileUtils.h" #include "FileOperationProgressWidget.h" #include -#include #include #include -#include #include namespace FileManager { HashTable> file_operation_windows; -void delete_path(String const& path, GUI::Window* parent_window) -{ - struct stat st; - if (lstat(path.characters(), &st)) { - GUI::MessageBox::show(parent_window, - String::formatted("lstat({}) failed: {}", path, strerror(errno)), - "Delete failed", - GUI::MessageBox::Type::Error); - } - - bool is_directory = S_ISDIR(st.st_mode); - auto result = Core::File::remove(path, Core::File::RecursionMode::Allowed, false); - - if (result.is_error()) { - auto& error = result.error(); - if (is_directory) { - GUI::MessageBox::show(parent_window, - String::formatted("Failed to delete directory \"{}\": {}", error.file, error.error_code), - "Delete failed", - GUI::MessageBox::Type::Error); - } else { - GUI::MessageBox::show(parent_window, - String::formatted("Failed to delete file \"{}\": {}", error.file, error.error_code), - "Delete failed", - GUI::MessageBox::Type::Error); - } - } -} - void delete_paths(Vector const& paths, bool should_confirm, GUI::Window* parent_window) { String message; @@ -66,9 +35,7 @@ void delete_paths(Vector const& paths, bool should_confirm, GUI::Window* return; } - for (auto& path : paths) { - delete_path(path, parent_window); - } + run_file_operation(FileOperation::Delete, paths, {}, parent_window); } void run_file_operation(FileOperation operation, Vector const& sources, String const& destination, GUI::Window* parent_window) @@ -105,6 +72,9 @@ void run_file_operation(FileOperation operation, Vector const& sources, case FileOperation::Move: file_operation_args.append("Move"); break; + case FileOperation::Delete: + file_operation_args.append("Delete"); + break; default: VERIFY_NOT_REACHED(); } @@ -112,7 +82,9 @@ void run_file_operation(FileOperation operation, Vector const& sources, for (auto& source : sources) file_operation_args.append(source.characters()); - file_operation_args.append(destination.characters()); + if (operation != FileOperation::Delete) + file_operation_args.append(destination.characters()); + file_operation_args.append(nullptr); if (execvp(file_operation_args.first(), const_cast(file_operation_args.data())) < 0) { @@ -140,6 +112,9 @@ void run_file_operation(FileOperation operation, Vector const& sources, case FileOperation::Move: window->set_title("Moving Files..."); break; + case FileOperation::Delete: + window->set_title("Deleting Files..."); + break; default: VERIFY_NOT_REACHED(); } diff --git a/Userland/Applications/FileManager/FileUtils.h b/Userland/Applications/FileManager/FileUtils.h index 5a7ea64bca..c12573160b 100644 --- a/Userland/Applications/FileManager/FileUtils.h +++ b/Userland/Applications/FileManager/FileUtils.h @@ -10,16 +10,15 @@ #include #include #include -#include namespace FileManager { enum class FileOperation { Copy = 0, - Move + Move, + Delete, }; -void delete_path(String const&, GUI::Window*); void delete_paths(Vector const&, bool should_confirm, GUI::Window*); void run_file_operation(FileOperation, Vector const& sources, String const& destination, GUI::Window*);