]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/views/dolphinview.cpp
Add Duplicate feature
[dolphin.git] / src / views / dolphinview.cpp
index 3437db7a76da37f93b818160863c77b233592b78..776436032e1e0815e29866febed011ef8b770c35 100644 (file)
@@ -31,7 +31,6 @@
 #include "kitemviews/kitemlistcontroller.h"
 #include "kitemviews/kitemlistheader.h"
 #include "kitemviews/kitemlistselectionmanager.h"
-#include "renamedialog.h"
 #include "versioncontrol/versioncontrolobserver.h"
 #include "viewproperties.h"
 #include "views/tooltips/tooltipmanager.h"
@@ -52,6 +51,7 @@
 #include <KIO/Paste>
 #include <KIO/PasteJob>
 #include <KIO/PreviewJob>
+#include <KIO/RenameFileDialog>
 #include <KJobWidgets>
 #include <KLocalizedString>
 #include <KMessageBox>
@@ -63,6 +63,7 @@
 #include <QDropEvent>
 #include <QGraphicsSceneDragDropEvent>
 #include <QMenu>
+#include <QMimeDatabase>
 #include <QPixmapCache>
 #include <QPointer>
 #include <QScrollBar>
@@ -637,8 +638,9 @@ void DolphinView::renameSelectedItems()
         connect(m_view, &DolphinItemListView::roleEditingFinished,
                 this, &DolphinView::slotRoleEditingFinished);
     } else {
-        RenameDialog* dialog = new RenameDialog(this, items);
-        connect(dialog, &RenameDialog::renamingFinished, this, &DolphinView::slotRenameDialogRenamingFinished);
+        KIO::RenameFileDialog* dialog = new KIO::RenameFileDialog(items, this);
+        connect(dialog, &KIO::RenameFileDialog::renamingFinished,
+                this, &DolphinView::slotRenameDialogRenamingFinished);
 
         dialog->open();
     }
@@ -703,6 +705,50 @@ void DolphinView::pasteIntoFolder()
     }
 }
 
+void DolphinView::duplicateSelectedItems()
+{
+    const KFileItemList itemList = selectedItems();
+    if (itemList.isEmpty()) {
+        return;
+    }
+
+    const QMimeDatabase db;
+
+    // Duplicate all selected items and append "copy" to the end of the file name
+    // but before the filename extension, if present
+    QList<QUrl> newSelection;
+    for (const auto &item : itemList) {
+        const QUrl originalURL  = item.url();
+        const QString originalFileName = item.name();
+        QString extension = db.suffixForFileName(originalFileName);
+
+        QUrl duplicateURL = originalURL;
+
+        // No extension; new filename is "<oldfilename> copy"
+        if (extension.isEmpty()) {
+            duplicateURL.setPath(i18nc("<file path> copy", "%1 copy", originalURL.path()));
+        // There's an extension; new filename is "<oldfilename> copy.<extension>"
+        } else {
+            // Need to add a dot since QMimeDatabase::suffixForFileName() doesn't include it
+            extension = QLatin1String(".") + extension;
+            const QString directoryPath = originalURL.adjusted(QUrl::RemoveFilename).path();
+            const QString originalFilenameWithoutExtension = originalFileName.chopped(extension.size());
+            // Preserve file's original filename extension in case the casing differs
+            // from what QMimeDatabase::suffixForFileName() returned
+            const QString originalExtension = originalFileName.right(extension.size());
+            duplicateURL.setPath(i18nc("<file path><filename> copy.<extension>", "%1%2 copy%3", directoryPath, originalFilenameWithoutExtension, originalExtension));
+        }
+
+        KIO::CopyJob* job = KIO::copyAs(originalURL, duplicateURL, KIO::HideProgressInfo);
+        KJobWidgets::setWindow(job, this);
+
+        if (job) {
+            newSelection << duplicateURL;
+            KIO::FileUndoManager::self()->recordCopyJob(job);
+        }
+    }
+}
+
 void DolphinView::stopLoading()
 {
     m_model->cancelDirectoryLoading();