summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArno <arno@disconnect.de>2016-09-02 21:23:37 +0200
committerArno <arno@disconnect.de>2016-09-02 21:23:37 +0200
commit86d3baf2c6c6ff3bb987dcd30cd606f0a45ef626 (patch)
tree59200a68c08325a46a144a2f1c9e393eadec4e86
parent8203bdcbdbc8c121831db0d197a89842b7178f59 (diff)
downloadShemovCleaner-86d3baf2c6c6ff3bb987dcd30cd606f0a45ef626.tar.gz
ShemovCleaner-86d3baf2c6c6ff3bb987dcd30cd606f0a45ef626.tar.bz2
ShemovCleaner-86d3baf2c6c6ff3bb987dcd30cd606f0a45ef626.zip
Basic Version of FileWidget
It checks the DB for md5sums and colors the files accordingly. As I said: very basic!
-rw-r--r--ShemovCleaner.pro8
-rw-r--r--filewidget.cpp147
-rw-r--r--filewidget.h37
-rw-r--r--helper.cpp50
-rw-r--r--helper.h10
-rw-r--r--shemovcleaner.cpp3
-rw-r--r--shemovcleaner.h2
7 files changed, 255 insertions, 2 deletions
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 <QLineEdit>
+#include <QPushButton>
+#include <QGridLayout>
+#include <QVBoxLayout>
+#include <QStandardItemModel>
+#include <QStandardItem>
+#include <QTreeView>
+#include <QCompleter>
+#include <QDirModel>
+#include <QDir>
+#include <QFileDialog>
+#include <QLabel>
+#include <QMimeDatabase>
+#include <QMimeType>
+#include <QFont>
+#include <QSqlDatabase>
+#include <QSqlQuery>
+
+#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<QStandardItem*>() << 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 <QWidget>
+#include <QSqlDatabase>
+#include <QSqlQuery>
+
+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 <QFile>
+#include <QFileInfo>
+#include <QCryptographicHash>
+#include <QByteArray>
+
+#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 <QString>
+
+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;