diff options
author | Arno <am@disconnect.de> | 2010-12-21 19:12:40 +0100 |
---|---|---|
committer | Arno <am@disconnect.de> | 2010-12-21 19:12:40 +0100 |
commit | f3d62ad86a1def4d11d132af7366874f43a438b9 (patch) | |
tree | fd46290dfc6da30be98b9bfe7d4566a7f4785312 /filesystemwidget.cpp | |
parent | 8abf0a7882dbd1c80e24e5d01b79cd1cf60925e2 (diff) | |
download | SheMov-f3d62ad86a1def4d11d132af7366874f43a438b9.tar.gz SheMov-f3d62ad86a1def4d11d132af7366874f43a438b9.tar.bz2 SheMov-f3d62ad86a1def4d11d132af7366874f43a438b9.zip |
Fix copy, cut and paste files
Make this options in the context and edit menu of FilesystemWidget
behave a lot more as expected. Copy and cut just copies the file names
to the clipboard, and paste paste moves them if they were cut and copies
them when the action was copy.
Still need to fix the colors when something is marked somehow. Should be
configurable :)
Diffstat (limited to 'filesystemwidget.cpp')
-rw-r--r-- | filesystemwidget.cpp | 136 |
1 files changed, 85 insertions, 51 deletions
diff --git a/filesystemwidget.cpp b/filesystemwidget.cpp index 33c6be5..f5dd632 100644 --- a/filesystemwidget.cpp +++ b/filesystemwidget.cpp @@ -24,6 +24,10 @@ #include <QFile> #include <QTextStream> #include <QSqlQuery> +#include <QClipboard> +#include <QMimeData> +#include <QUrl> +#include <QList> #include "filesystemwidget.h" #include "filesystemdirproxy.h" @@ -35,7 +39,7 @@ #include "pictureviewer.h" #include "smglobals.h" -FilesystemWidget::FilesystemWidget(QWidget *parent) : QWidget(parent) { +FilesystemWidget::FilesystemWidget(QWidget *parent) : QWidget(parent), mClipboardMode(None) { mModel = new FileSystemModel; mModel->setRootPath("/"); mModel->setFilter(QDir::AllEntries | QDir::NoDot); @@ -234,66 +238,49 @@ void FilesystemWidget::deleteFiles(){ emit statusbarMessage(message); } -void FilesystemWidget::copyFiles(){ +void FilesystemWidget::toClipboard(int clipmode){ + mClipboardMode = clipmode; + QClipboard *clip = qApp->clipboard(); QModelIndexList selected = mFileView->selectionModel()->selectedRows(); + clip->clear(); + mModel->clearClipboardList(); if(selected.isEmpty()){ - emit statusbarMessage(tr("No files selected!")); return; } - QSortFilterProxyModel *proxy = static_cast<QSortFilterProxyModel*>(mFileView->model()); - QModelIndex rootIndex = proxy->mapToSource(mFileView->rootIndex()); - QFileInfo root = mModel->fileInfo(rootIndex); - QString message = QString(tr("Really copy %1 files to %2?")).arg(selected.count()).arg(root.absoluteFilePath()); - int retval = QMessageBox::question(this, tr("Question"), message, QMessageBox::Yes | QMessageBox::No); - if(retval == QMessageBox::Yes){ - int files(0), dirs(0), failed(0); - foreach(QModelIndex idx, selected){ - QModelIndex real = proxy->mapToSource(idx); - QFileInfo info = mModel->fileInfo(real); - if(info.isDir()){ - ++dirs; - copyRecursive(info, root.absoluteFilePath()); - }else{ - QString newFile = QString("%1/%2").arg(root.absoluteFilePath()).arg(info.fileName()); - if(QFile::copy(info.absoluteFilePath(), newFile)){ - ++files; - }else{ - ++failed; - } - } + QList<QUrl> files; + foreach(QModelIndex idx, selected){ + if(idx.data(QFileSystemModel::FileNameRole).toString() == ".."){ + continue; } - QString message = QString(tr("Successfully copied %1 files and %2 directories, %3 errors")).arg(files).arg(dirs).arg(failed); - statusbarMessage(message); - mFileView->selectionModel()->clearSelection(); + files << QUrl::fromLocalFile(idx.data(QFileSystemModel::FilePathRole).toString()); + mModel->markForClipboard(mFileProxy->mapToSource(idx)); } + QMimeData *mimeData = new QMimeData; + mimeData->setUrls(files); + clip->setMimeData(mimeData); } -void FilesystemWidget::moveFiles(){ - QModelIndexList selected = mFileView->selectionModel()->selectedRows(); - if(selected.isEmpty()){ - emit statusbarMessage(tr("No files selected!")); +void FilesystemWidget::fromClipboard(){ + QClipboard *clip = qApp->clipboard(); + const QMimeData *mimeData = clip->mimeData(); + if(!mimeData->hasUrls()){ return; } - QSortFilterProxyModel *proxy = static_cast<QSortFilterProxyModel*>(mFileView->model()); - QModelIndex rootIndex = proxy->mapToSource(mFileView->rootIndex()); - QFileInfo root = mModel->fileInfo(rootIndex); - QString message = QString(tr("Really move %1 file(s) to %2?")).arg(selected.count()).arg(root.absoluteFilePath()); - int retval = QMessageBox::question(this, tr("Question"), message, QMessageBox::Yes | QMessageBox::No); - if(retval == QMessageBox::Yes){ - int success(0), failed(0); - foreach(QModelIndex cur, selected){ - QModelIndex real = proxy->mapToSource(cur); - QFileInfo info = mModel->fileInfo(real); - QString dest = QString("%1/%2").arg(root.absoluteFilePath()).arg(info.fileName()); - if(QFile::rename(info.absoluteFilePath(), dest)){ - ++success; - }else{ - ++failed; - } - } - QString message = QString(tr("Successfully moved %1 file(s), %2 errors")).arg(success).arg(failed); - emit statusbarMessage(message); - mFileView->selectionModel()->clearSelection(); + QStringList files; + foreach(QUrl url, mimeData->urls()){ + files << url.toLocalFile(); + } + const QString destDir = selectedDir(); + QFileInfo destDirFi(destDir); + if(!destDirFi.isDir()){ + return; + } + if(mClipboardMode == Copy){ + mModel->clearClipboardList(); + copyFiles(files, destDir); + }else if(mClipboardMode == Cut){ + mModel->clearClipboardList(); + moveFiles(files, destDir); } } @@ -478,6 +465,26 @@ void FilesystemWidget::deleteRecursive(const QFileInfo &start){ } } +void FilesystemWidget::copyFiles(const QStringList &files, const QString &dest){ + foreach(const QString file, files){ + QFileInfo fi(file); + if(fi.isDir()){ + copyRecursive(fi, dest); + }else if(fi.isFile()){ + const QString destFile = QString("%1/%2").arg(dest).arg(fi.fileName()); + QFile::copy(fi.absoluteFilePath(), destFile); + } + } +} + +void FilesystemWidget::moveFiles(const QStringList &files, const QString &dest){ + foreach(const QString file, files){ + QFileInfo fi(file); + const QString destFile = QString("%1/%2").arg(dest).arg(fi.fileName()); + QFile::rename(file, destFile); + } +} + QPair<QString, QStringList> FilesystemWidget::programData(const QString &prefix, const QString &preferred){ QSettings s; QString section = QString("programs_%1").arg(prefix); @@ -521,6 +528,14 @@ void FilesystemWidget::copyRecursive(const QFileInfo &start, const QString &dest } } +const QString FilesystemWidget::selectedDir(){ + const QModelIndexList selected = mDirView->selectionModel()->selectedRows(); + if(!selected.isEmpty()){ + return selected.at(0).data(QFileSystemModel::FilePathRole).toString(); + } + return QString(); +} + void FilesystemWidget::dirExpanded(const QModelIndex &idx){ QModelIndex real = mDirProxy->mapToSource(idx); if(real.isValid()){ @@ -587,6 +602,9 @@ QVariant FileSystemModel::data(const QModelIndex &index, int role) const{ if(mSeen.keys().contains(path)){ return QBrush(Qt::red); } + if(mClipEntries.contains(index)){ + return QBrush(Qt::darkBlue); + } } return QFileSystemModel::data(index, role); } @@ -610,6 +628,22 @@ void FileSystemModel::markAsSeen(const QString &path, bool seen){ } } +void FileSystemModel::markForClipboard(const QPersistentModelIndex &idx){ + if(idx.isValid()){ + if(!mClipEntries.contains(idx)){ + mClipEntries << idx; + } + } +} + +void FileSystemModel::clearClipboardList(){ + QList<QPersistentModelIndex> tmp(mClipEntries); + mClipEntries.clear(); + foreach(QPersistentModelIndex ent, tmp){ + emit dataChanged(ent, ent); + } +} + void FileSystemModel::cleanup(){ QStringList toRemove; foreach(QString p, mSeen.keys()){ |