summaryrefslogtreecommitdiffstats
path: root/filesystemwidget.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'filesystemwidget.cpp')
-rw-r--r--filesystemwidget.cpp136
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()){