Add move marked files

This commit is contained in:
2022-04-21 16:47:03 +02:00
parent da1843e48c
commit 8b968ddcb1
4 changed files with 65 additions and 35 deletions
+57 -35
View File
@@ -87,6 +87,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
QMenu *fileMenu = new QMenu(tr("File"), this);
fileMenu->addAction(tr("Open"), this, SLOT(loadFile()), QKeySequence("Ctrl+O"));
fileMenu->addAction(tr("Copy marked files"), this, SLOT(copyMarked()));
fileMenu->addAction(tr("Move marked files"), this, SLOT(moveMarked()));
fileMenu->addAction(tr("Save as"), this, SLOT(saveAs()), QKeySequence("Ctrl+S"));
fileMenu->addAction(tr("Index directory"), this, SLOT(indexDir()));
QAction *liveModeAction = fileMenu->addAction(tr("Live mode"), this, SLOT(liveMode(bool)));
@@ -244,6 +245,57 @@ void MainWindow::closeEvent(QCloseEvent *event)
QMainWindow::closeEvent(event);
}
void MainWindow::copyOrMove(bool copy)
{
QString dest = QFileDialog::getExistingDirectory(this, tr("Select destination"), _lastDir);
QDir dir(dest);
if(!dest.isEmpty() && dir.exists())
{
int i = 0;
QStringList files = m_database->getMarkedFiles();
QProgressDialog progress(copy ? tr("Copying") : tr("Moving"), tr("Cancel"), 0, files.size(), this);
progress.setWindowModality(Qt::WindowModal);
progress.show();
foreach(const QString &file, files)
{
QFileInfo info(file);
QFile srcFile(file);
QFile dstFile(dir.absoluteFilePath(info.fileName()));
if(dstFile.exists())
continue;
if(progress.wasCanceled())
break;
#ifndef __linux__
if(copy)
{
srcFile.open(QIODevice::ReadOnly);
dstFile.open(QIODevice::WriteOnly);
if(ioctl(dstFile.handle(), BTRFS_IOC_CLONE, srcFile.handle()) < 0)
{
dstFile.remove();
dstFile.close();
qDebug() << dstFile.fileName();
srcFile.copy(dstFile.fileName());
}
}
else
{
srcFile.rename(dstFile.fileName());
}
#else
if(copy)
srcFile.copy(dstFile.fileName());
else
srcFile.rename(dstFile.fileName());
#endif
progress.setValue(i++);
}
}
m_database->clearMarkedFiles();
}
void MainWindow::socketNotify()
{
socketNotifier->setEnabled(false);
@@ -377,42 +429,12 @@ void MainWindow::unmarkAndNext()
void MainWindow::copyMarked()
{
QString dest = QFileDialog::getExistingDirectory(this, tr("Select destination"));
QDir dir(dest);
if(!dest.isEmpty() && dir.exists())
{
int i = 0;
QStringList files = m_database->getMarkedFiles();
QProgressDialog progress(tr("Copying"), tr("Cancel"), 0, files.size(), this);
progress.setWindowModality(Qt::WindowModal);
progress.show();
foreach(const QString &file, files)
{
QFileInfo info(file);
QFile srcFile(file);
QFile dstFile(dir.absoluteFilePath(info.fileName()));
copyOrMove(true);
}
if(dstFile.exists())
continue;
if(progress.wasCanceled())
break;
#ifdef __linux__
srcFile.open(QIODevice::ReadOnly);
dstFile.open(QIODevice::WriteOnly);
if(ioctl(dstFile.handle(), BTRFS_IOC_CLONE, srcFile.handle()) < 0)
{
dstFile.remove();
dstFile.close();
qDebug() << dstFile.fileName();
srcFile.copy(dstFile.fileName());
}
#else
srcFile.copy(dstFile.fileName());
#endif
progress.setValue(i++);
}
}
void MainWindow::moveMarked()
{
copyOrMove(false);
}
void MainWindow::toggleFullScreen()