diff options
-rw-r--r-- | ShemovCleaner.pro | 15 | ||||
-rw-r--r-- | filesorter.cpp | 10 | ||||
-rw-r--r-- | filesorter.h | 15 | ||||
-rw-r--r-- | main.cpp | 7 | ||||
-rw-r--r-- | shemovcleaner.cpp | 198 | ||||
-rw-r--r-- | shemovcleaner.h | 36 | ||||
-rw-r--r-- | shemovcleaner.qrc | 8 |
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 @@ -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> |