summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ShemovCleaner.pro15
-rw-r--r--filesorter.cpp10
-rw-r--r--filesorter.h15
-rw-r--r--main.cpp7
-rw-r--r--shemovcleaner.cpp198
-rw-r--r--shemovcleaner.h36
-rw-r--r--shemovcleaner.qrc8
7 files changed, 265 insertions, 24 deletions
diff --git a/ShemovCleaner.pro b/ShemovCleaner.pro
index e2f02ed..e246968 100644
--- a/ShemovCleaner.pro
+++ b/ShemovCleaner.pro
@@ -4,7 +4,9 @@
#
#-------------------------------------------------
-QT += core gui
+QT += core gui sql
+
+LIBS += "C:\psql\9.5\lib\libpq.lib"
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
@@ -13,6 +15,13 @@ TEMPLATE = app
SOURCES += main.cpp\
- shemovcleaner.cpp
+ shemovcleaner.cpp \
+ filesorter.cpp
+
+HEADERS += shemovcleaner.h \
+ filesorter.h
+
+DISTFILES +=
-HEADERS += shemovcleaner.h
+RESOURCES += \
+ shemovcleaner.qrc
diff --git a/filesorter.cpp b/filesorter.cpp
index fc9d1c4..a87ac6f 100644
--- a/filesorter.cpp
+++ b/filesorter.cpp
@@ -1,6 +1,12 @@
#include "filesorter.h"
-FileSorter::FileSorter()
-{
+FileSorter::FileSorter(QObject *parent) : QSortFilterProxyModel(parent) {}
+bool FileSorter::lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const {
+ QVariant leftData = sourceModel()->data(source_left, Qt::UserRole + 1);
+ QVariant rightData = sourceModel()->data(source_right, Qt::UserRole + 1);
+ if(leftData.type() == QVariant::Int){
+ return leftData.toInt() < rightData.toInt();
+ }
+ return QSortFilterProxyModel::lessThan(source_left, source_right);
}
diff --git a/filesorter.h b/filesorter.h
index 957252d..92bc71e 100644
--- a/filesorter.h
+++ b/filesorter.h
@@ -1,11 +1,16 @@
#ifndef FILESORTER_H
#define FILESORTER_H
+#include <QSortFilterProxyModel>
+
+class FileSorter : public QSortFilterProxyModel {
+ Q_OBJECT
+ public:
+ explicit FileSorter(QObject *parent = 0);
+
+ protected:
+ virtual bool lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const;
-class FileSorter
-{
-public:
- FileSorter();
};
-#endif // FILESORTER_H \ No newline at end of file
+#endif // FILESORTER_H
diff --git a/main.cpp b/main.cpp
index 7b03777..685fd82 100644
--- a/main.cpp
+++ b/main.cpp
@@ -1,11 +1,12 @@
#include "shemovcleaner.h"
#include <QApplication>
-int main(int argc, char *argv[])
-{
+int main(int argc, char *argv[]){
QApplication a(argc, argv);
+ QCoreApplication::setOrganizationName("Sissie's, Inc.");
+ QCoreApplication::setOrganizationDomain("dakara.d-tor.org");
+ QCoreApplication::setApplicationName("ShemovCleaner");
ShemovCleaner w;
w.show();
-
return a.exec();
}
diff --git a/shemovcleaner.cpp b/shemovcleaner.cpp
index 340bda4..21f2337 100644
--- a/shemovcleaner.cpp
+++ b/shemovcleaner.cpp
@@ -1,11 +1,199 @@
+#include <QSqlDatabase>
+#include <QSqlQuery>
+#include <QMessageBox>
+#include <QGridLayout>
+#include <QPushButton>
+#include <QFileDialog>
+#include <QDir>
+#include <QLineEdit>
+#include <QTreeView>
+#include <QStandardItemModel>
+#include <QStandardItem>
+#include <QFileInfo>
+#include <QBrush>
+#include <QLabel>
+#include <QDateTime>
+#include <QSettings>
+#include <QHeaderView>
+#include <QApplication>
+
+#include <QDebug>
+
#include "shemovcleaner.h"
+#include "filesorter.h"
-ShemovCleaner::ShemovCleaner(QWidget *parent)
- : QMainWindow(parent)
-{
+ShemovCleaner::ShemovCleaner(QWidget *parent) : QMainWindow(parent){
+ QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL", "shemovdb");
+ db.setHostName("hadante.d-tor.org");
+ db.setUserName("shemov");
+ db.setPassword("shemov");
+ db.setDatabaseName("shemov2");
+ if(!db.open()){
+ QMessageBox::critical(0, tr("Error"), tr("Could not open database!"));
+ }
+
+ setupGui();
+ gatherData();
}
-ShemovCleaner::~ShemovCleaner()
-{
+ShemovCleaner::~ShemovCleaner(){
+ writeHeaderData();
+ writeSettings();
+}
+
+void ShemovCleaner::setupGui(){
+ qApp->setWindowIcon(QIcon(":/clean_tampon.png"));
+ mDir = new QLineEdit;
+ mDir->setText("C:\\Users\\am\\Downloads");
+ mExt = new QLineEdit;
+ mExt->setText("*.torrent");
+ mSelDir = new QPushButton(tr("Browse..."));
+ connect(mSelDir, SIGNAL(clicked()), this, SLOT(selectDir()));
+ mSelExt = new QPushButton(tr("Go!"));
+ connect(mSelExt, SIGNAL(clicked()), this, SLOT(gatherData()));
+
+ QGridLayout *buttonL = new QGridLayout;
+ buttonL->addWidget(mDir, 0, 0);
+ buttonL->addWidget(mSelDir, 0, 1);
+ buttonL->addWidget(mExt, 1, 0);
+ buttonL->addWidget(mSelExt, 1, 1);
+
+ mFileView = new QTreeView;
+ mFileView->setSortingEnabled(true);
+ mFileView->selectionModel();
+ mFileView->setSelectionBehavior(QAbstractItemView::SelectRows);
+ mFileView->setSelectionMode(QAbstractItemView::ExtendedSelection);
+
+ mModel = new QStandardItemModel;
+ mProxy = new FileSorter;
+ mProxy->setSourceModel(mModel);
+ mFileView->setModel(mProxy);
+ QLabel *fileL = new QLabel(tr("Found:"));
+ readSettings();
+
+ mDelete = new QPushButton(tr("Delete..."));
+ connect(mDelete, SIGNAL(clicked()), this, SLOT(deleteFiles()));
+ mMove = new QPushButton(tr("Move..."));
+ connect(mMove, SIGNAL(clicked()), this, SLOT(moveFiles()));
+ QHBoxLayout *buttonL2 = new QHBoxLayout;
+ buttonL2->addStretch();
+ buttonL2->addWidget(mMove);
+ buttonL2->addWidget(mDelete);
+ buttonL2->addStretch();
+
+ QWidget *mainWidget = new QWidget;
+ QVBoxLayout *mainLayout = new QVBoxLayout;
+ mainLayout->addLayout(buttonL);
+ mainLayout->addWidget(fileL);
+ mainLayout->addWidget(mFileView);
+ mainLayout->addLayout(buttonL2);
+ mainWidget->setLayout(mainLayout);
+ setMinimumWidth(800);
+ setMinimumHeight(600);
+ setCentralWidget(mainWidget);
+}
+
+void ShemovCleaner::gatherData(){
+ QSqlDatabase db = QSqlDatabase::database("shemovdb");
+ QSqlQuery q(db);
+ q.prepare("SELECT COUNT(*) FROM metadata WHERE tsubject = :fn");
+ QDir d(mDir->text());
+ QFileInfoList fl = d.entryInfoList(QStringList() << mExt->text(), QDir::Files, QDir::Name);
+ mModel->clear();
+ QStandardItem *root = mModel->invisibleRootItem();
+ mModel->setHorizontalHeaderLabels(QStringList() << QChar(0x26A7) << tr("Name") << tr("Created"));
+ QBrush redBrush(Qt::red);
+ QBrush greenBrush(Qt::darkGreen);
+ foreach(QFileInfo fi, fl){
+ int result = 0;
+ q.bindValue(":fn", fi.fileName());
+ q.exec();
+ while(q.next()){
+ result = q.value(0).toInt();
+ }
+ QStandardItem *i1;
+ QStandardItem *i2 = new QStandardItem(fi.fileName());
+ QStandardItem *i3 = new QStandardItem(fi.created().toString(Qt::RFC2822Date));
+ if(result){
+ i1 = new QStandardItem(QIcon(":/huge_bra.png"), QString());
+ i1->setData(1);
+ i2->setForeground(greenBrush);
+ }else{
+ i1 = new QStandardItem(QIcon(":/gaping_ass.png"), QString());
+ i1->setData(0);
+ i2->setForeground(redBrush);
+ }
+ i2->setData(fi.absoluteFilePath());
+ root->appendRow(QList<QStandardItem*>() << i1 << i2 << i3);
+ }
+ readHeaderData();
+}
+
+void ShemovCleaner::deleteFiles(){
+ QModelIndexList sel = mFileView->selectionModel()->selectedRows(1);
+ if(sel.isEmpty()){
+ return;
+ }
+ QString q = QString(tr("Really delete %1 file(s)?")).arg(QString::number(sel.count()));
+ int res = QMessageBox::question(this, tr("Delete files..."), q);
+ int ctr = 0;
+ if(res == QMessageBox::Yes){
+ foreach(QModelIndex i, sel){
+ QString fp = i.data(Qt::UserRole + 1).toString();
+ bool ok = QFile::remove(fp);
+ if(ok){
+ ++ctr;
+ }else{
+ QFileInfo fi(fp);
+ QString msg = QString(tr("Shit: %1 vanished from under us!")).arg(fi.fileName());
+ QMessageBox::critical(this, tr("Error"), msg);
+ }
+ }
+ gatherData();
+ }
+}
+
+void ShemovCleaner::moveFiles(){
+ QModelIndexList sel = mFileView->selectionModel()->selectedRows(1);
+ if(sel.isEmpty()){
+ return;
+ }
+ QString dir = QFileDialog::getExistingDirectory(this, tr("Select directory"), QDir::homePath());
+ foreach(QModelIndex i, sel){
+ QFileInfo fp(i.data(Qt::UserRole + 1).toString());
+ QString newfn = QString("%1/%2").arg(dir).arg(fp.fileName());
+ qDebug() << "Would move" << fp.absoluteFilePath()<< "to" << newfn;
+ }
+}
+
+void ShemovCleaner::selectDir(){
+ QString dir = QFileDialog::getExistingDirectory(this, tr("Select directory"), QDir::homePath());
+ mDir->setText(QDir::toNativeSeparators(dir));
+}
+
+void ShemovCleaner::readSettings(){
+ QSettings s;
+ QString dir = s.value("searchdir", QDir::toNativeSeparators(QDir::homePath())).toString();
+ mDir->setText(dir);
+ QString ext = s.value("extension", "*.torrent").toString();
+ mExt->setText(ext);
+}
+
+void ShemovCleaner::writeSettings(){
+ QSettings s;
+ s.setValue("searchdir", mDir->text());
+ s.setValue("extension", mExt->text());
+}
+
+void ShemovCleaner::readHeaderData(){
+ QSettings s;
+ QByteArray headers = s.value("fileheaders").toByteArray();
+ if(!headers.isEmpty()){
+ mFileView->header()->restoreState(headers);
+ }
+}
+void ShemovCleaner::writeHeaderData(){
+ QSettings s;
+ s.setValue("fileheaders", mFileView->header()->saveState());
}
diff --git a/shemovcleaner.h b/shemovcleaner.h
index 0bc5e2d..343b8b7 100644
--- a/shemovcleaner.h
+++ b/shemovcleaner.h
@@ -3,13 +3,39 @@
#include <QMainWindow>
-class ShemovCleaner : public QMainWindow
-{
+class QPushButton;
+class QLineEdit;
+class QTreeView;
+class QStandardItemModel;
+class FileSorter;
+
+class ShemovCleaner : public QMainWindow {
Q_OBJECT
+ public:
+ ShemovCleaner(QWidget *parent = 0);
+ ~ShemovCleaner();
+
+ private slots:
+ void selectDir();
+ void gatherData();
+ void deleteFiles();
+ void moveFiles();
-public:
- ShemovCleaner(QWidget *parent = 0);
- ~ShemovCleaner();
+ private:
+ void setupGui();
+ void readHeaderData();
+ void writeHeaderData();
+ void readSettings();
+ void writeSettings();
+ QLineEdit *mDir;
+ QLineEdit *mExt;
+ QPushButton *mSelDir;
+ QPushButton *mSelExt;
+ QPushButton *mMove;
+ QPushButton *mDelete;
+ QStandardItemModel *mModel;
+ FileSorter *mProxy;
+ QTreeView *mFileView;
};
#endif // SHEMOVCLEANER_H
diff --git a/shemovcleaner.qrc b/shemovcleaner.qrc
index 7646d2b..ee75d03 100644
--- a/shemovcleaner.qrc
+++ b/shemovcleaner.qrc
@@ -1 +1,7 @@
-<RCC/>
+<RCC>
+ <qresource prefix="/">
+ <file>clean_tampon.png</file>
+ <file>gaping_ass.png</file>
+ <file>huge_bra.png</file>
+ </qresource>
+</RCC>