From 86d3baf2c6c6ff3bb987dcd30cd606f0a45ef626 Mon Sep 17 00:00:00 2001 From: Arno Date: Fri, 2 Sep 2016 21:23:37 +0200 Subject: Basic Version of FileWidget It checks the DB for md5sums and colors the files accordingly. As I said: very basic! --- ShemovCleaner.pro | 8 ++- filewidget.cpp | 147 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ filewidget.h | 37 ++++++++++++++ helper.cpp | 50 +++++++++++++++++++ helper.h | 10 ++++ shemovcleaner.cpp | 3 ++ shemovcleaner.h | 2 + 7 files changed, 255 insertions(+), 2 deletions(-) create mode 100644 filewidget.cpp create mode 100644 filewidget.h create mode 100644 helper.cpp create mode 100644 helper.h diff --git a/ShemovCleaner.pro b/ShemovCleaner.pro index 7b62158..b176492 100644 --- a/ShemovCleaner.pro +++ b/ShemovCleaner.pro @@ -20,7 +20,9 @@ SOURCES += main.cpp\ torrentdisplay.cpp \ torrentwidget.cpp \ shemovcleaner.cpp \ - configurationwidget.cpp + configurationwidget.cpp \ + filewidget.cpp \ + helper.cpp HEADERS += \ filesorter.h \ @@ -28,7 +30,9 @@ HEADERS += \ torrentdisplay.h \ torrentwidget.h \ shemovcleaner.h \ - configurationwidget.h + configurationwidget.h \ + filewidget.h \ + helper.h DISTFILES += diff --git a/filewidget.cpp b/filewidget.cpp new file mode 100644 index 0000000..edcec8a --- /dev/null +++ b/filewidget.cpp @@ -0,0 +1,147 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "filewidget.h" +#include "helper.h" + +FileWidget::FileWidget(QWidget *parent) : QWidget(parent) { + setupGui(); +} + +void FileWidget::setupGui(){ + mDir = new QLineEdit; + QCompleter *fsCompleter = new QCompleter(this); + QDirModel *dirModel = new QDirModel(this); + fsCompleter->setModel(dirModel); + fsCompleter->setCompletionMode(QCompleter::PopupCompletion); + mDir->setCompleter(fsCompleter); + mSelDir = new QPushButton(tr("Browse...")); + connect(mSelDir, SIGNAL(clicked()), this, SLOT(selectDir())); + QLabel *dirL = new QLabel(tr("&Directory")); + dirL->setBuddy(mDir); + + mSearchFile = new QLineEdit; + connect(mSearchFile, SIGNAL(returnPressed()), this, SLOT(searchFile())); + mSearch = new QPushButton(tr("Search")); + connect(mSearch, SIGNAL(clicked()), this, SLOT(searchFile())); + QLabel *searchL = new QLabel(tr("&Search")); + searchL->setBuddy(mSearchFile); + + QGridLayout *topL = new QGridLayout; + topL->addWidget(dirL, 0, 0); + topL->addWidget(mDir, 0, 1); + topL->addWidget(mSelDir, 0, 2); + topL->addWidget(searchL, 1, 0); + topL->addWidget(mSearchFile, 1, 1); + topL->addWidget(mSearch, 1, 2); + + mFileView = new QTreeView; + mFileView->setSortingEnabled(true); + mFileView->setSelectionBehavior(QAbstractItemView::SelectRows); + mFileView->setSelectionMode(QAbstractItemView::ExtendedSelection); + + mModel = new QStandardItemModel; + mFileView->setModel(mModel); + + QSqlDatabase mDb = QSqlDatabase::database("shemovdb"); + if(!mDb.isOpen()){ + mDb.open(); + } + mQOrigin = QSqlQuery(mDb); + mQOrigin.prepare("SELECT COUNT(*) FROM files_origin WHERE cmd5sum = :md5"); + mQFiles = QSqlQuery(mDb); + mQFiles.prepare("SELECT COUNT(*) FROM files WHERE cmd5sum = :md5"); + + QVBoxLayout *mainLayout = new QVBoxLayout; + mainLayout->addLayout(topL); + mainLayout->addWidget(mFileView); + setLayout(mainLayout); + + gatherData(); + +} + +void FileWidget::selectDir(){ + QString dir = QFileDialog::getExistingDirectory(this, tr("Select directory"), QDir::homePath()); + mDir->setText(QDir::toNativeSeparators(dir)); + gatherData(); +} + +void FileWidget::gatherData(){ + QDir d(mDir->text()); + QFileInfoList fl = d.entryInfoList(QStringList() << "*", QDir::Files, QDir::Name); + mModel->clear(); + QStandardItem *root = mModel->invisibleRootItem(); + mModel->setHorizontalHeaderLabels(QStringList() << QChar(0x26A7) << tr("Name") << tr("MIME") << tr("MD5")); + QBrush redBrush(Qt::red); + QBrush greenBrush(Qt::darkGreen); + + QMimeDatabase db; + + foreach(QFileInfo fi, fl){ + QMimeType mime = db.mimeTypeForFile(fi); + QStandardItem *i1; + QStandardItem *i2 = new QStandardItem(fi.fileName()); + i2->setEditable(false); + QStandardItem *i4; + if(mime.name().startsWith("video")){ + i1 = new QStandardItem(QIcon(":/huge_bra.png"), QString()); + QString md5 = Helper::md5Sum(fi.absoluteFilePath()); + i4 = new QStandardItem(md5); + i4->setFont(QFont("courier new")); + int haveFile = md5Count(md5); + if(haveFile){ + i2->setForeground(greenBrush); + }else{ + i2->setForeground(redBrush); + } + }else{ + i1 = new QStandardItem(QIcon(":/gaping_ass.png"), QString()); + i4 = new QStandardItem(tr("n/a")); + i4->setFont(QFont("courier new")); + } + i1->setEditable(false); + + QStandardItem *i3 = new QStandardItem(mime.name()); + i3->setEditable(false); + root->appendRow(QList() << i1 << i2 << i3 << i4); + } + mFileView->resizeColumnToContents(0); + mFileView->resizeColumnToContents(1); + mFileView->resizeColumnToContents(2); +} + +int FileWidget::md5Count(const QString &md5) { + mQOrigin.bindValue(":md5", md5); + mQOrigin.exec(); + int retval = 0; + while(mQOrigin.next()){ + retval = mQOrigin.value(0).toInt(); + } + if(!retval){ + mQFiles.bindValue(":md5", md5); + while(mQFiles.next()){ + retval = mQFiles.value(0).toInt(); + } + } + return retval; +} + +void FileWidget::searchFile(){ + +} diff --git a/filewidget.h b/filewidget.h new file mode 100644 index 0000000..2880d36 --- /dev/null +++ b/filewidget.h @@ -0,0 +1,37 @@ +#ifndef FILEWIDGET_H +#define FILEWIDGET_H + +#include +#include +#include + +class QLineEdit; +class QPushButton; +class QStandardItemModel; +class QTreeView; + +class FileWidget : public QWidget { + Q_OBJECT + public: + explicit FileWidget(QWidget *parent = 0); + + private slots: + void selectDir(); + void searchFile(); + + private: + void setupGui(); + void gatherData(); + int md5Count(const QString &md5); + QLineEdit *mDir; + QPushButton *mSelDir; + QLineEdit *mSearchFile; + QPushButton *mSearch; + QStandardItemModel *mModel; + QTreeView *mFileView; + QSqlDatabase mDb; + QSqlQuery mQOrigin; + QSqlQuery mQFiles; +}; + +#endif // FILEWIDGET_H diff --git a/helper.cpp b/helper.cpp new file mode 100644 index 0000000..d19cdf1 --- /dev/null +++ b/helper.cpp @@ -0,0 +1,50 @@ +#include +#include +#include +#include + +#include "helper.h" + +namespace Helper { + const QString md5Sum(const QString &path){ + QFileInfo info(path); + if(!info.exists() || !info.isFile()){ + return QString(); + } + + QString retval; + QCryptographicHash h(QCryptographicHash::Md5); + QFile file(path); + file.open(QIODevice::ReadOnly); + qint64 read = 0; + if(info.size() < (5 * 1024 * 1024)){ + QByteArray data(4096, '\0'); + do { + read = file.read(data.data(), 4096); + if(read > 0){ + h.addData(data.data(), read); + } + } while (read == 4096); + QByteArray res = h.result(); + retval = res.toHex().toLower(); + }else{ + QByteArray data(512, '\0'); + int offset = info.size() / 3; + file.seek(offset); + int numBytes = 512 * 1024; + int readBytes = 0; + do { + read = file.read(data.data(), 512); + if(read > 0){ + readBytes += read; + }else{ + return QString(); + } + h.addData(data.data(), read); + } while(readBytes < numBytes); + QByteArray res = h.result(); + retval = res.toHex().toLower(); + } + return retval; + } +} diff --git a/helper.h b/helper.h new file mode 100644 index 0000000..e005423 --- /dev/null +++ b/helper.h @@ -0,0 +1,10 @@ +#ifndef HELPER_H +#define HELPER_H + +#include + +namespace Helper { + const QString md5Sum(const QString &path); +} + +#endif // HELPER_H diff --git a/shemovcleaner.cpp b/shemovcleaner.cpp index e6147c9..59653ae 100644 --- a/shemovcleaner.cpp +++ b/shemovcleaner.cpp @@ -13,6 +13,7 @@ #include "shemovcleaner.h" #include "torrentwidget.h" +#include "filewidget.h" #include "torrentdisplay.h" #include "configurationwidget.h" @@ -25,7 +26,9 @@ ShemovCleaner::ShemovCleaner(QWidget *parent, Qt::WindowFlags f) : QMainWindow(p mTorrentTab = new TorrentWidget; mTab = new QTabWidget; + mFileTab = new FileWidget; mTab->addTab(mTorrentTab, tr("Torrents")); + mTab->addTab(mFileTab, tr("Files")); setCentralWidget(mTab); createStatusBar(); diff --git a/shemovcleaner.h b/shemovcleaner.h index ccbdd63..a518ae2 100644 --- a/shemovcleaner.h +++ b/shemovcleaner.h @@ -5,6 +5,7 @@ class QTabWidget; class TorrentWidget; +class FileWidget; class QLabel; class QAction; @@ -26,6 +27,7 @@ class ShemovCleaner : public QMainWindow { QLabel *mSelected; QTabWidget *mTab; TorrentWidget *mTorrentTab; + FileWidget *mFileTab; QAction *mTorRefreshA; QAction *mTorDeleteA; QAction *mTorMoveA; -- cgit v1.2.3-70-g09d2