]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/dolphinview.cpp
Bypass a layout issue in QListView::visualRect(), where the horizontal position of...
[dolphin.git] / src / dolphinview.cpp
index fabda169e252f7b8a283426102d5dbcb93ba7c7c..30b07ce4222422ae1e4d8c7c06db5ac0bd1c61d4 100644 (file)
@@ -29,6 +29,7 @@
 #include <QBoxLayout>
 #include <QTimer>
 #include <QScrollBar>
+#include <QClipboard>
 
 #include <kcolorscheme.h>
 #include <kdirlister.h>
@@ -36,7 +37,6 @@
 #include <klocale.h>
 #include <kiconeffect.h>
 #include <kio/netaccess.h>
-#include <kio/renamedialog.h>
 #include <kio/previewjob.h>
 #include <kmimetyperesolver.h>
 #include <konqmimedata.h>
@@ -998,4 +998,162 @@ QString DolphinView::currentViewModeActionName() const
     return QString(); // can't happen
 }
 
+void DolphinView::renameSelectedItems()
+{
+    const KFileItemList items = selectedItems();
+    if (items.count() > 1) {
+        // More than one item has been selected for renaming. Open
+        // a rename dialog and rename all items afterwards.
+        RenameDialog dialog(this, items);
+        if (dialog.exec() == QDialog::Rejected) {
+            return;
+        }
+
+        const QString newName = dialog.newName();
+        if (newName.isEmpty()) {
+            emit errorMessage(dialog.errorString());
+        } else {
+            // TODO: check how this can be integrated into KonqFileUndoManager/KonqOperations
+            // as one operation instead of n rename operations like it is done now...
+            Q_ASSERT(newName.contains('#'));
+
+            // iterate through all selected items and rename them...
+            const int replaceIndex = newName.indexOf('#');
+            Q_ASSERT(replaceIndex >= 0);
+            int index = 1;
+
+            KFileItemList::const_iterator it = items.begin();
+            const KFileItemList::const_iterator end = items.end();
+            while (it != end) {
+                const KUrl& oldUrl = (*it).url();
+                QString number;
+                number.setNum(index++);
+
+                QString name(newName);
+                name.replace(replaceIndex, 1, number);
+
+                if (oldUrl.fileName() != name) {
+                    KUrl newUrl = oldUrl;
+                    newUrl.setFileName(name);
+                    KonqOperations::rename(this, oldUrl, newUrl);
+                    emit doingOperation(KonqFileUndoManager::RENAME);
+                }
+                ++it;
+            }
+        }
+    } else {
+        // Only one item has been selected for renaming. Use the custom
+        // renaming mechanism from the views.
+        Q_ASSERT(items.count() == 1);
+
+        // TODO: Think about using KFileItemDelegate as soon as it supports editing.
+        // Currently the RenameDialog is used, but I'm not sure whether inline renaming
+        // is a benefit for the user at all -> let's wait for some input first...
+        RenameDialog dialog(this, items);
+        if (dialog.exec() == QDialog::Rejected) {
+            return;
+        }
+
+        const QString& newName = dialog.newName();
+        if (newName.isEmpty()) {
+            emit errorMessage(dialog.errorString());
+        } else {
+            const KUrl& oldUrl = items.first().url();
+            KUrl newUrl = oldUrl;
+            newUrl.setFileName(newName);
+            KonqOperations::rename(this, oldUrl, newUrl);
+            emit doingOperation(KonqFileUndoManager::RENAME);
+        }
+    }
+}
+
+void DolphinView::cutSelectedItems()
+{
+    QMimeData* mimeData = new QMimeData();
+    const KUrl::List kdeUrls = selectedUrls();
+    const KUrl::List mostLocalUrls;
+    KonqMimeData::populateMimeData(mimeData, kdeUrls, mostLocalUrls, true);
+    QApplication::clipboard()->setMimeData(mimeData);
+}
+
+void DolphinView::copySelectedItems()
+{
+    QMimeData* mimeData = new QMimeData();
+    const KUrl::List kdeUrls = selectedUrls();
+    const KUrl::List mostLocalUrls;
+    KonqMimeData::populateMimeData(mimeData, kdeUrls, mostLocalUrls, false);
+    QApplication::clipboard()->setMimeData(mimeData);
+}
+
+void DolphinView::paste()
+{
+    QClipboard* clipboard = QApplication::clipboard();
+    const QMimeData* mimeData = clipboard->mimeData();
+
+    const KUrl::List sourceUrls = KUrl::List::fromMimeData(mimeData);
+
+    // per default the pasting is done into the current Url of the view
+    KUrl destUrl(url());
+
+    // check whether the pasting should be done into a selected directory
+    const KUrl::List selectedUrls = this->selectedUrls();
+    if (selectedUrls.count() == 1) {
+        const KFileItem fileItem(S_IFDIR,
+                                 KFileItem::Unknown,
+                                 selectedUrls.first(),
+                                 true);
+        if (fileItem.isDir()) {
+            // only one item is selected which is a directory, hence paste
+            // into this directory
+            destUrl = selectedUrls.first();
+        }
+    }
+
+    if (KonqMimeData::decodeIsCutSelection(mimeData)) {
+        KonqOperations::copy(this, KonqOperations::MOVE, sourceUrls, destUrl);
+        emit doingOperation(KonqFileUndoManager::MOVE);
+        clipboard->clear();
+    } else {
+        KonqOperations::copy(this, KonqOperations::COPY, sourceUrls, destUrl);
+        emit doingOperation(KonqFileUndoManager::COPY);
+    }
+}
+
+QPair<bool, QString> DolphinView::pasteInfo() const
+{
+    QPair<bool, QString> ret;
+    QClipboard* clipboard = QApplication::clipboard();
+    const QMimeData* mimeData = clipboard->mimeData();
+
+    KUrl::List urls = KUrl::List::fromMimeData(mimeData);
+    if (!urls.isEmpty()) {
+        ret.first = true;
+        ret.second = i18ncp("@action:inmenu", "Paste One File", "Paste %1 Files", urls.count());
+    } else {
+        ret.first = false;
+        ret.second = i18nc("@action:inmenu", "Paste");
+    }
+
+    if (ret.first) {
+        const KUrl::List urls = selectedUrls();
+        const uint count = urls.count();
+        if (count > 1) {
+            // pasting should not be allowed when more than one file
+            // is selected
+            ret.first = false;
+        } else if (count == 1) {
+            // Only one file is selected. Pasting is only allowed if this
+            // file is a directory.
+            // TODO: this doesn't work with remote protocols; instead we need a
+            // m_activeViewContainer->selectedFileItems() to get the real KFileItems
+            const KFileItem fileItem(S_IFDIR,
+                                     KFileItem::Unknown,
+                                     urls.first(),
+                                     true);
+            ret.first = fileItem.isDir();
+        }
+    }
+    return ret;
+}
+
 #include "dolphinview.moc"