summaryrefslogtreecommitdiffstats
path: root/torrentwidget.cpp
diff options
context:
space:
mode:
authorArno <arno@disconnect.de>2016-08-20 17:04:58 +0200
committerArno <arno@disconnect.de>2016-08-20 17:04:58 +0200
commit96c798d4e9ca91cade25aa6d38176714979685bc (patch)
tree0a9293bd203e68faeb28e668fe5e8ab32ec5c1b5 /torrentwidget.cpp
parentddd1616f5c310c94214e0ba2629f174c4cf768f3 (diff)
downloadShemovCleaner-96c798d4e9ca91cade25aa6d38176714979685bc.tar.gz
ShemovCleaner-96c798d4e9ca91cade25aa6d38176714979685bc.tar.bz2
ShemovCleaner-96c798d4e9ca91cade25aa6d38176714979685bc.zip
Revamped ShemovCleaner to a QTabWidget
It's a rather large commit. After renaming ShemovCleaner to TorrentWidget, I had to recreate ShemovCleaner as MainWindow with a single Tab. Then I created QActions for everything, including a QToolBar, a QMenu and a contetext Menu. For that the button bar at the bottom had to go. Oh, and I added some icons for the actions!
Diffstat (limited to 'torrentwidget.cpp')
-rw-r--r--torrentwidget.cpp269
1 files changed, 269 insertions, 0 deletions
diff --git a/torrentwidget.cpp b/torrentwidget.cpp
new file mode 100644
index 0000000..f184324
--- /dev/null
+++ b/torrentwidget.cpp
@@ -0,0 +1,269 @@
+#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 <QStatusBar>
+#include <QRegularExpression>
+#include <QToolBar>
+#include <QMenuBar>
+
+#include <QDebug>
+
+#include "torrentwidget.h"
+#include "filesorter.h"
+#include "torrentparser.h"
+#include "torrentdisplay.h"
+
+TorrentWidget::TorrentWidget(QWidget *parent) : QWidget(parent), mExt("*.torrent") {
+ 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();
+}
+
+TorrentWidget::~TorrentWidget(){
+ writeHeaderData();
+ writeSettings();
+}
+
+void TorrentWidget::setupGui(){
+ mDir = new QLineEdit;
+ mSelDir = new QPushButton(tr("Browse..."));
+ connect(mSelDir, SIGNAL(clicked()), this, SLOT(selectDir()));
+
+ mSearchTorrents = new QLineEdit;
+ connect(mSearchTorrents, SIGNAL(returnPressed()), this, SLOT(searchFile()));
+ mDoSearchTorrents = new QPushButton(tr("Search"));
+ connect(mDoSearchTorrents, SIGNAL(clicked()), this, SLOT(searchFile()));
+ QLabel *searchL = new QLabel(tr("&Search"));
+ searchL->setBuddy(mSearchTorrents);
+
+ QGridLayout *buttonL = new QGridLayout;
+ buttonL->addWidget(new QLabel(tr("Directory")), 0, 0);
+ buttonL->addWidget(mDir, 0, 1);
+ buttonL->addWidget(mSelDir, 0, 2);
+ buttonL->addWidget(searchL, 1, 0);
+ buttonL->addWidget(mSearchTorrents, 1, 1);
+ buttonL->addWidget(mDoSearchTorrents, 1, 2);
+
+ mFileView = new QTreeView;
+ mFileView->setSortingEnabled(true);
+ 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();
+
+ mToolBar = new QToolBar;
+ mToolBar->setIconSize(QSize(16, 16));
+ mMenuBar = new QMenuBar;
+
+ QVBoxLayout *mainLayout = new QVBoxLayout;
+ mainLayout->addWidget(mMenuBar);
+ mainLayout->addWidget(mToolBar);
+ mainLayout->addLayout(buttonL);
+ mainLayout->addWidget(fileL);
+ mainLayout->addWidget(mFileView);
+ setLayout(mainLayout);
+
+ mTorrentDisplay = new TorrentDisplay(this);
+ connect(mFileView->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), this, SLOT(fileSelectionChanged(QItemSelection,QItemSelection)));
+ connect(mFileView, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(torrentInfo()));
+}
+
+void TorrentWidget::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, 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());
+ i2->setEditable(false);
+ QStandardItem *i3 = new QStandardItem(fi.created().toString(Qt::RFC2822Date));
+ i3->setEditable(false);
+ 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);
+ }
+ i1->setEditable(false);
+ i2->setData(fi.absoluteFilePath());
+ root->appendRow(QList<QStandardItem*>() << i1 << i2 << i3);
+ }
+ readHeaderData();
+}
+
+void TorrentWidget::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()));
+ emit statusMessage(msg);
+ gatherData();
+ }
+}
+
+void TorrentWidget::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()));
+ emit statusMessage(msg);
+ gatherData();
+ }
+}
+
+void TorrentWidget::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<QVariant> tData = p.parse();
+ tData.removeAll(QVariant());
+ tData.removeAll(0);
+ mTorrentDisplay->setData(tData, sel.first().data().toString());
+ mTorrentDisplay->show();
+ return;
+}
+
+void TorrentWidget::searchFile(){
+ mFileView->selectionModel()->clear();
+ int count = mProxy->rowCount();
+ QRegularExpression regex(mSearchTorrents->text(), QRegularExpression::CaseInsensitiveOption);
+ int success = 0;
+ for(int i = 0; i < count; ++i){
+ QModelIndex cur = mProxy->index(i, 1);
+ QString fn = cur.data(Qt::UserRole + 1).toString();
+ TorrentParser p(fn);
+ emit statusMessage(QString(tr("parsing %1").arg(fn)));
+ QList<QVariant> torrentData = p.parse();
+ QStringList files = p.files(torrentData);
+ foreach(QString f, files){
+ QRegularExpressionMatch m = regex.match(f);
+ if(m.hasMatch()){
+ ++success;
+ mFileView->selectionModel()->select(cur, QItemSelectionModel::Select | QItemSelectionModel::Rows);
+ if(success == 1){
+ mFileView->scrollTo(cur);
+ }
+ }
+ }
+ }
+ emit statusMessage(QString(tr("Found %1 file(s)").arg(QString::number(success))));
+}
+
+void TorrentWidget::contextMenuEvent(QContextMenuEvent *e){
+ QMenu contextMenu(this);
+ contextMenu.addActions(actions());
+ contextMenu.exec(e->globalPos());
+}
+
+void TorrentWidget::selectDir(){
+ QString dir = QFileDialog::getExistingDirectory(this, tr("Select directory"), QDir::homePath());
+ mDir->setText(QDir::toNativeSeparators(dir));
+ gatherData();
+}
+
+void TorrentWidget::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));
+ emit selectionCountChanged(msg);
+}
+
+void TorrentWidget::readSettings(){
+ QSettings s;
+ QString dir = s.value("searchdir", QDir::toNativeSeparators(QDir::homePath())).toString();
+ mDir->setText(dir);
+}
+
+void TorrentWidget::writeSettings(){
+ QSettings s;
+ s.setValue("searchdir", mDir->text());
+}
+
+void TorrentWidget::readHeaderData(){
+ QSettings s;
+ QByteArray headers = s.value("fileheaders").toByteArray();
+ if(!headers.isEmpty()){
+ mFileView->header()->restoreState(headers);
+ }
+}
+
+void TorrentWidget::writeHeaderData(){
+ QSettings s;
+ s.setValue("fileheaders", mFileView->header()->saveState());
+}