From 4dc15fc0634b82cb7c93530d425bb9aa10b32451 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Thu, 13 Feb 2020 21:55:05 +0100 Subject: [PATCH] FileManager: Copy item(s) when dragging and dropping them :^) This patch implements basic drag & drop file management in a narrow set of cases. You can now drag & drop a file onto a folder in the same directory, and the dropped file will be copied into the directory. We'll need to support a lot more variations of this, but this is nice! --- Applications/FileManager/DirectoryView.cpp | 13 ++++++++ Applications/FileManager/DirectoryView.h | 1 + Applications/FileManager/main.cpp | 35 ++++++++++++++++++++++ 3 files changed, 49 insertions(+) diff --git a/Applications/FileManager/DirectoryView.cpp b/Applications/FileManager/DirectoryView.cpp index a5ecaabc5a..c70fd8e215 100644 --- a/Applications/FileManager/DirectoryView.cpp +++ b/Applications/FileManager/DirectoryView.cpp @@ -200,6 +200,19 @@ DirectoryView::DirectoryView(GUI::Widget* parent) on_context_menu_request(*m_columns_view, index, event); }; + m_table_view->on_drop = [this](auto& index, auto& event) { + if (on_drop) + on_drop(*m_table_view, index, event); + }; + m_item_view->on_drop = [this](auto& index, auto& event) { + if (on_drop) + on_drop(*m_item_view, index, event); + }; + m_columns_view->on_drop = [this](auto& index, auto& event) { + if (on_drop) + on_drop(*m_columns_view, index, event); + }; + set_view_mode(ViewMode::Icon); } diff --git a/Applications/FileManager/DirectoryView.h b/Applications/FileManager/DirectoryView.h index 0b66ed14d4..55c31a4084 100644 --- a/Applications/FileManager/DirectoryView.h +++ b/Applications/FileManager/DirectoryView.h @@ -52,6 +52,7 @@ 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; diff --git a/Applications/FileManager/main.cpp b/Applications/FileManager/main.cpp index 15503abb40..2affc3c42d 100644 --- a/Applications/FileManager/main.cpp +++ b/Applications/FileManager/main.cpp @@ -29,6 +29,7 @@ #include "PropertiesDialog.h" #include #include +#include #include #include #include @@ -571,6 +572,40 @@ int main(int argc, char** argv) } }; + directory_view->on_drop = [&](const GUI::AbstractView&, const GUI::ModelIndex& index, const GUI::DropEvent& event) { + if (!index.is_valid()) + return; + if (event.data_type() != "url-list") + return; + auto paths_to_copy = event.data().split('\n'); + if (paths_to_copy.is_empty()) { + dbg() << "No files to drop"; + return; + } + + auto& target_node = directory_view->model().node(index); + if (!target_node.is_directory()) + return; + + for (auto& path_to_copy : paths_to_copy) { + auto url_to_copy = URL(path_to_copy); + if (!url_to_copy.is_valid()) + continue; + auto new_path = String::format("%s/%s", + target_node.full_path(directory_view->model()).characters(), + FileSystemPath(url_to_copy.path()).basename().characters()); + + if (!FileUtils::copy_file_or_directory(url_to_copy.path(), new_path)) { + auto error_message = String::format("Could not copy %s into %s.", + path_to_copy.characters(), + new_path.characters()); + GUI::MessageBox::show(error_message, "File Manager", GUI::MessageBox::Type::Error); + } else { + refresh_tree_view(); + } + } + }; + tree_view->on_selection_change = [&] { auto path = directories_model->full_path(tree_view->selection().first()); if (directory_view->path() == path)