From 01ee5bc4b31c32e3c4ea68633efad1df50a5a2bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Du=C5=A1an=20Poizl?= Date: Tue, 2 Aug 2016 17:15:54 +0200 Subject: [PATCH] Add copy marked file to directory --- database.cpp | 14 ++++++++++++++ database.h | 1 + mainwindow.cpp | 42 ++++++++++++++++++++++++++++++++++++++++++ mainwindow.h | 1 + 4 files changed, 58 insertions(+) diff --git a/database.cpp b/database.cpp index 26c9110..4d0e0e2 100644 --- a/database.cpp +++ b/database.cpp @@ -65,6 +65,20 @@ bool Database::isMarked(const QString &filename) return m_isMarkedQuery.next(); } +QStringList Database::getMarkedFiles() +{ + QSqlQuery markedFiles("SELECT * from files", m_database); + + QStringList files; + while(markedFiles.next()) + { + files << markedFiles.value("file").toString(); + } + + qDebug() << files.size(); + return files; +} + bool Database::checkError() { QSqlError error = m_database.lastError(); diff --git a/database.h b/database.h index 21d6a45..933bb91 100644 --- a/database.h +++ b/database.h @@ -18,6 +18,7 @@ public: bool mark(const QString &filename); bool unmark(const QString &filename); bool isMarked(const QString &filename); + QStringList getMarkedFiles(); protected: bool checkError(); }; diff --git a/mainwindow.cpp b/mainwindow.cpp index 94791ec..946c6da 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -7,6 +7,10 @@ #include #include #include +#include +#include +#include +#include MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), loading(false), @@ -24,6 +28,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), QMenu *fileMenu = new QMenu(tr("File"), this); fileMenu->addAction(tr("Open"), this, SLOT(openFile()), QKeySequence("Ctrl+O")); + fileMenu->addAction(tr("Copy marked files"), this, SLOT(copyMarked())); fileMenu->addAction(tr("Exit"), this, SLOT(close())); menuBar()->addMenu(fileMenu); @@ -141,6 +146,43 @@ void MainWindow::unmarkAndNext() m_ringList->increment(); } +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())); + + if(dstFile.exists()) + continue; + + if(progress.wasCanceled()) + break; + + 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()); + } + progress.setValue(i++); + } + } +} + void MainWindow::updateWindowTitle() { ImagePtr ptr = m_ringList->currentImage(); diff --git a/mainwindow.h b/mainwindow.h index 8430a5c..e01cfda 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -28,6 +28,7 @@ protected slots: void unmarkImage(); void markAndNext(); void unmarkAndNext(); + void copyMarked(); }; #endif // MAINWINDOW_H