diff options
author | Arno <arno@disconnect.de> | 2016-08-20 17:04:58 +0200 |
---|---|---|
committer | Arno <arno@disconnect.de> | 2016-08-20 17:04:58 +0200 |
commit | 96c798d4e9ca91cade25aa6d38176714979685bc (patch) | |
tree | 0a9293bd203e68faeb28e668fe5e8ab32ec5c1b5 /torrentwidget.cpp | |
parent | ddd1616f5c310c94214e0ba2629f174c4cf768f3 (diff) | |
download | ShemovCleaner-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.cpp | 269 |
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()); +} |