From 4e8c50d92d0077e3f6cec61cb936db425acefdc8 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Thu, 17 Sep 2020 14:30:00 +0200 Subject: [PATCH] FileManager: Handle drop events in DirectoryView This makes it possible to drag & drop files to/from the desktop! :^) --- Applications/FileManager/DirectoryView.cpp | 43 +++++++++++++++++++--- Applications/FileManager/DirectoryView.h | 2 +- Applications/FileManager/main.cpp | 34 ----------------- 3 files changed, 38 insertions(+), 41 deletions(-) diff --git a/Applications/FileManager/DirectoryView.cpp b/Applications/FileManager/DirectoryView.cpp index 897106c65a..772890c552 100644 --- a/Applications/FileManager/DirectoryView.cpp +++ b/Applications/FileManager/DirectoryView.cpp @@ -29,6 +29,7 @@ #include #include #include +#include #include #include #include @@ -211,8 +212,7 @@ void DirectoryView::setup_icon_view() on_context_menu_request(index, event); }; m_icon_view->on_drop = [this](auto& index, auto& event) { - if (on_drop) - on_drop(index, event); + handle_drop(index, event); }; } @@ -236,8 +236,7 @@ void DirectoryView::setup_columns_view() }; m_columns_view->on_drop = [this](auto& index, auto& event) { - if (on_drop) - on_drop(index, event); + handle_drop(index, event); }; } @@ -262,8 +261,7 @@ void DirectoryView::setup_table_view() }; m_table_view->on_drop = [this](auto& index, auto& event) { - if (on_drop) - on_drop(index, event); + handle_drop(index, event); }; } @@ -521,3 +519,36 @@ void DirectoryView::setup_actions() [this](auto&) { do_delete(false); }, window()); } + +void DirectoryView::handle_drop(const GUI::ModelIndex& index, const GUI::DropEvent& event) +{ + if (!event.mime_data().has_urls()) + return; + auto urls = event.mime_data().urls(); + if (urls.is_empty()) { + dbg() << "No files to drop"; + return; + } + + auto& target_node = node(index); + if (!target_node.is_directory()) + return; + + for (auto& url_to_copy : urls) { + if (!url_to_copy.is_valid() || url_to_copy.path() == target_node.full_path()) + continue; + auto new_path = String::format("%s/%s", + target_node.full_path().characters(), + LexicalPath(url_to_copy.path()).basename().characters()); + + if (url_to_copy.path() == new_path) + continue; + + if (!FileUtils::copy_file_or_directory(url_to_copy.path(), new_path)) { + auto error_message = String::format("Could not copy %s into %s.", + url_to_copy.to_string().characters(), + new_path.characters()); + GUI::MessageBox::show(window(), error_message, "File Manager", GUI::MessageBox::Type::Error); + } + } +}; diff --git a/Applications/FileManager/DirectoryView.h b/Applications/FileManager/DirectoryView.h index ecad569e72..d8cbc18592 100644 --- a/Applications/FileManager/DirectoryView.h +++ b/Applications/FileManager/DirectoryView.h @@ -82,7 +82,6 @@ public: Function on_path_change; Function on_selection_change; Function on_context_menu_request; - Function on_drop; Function on_status_message; Function on_thumbnail_progress; Function on_error; @@ -147,6 +146,7 @@ private: GUI::FileSystemModel& model() { return *m_model; } void handle_selection_change(); + void handle_drop(const GUI::ModelIndex&, const GUI::DropEvent&); void do_delete(bool should_confirm); // ^GUI::ModelClient diff --git a/Applications/FileManager/main.cpp b/Applications/FileManager/main.cpp index ea2a712bdd..2957c4b2fd 100644 --- a/Applications/FileManager/main.cpp +++ b/Applications/FileManager/main.cpp @@ -667,40 +667,6 @@ int run_in_windowed_mode(RefPtr config, String initial_locatio } }; - directory_view.on_drop = [&](const GUI::ModelIndex& index, const GUI::DropEvent& event) { - if (!event.mime_data().has_urls()) - return; - auto urls = event.mime_data().urls(); - if (urls.is_empty()) { - dbg() << "No files to drop"; - return; - } - - auto& target_node = directory_view.node(index); - if (!target_node.is_directory()) - return; - - for (auto& url_to_copy : urls) { - if (!url_to_copy.is_valid() || url_to_copy.path() == target_node.full_path()) - continue; - auto new_path = String::format("%s/%s", - target_node.full_path().characters(), - LexicalPath(url_to_copy.path()).basename().characters()); - - if (url_to_copy.path() == new_path) - continue; - - if (!FileUtils::copy_file_or_directory(url_to_copy.path(), new_path)) { - auto error_message = String::format("Could not copy %s into %s.", - url_to_copy.to_string().characters(), - new_path.characters()); - GUI::MessageBox::show(window, error_message, "File Manager", GUI::MessageBox::Type::Error); - } else { - refresh_tree_view(); - } - } - }; - tree_view.on_selection = [&](const GUI::ModelIndex& index) { if (directories_model->m_previously_selected_index.is_valid()) directories_model->update_node_on_selection(directories_model->m_previously_selected_index, false);