From 8f5b287ea0038a7f1d6bfcd3934c53eb631af72b Mon Sep 17 00:00:00 2001 From: Arno Date: Sun, 4 Sep 2016 18:31:38 +0200 Subject: Implement Copy&Paste for FileWidget While at it, do the context menu, too... --- filewidget.cpp | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++-- filewidget.h | 6 ++++- shemovcleaner.cpp | 1 - 3 files changed, 70 insertions(+), 4 deletions(-) diff --git a/filewidget.cpp b/filewidget.cpp index c5df913..1614d15 100644 --- a/filewidget.cpp +++ b/filewidget.cpp @@ -26,6 +26,11 @@ #include #include #include +#include +#include +#include +#include +#include #include "filewidget.h" #include "filesorter.h" @@ -111,6 +116,7 @@ void FileWidget::setupGui(){ connect(mFileView->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), this, SLOT(fileSelectionChanged(QItemSelection,QItemSelection))); createActions(); + mMimeData = new QMimeData; mFileView->setFocus(); } @@ -136,6 +142,9 @@ void FileWidget::createActions(){ mPasteA = new QAction(QIcon(":/edit-paste.png"), tr("Paste"), this); mPasteA->setShortcut(tr("CTRL+V")); connect(mPasteA, SIGNAL(triggered()), this, SLOT(paste())); + mDeleteA = new QAction(QIcon(":/delete.png"), tr("Delete..."), this); + mDeleteA->setShortcut(Qt::Key_Delete); + connect(mDeleteA, SIGNAL(triggered()), this, SLOT(deleteFiles())); mPropertiesA = new QAction(QIcon(":/diaper.png"), tr("Properties..."), this); mPropertiesA->setShortcut(Qt::Key_Return); connect(mPropertiesA, SIGNAL(triggered()), this, SLOT(properties())); @@ -153,6 +162,7 @@ void FileWidget::createActions(){ editMenu->addAction(mCopyA); editMenu->addAction(mCutA); editMenu->addAction(mPasteA); + editMenu->addAction(mDeleteA); editMenu->addSeparator(); editMenu->addAction(mPropertiesA); editMenu->addSeparator(); @@ -170,10 +180,13 @@ void FileWidget::createActions(){ mToolBar->addAction(mCopyA); mToolBar->addAction(mCutA); mToolBar->addAction(mPasteA); + mToolBar->addAction(mDeleteA); mToolBar->addAction(createSeparator()); mToolBar->addAction(mPropertiesA); mToolBar->addAction(createSeparator()); mToolBar->addAction(Globals::instance()->action(Globals::ConfigAction)); + + addActions(QList() << mRefreshA << mSelDirA << createSeparator() << mDirUpA << mDirBackA << createSeparator() << mCopyA << mCutA << mPasteA << mDeleteA); } void FileWidget::fileData(const QString &fullPath, const QString &md5){ @@ -358,15 +371,59 @@ void FileWidget::clearFilter(){ } void FileWidget::copy(){ - + mFileAction = Copy; + cutOrCopy(); } void FileWidget::cut(){ + mFileAction = Cut; + cutOrCopy(); +} +void FileWidget::cutOrCopy(){ + mMimeData->clear(); + QModelIndexList idxL = mFileView->selectionModel()->selectedRows(NameColumn); + QList files; + foreach(QModelIndex i, idxL){ + QUrl url = QUrl::fromLocalFile(i.data(FullPathRole).toString()); + files << url; + } + mMimeData->setUrls(files); + QClipboard *clip = qApp->clipboard(); + clip->setMimeData(mMimeData); } void FileWidget::paste(){ - + QClipboard *clip = qApp->clipboard(); + const QMimeData *md = clip->mimeData(); + if(md->hasUrls()){ + qApp->setOverrideCursor(Qt::WaitCursor); + QList urls = md->urls(); + int count = 0; + mProgressBar->reset(); + mProgressBar->setMaximum(urls.count() - 1); + foreach (QUrl u, urls){ + QString path = u.toLocalFile(); + QString newDir = mDir->text(); + QFileInfo fi(path); + QString newFile = QString("%1/%2").arg(newDir).arg(fi.fileName()); + mProgressBar->setValue(++count); + if(mFileAction == Copy){ + QString msg = QString(tr("Copying %1").arg(path)); + emit statusMessage(msg); + qApp->processEvents(); + QFile::copy(path, newFile); + }else if(mFileAction == Cut){ + QString msg = QString(tr("Moving %1").arg(path)); + emit statusMessage(msg); + qApp->processEvents(); + QFile::rename(path, newFile); + } + emit statusMessage("Finished Paste!"); + } + gatherData(); + qApp->restoreOverrideCursor(); + } } @@ -487,3 +544,9 @@ void FileWidget::keyPressEvent(QKeyEvent *e){ exit: e->accept(); } + +void FileWidget::contextMenuEvent(QContextMenuEvent *e){ + QMenu contextMenu(this); + contextMenu.addActions(actions()); + contextMenu.exec(e->globalPos()); +} diff --git a/filewidget.h b/filewidget.h index f4458d5..b2060fb 100644 --- a/filewidget.h +++ b/filewidget.h @@ -15,6 +15,7 @@ class QTreeView; class QProgressBar; class QKeyEvent; class QAction; +class QMimeData; class VideoSorter; class FileDisplay; @@ -26,7 +27,7 @@ class FileWidget : public QWidget { enum CustomRoles { AttrsRole = Qt::UserRole + 1, FullPathRole = Qt::UserRole + 2, DurationRole = Qt::UserRole + 3, MD5SumRole = Qt::UserRole + 4, SecondsRole = Qt::UserRole + 5 }; enum { ColumnCount = 5 }; enum Columns { IconColumn = 0, NameColumn = 1, MimeColumn = 2, DurationColumn = 3, Md5Column = 4 }; - enum FileAction { Copy, Paste }; + enum FileAction { Copy, Cut, Paste }; explicit FileWidget(QWidget *parent = 0); QTreeView *fileView() { return mFileView; } QMenuBar *menuBar() { return mMenuBar; } @@ -57,6 +58,7 @@ class FileWidget : public QWidget { protected: virtual void keyPressEvent(QKeyEvent *e); + virtual void contextMenuEvent(QContextMenuEvent *e); private: void setupGui(); @@ -68,6 +70,7 @@ class FileWidget : public QWidget { void readSettings(); void writeSettings(); void deleteRecursive(const QFileInfo &start); + void cutOrCopy(); QAction *createSeparator(); QLineEdit *mDir; QLineEdit *mFilter; @@ -80,6 +83,7 @@ class FileWidget : public QWidget { QSqlDatabase mDb; QSqlQuery mQOrigin; QSqlQuery mQFiles; + QMimeData *mMimeData; QAction *mSelDirA; QAction *mRefreshA; QAction *mDirUpA; diff --git a/shemovcleaner.cpp b/shemovcleaner.cpp index a0f7f4a..3ba0802 100644 --- a/shemovcleaner.cpp +++ b/shemovcleaner.cpp @@ -120,7 +120,6 @@ void ShemovCleaner::createGlobalActions(){ } void ShemovCleaner::createActions(){ - //TorrentWidget mTorRefreshA = new QAction(QIcon(":/refresh.png"), tr("Refresh"), this); connect(mTorRefreshA, SIGNAL(triggered()), mTorrentTab, SLOT(gatherData())); -- cgit v1.2.3-70-g09d2