diff options
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()){ |