#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "shemovcleaner.h" #include "filesorter.h" #include "torrentparser.h" #include "torrentdisplay.h" 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(){ 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())); mInfo = new QPushButton(tr("Torrent...")); connect(mInfo, SIGNAL(clicked()), this, SLOT(torrentInfo())); QHBoxLayout *buttonL2 = new QHBoxLayout; buttonL2->addStretch(); buttonL2->addWidget(mMove); buttonL2->addWidget(mDelete); buttonL2->addWidget(mInfo); 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); createStatusbar(); mTorrentDisplay = new TorrentDisplay(this); connect(mFileView->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), this, SLOT(fileSelectionChanged(QItemSelection,QItemSelection))); } void ShemovCleaner::createStatusbar(){ QLabel *l1 = new QLabel(tr("Sel.")); mSelected = new QLabel("000/000"); mSelected->setFrameStyle(QFrame::Panel | QFrame::Sunken); statusBar()->addPermanentWidget(l1); statusBar()->addPermanentWidget(mSelected); } 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() << 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); } } QString msg = QString(tr("Successfully deleted %1 of %2 file(s)")).arg(QString::number(ctr)).arg(QString::number(sel.count())); statusBar()->showMessage(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()); if(!dir.isEmpty()){ int ctr = 0; foreach(QModelIndex i, sel){ QFileInfo fp(i.data(Qt::UserRole + 1).toString()); QString newfn = QString("%1/%2").arg(dir).arg(fp.fileName()); bool ok = QFile::rename(fp.absoluteFilePath(), newfn); if(ok){ ++ctr; } } QString msg = QString(tr("Successfully moved %1 of %2 file(s)")).arg(QString::number(ctr)).arg(QString::number(sel.count())); statusBar()->showMessage(msg); gatherData(); } } void ShemovCleaner::torrentInfo(){ QModelIndexList sel = mFileView->selectionModel()->selectedRows(1); if(sel.isEmpty()){ return; } QString fn = sel.first().data(Qt::UserRole + 1).toString(); TorrentParser p(fn, this); QList tData = p.parse(); tData.removeAll(QVariant()); tData.removeAll(0); mTorrentDisplay->setData(tData); mTorrentDisplay->show(); return; } void ShemovCleaner::selectDir(){ QString dir = QFileDialog::getExistingDirectory(this, tr("Select directory"), QDir::homePath()); mDir->setText(QDir::toNativeSeparators(dir)); } void ShemovCleaner::fileSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected){ Q_UNUSED(selected); Q_UNUSED(deselected); int count = mFileView->selectionModel()->selectedRows().count(); int total = mModel->rowCount(); QString msg = QString("%1/%2").arg(QString::number(count)).arg(QString::number(total)); mSelected->setText(msg); } 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()); }