From 96c798d4e9ca91cade25aa6d38176714979685bc Mon Sep 17 00:00:00 2001 From: Arno Date: Sat, 20 Aug 2016 17:04:58 +0200 Subject: 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! --- ShemovCleaner.pro | 11 +- main.cpp | 3 +- refresh.png | Bin 0 -> 2182 bytes shemovcleaner.cpp | 324 ++++++++++++------------------------------------------ shemovcleaner.h | 53 +++------ shemovcleaner.qrc | 1 + torrentwidget.cpp | 269 +++++++++++++++++++++++++++++++++++++++++++++ torrentwidget.h | 64 +++++++++++ 8 files changed, 431 insertions(+), 294 deletions(-) create mode 100644 refresh.png create mode 100644 torrentwidget.cpp create mode 100644 torrentwidget.h diff --git a/ShemovCleaner.pro b/ShemovCleaner.pro index 57893bb..4efb591 100644 --- a/ShemovCleaner.pro +++ b/ShemovCleaner.pro @@ -15,15 +15,18 @@ TEMPLATE = app SOURCES += main.cpp\ - shemovcleaner.cpp \ filesorter.cpp \ torrentparser.cpp \ - torrentdisplay.cpp + torrentdisplay.cpp \ + torrentwidget.cpp \ + shemovcleaner.cpp -HEADERS += shemovcleaner.h \ +HEADERS += \ filesorter.h \ torrentparser.h \ - torrentdisplay.h + torrentdisplay.h \ + torrentwidget.h \ + shemovcleaner.h DISTFILES += diff --git a/main.cpp b/main.cpp index 685fd82..005af7f 100644 --- a/main.cpp +++ b/main.cpp @@ -1,6 +1,7 @@ -#include "shemovcleaner.h" #include +#include "shemovcleaner.h" + int main(int argc, char *argv[]){ QApplication a(argc, argv); QCoreApplication::setOrganizationName("Sissie's, Inc."); diff --git a/refresh.png b/refresh.png new file mode 100644 index 0000000..afa2a9d Binary files /dev/null and b/refresh.png differ diff --git a/shemovcleaner.cpp b/shemovcleaner.cpp index b33f526..fb9b9e6 100644 --- a/shemovcleaner.cpp +++ b/shemovcleaner.cpp @@ -1,112 +1,40 @@ -#include -#include -#include -#include -#include -#include -#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), 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!")); - } +#include "torrentwidget.h" - setupGui(); - gatherData(); -} - -ShemovCleaner::~ShemovCleaner(){ - writeHeaderData(); - writeSettings(); -} - -void ShemovCleaner::setupGui(){ +ShemovCleaner::ShemovCleaner(QWidget *parent, Qt::WindowFlags f) : QMainWindow(parent, f) { + //general setup qApp->setWindowIcon(QIcon(":/clean_tampon.png")); - 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())); - - QGridLayout *buttonL = new QGridLayout; - buttonL->addWidget(new QLabel(tr("Directory")), 0, 0); - buttonL->addWidget(mDir, 0, 1); - buttonL->addWidget(mSelDir, 0, 2); - buttonL->addWidget(new QLabel(tr("Search file")), 1, 0); - buttonL->addWidget(mSearchTorrents, 1, 1); - buttonL->addWidget(mDoSearchTorrents, 1, 2); - - 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); + mTorrentTab = new TorrentWidget; + mTab = new QTabWidget; + mTab->addTab(mTorrentTab, tr("Torrents")); + setCentralWidget(mTab); + + createStatusBar(); + createActions(); + connect(mTorrentTab, SIGNAL(statusMessage(QString)), this, SLOT(statusBarMessage(QString))); + connect(mTorrentTab, SIGNAL(selectionCountChanged(QString)), this, SLOT(setSelectionCount(QString))); +} - createStatusbar(); - mTorrentDisplay = new TorrentDisplay(this); - connect(mFileView->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), this, SLOT(fileSelectionChanged(QItemSelection,QItemSelection))); +void ShemovCleaner::statusBarMessage(const QString &msg){ + statusBar()->showMessage(msg); } -void ShemovCleaner::createStatusbar(){ +void ShemovCleaner::setSelectionCount(const QString &msg){ + mSelected->setText(msg); +} + +void ShemovCleaner::createStatusBar(){ QLabel *l1 = new QLabel(tr("Sel.")); mSelected = new QLabel("000/000"); mSelected->setFrameStyle(QFrame::Panel | QFrame::Sunken); @@ -114,162 +42,52 @@ void ShemovCleaner::createStatusbar(){ 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, 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, sel.first().data().toString()); - mTorrentDisplay->show(); - return; -} - -void ShemovCleaner::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); - statusBar()->showMessage(QString(tr("parsing %1").arg(fn))); - QList 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); - } - } - } - statusBar()->showMessage(QString(tr("Found %1 file(s)").arg(QString::number(success)))); -} - -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); -} - -void ShemovCleaner::writeSettings(){ - QSettings s; - s.setValue("searchdir", mDir->text()); -} - -void ShemovCleaner::readHeaderData(){ - QSettings s; - QByteArray headers = s.value("fileheaders").toByteArray(); - if(!headers.isEmpty()){ - mFileView->header()->restoreState(headers); - } +void ShemovCleaner::createActions(){ + //Application + QAction *quitA = new QAction(tr("Quit"), this); + connect(quitA, SIGNAL(triggered()), qApp, SLOT(closeAllWindows())); + //TorrentWidget + mTorRefreshA = new QAction(QIcon(":/refresh.png"), tr("Refresh"), this); + connect(mTorRefreshA, SIGNAL(triggered()), mTorrentTab, SLOT(gatherData())); + mTorDeleteA = new QAction(QIcon(":/delete.png"), tr("Delete..."), this); + connect(mTorDeleteA, SIGNAL(triggered()), mTorrentTab, SLOT(deleteFiles())); + mTorMoveA = new QAction(QIcon(":/diaper.png"), tr("Move..."), this); + connect(mTorMoveA, SIGNAL(triggered()), mTorrentTab, SLOT(moveFiles())); + mTorInfoA = new QAction(QIcon(":/huge_bra.png"), tr("Torrent info..."), this); + connect(mTorInfoA, SIGNAL(triggered()), mTorrentTab, SLOT(torrentInfo())); + mTorDirA = new QAction(QIcon(":/folder.png"), tr("Select folder..."), this); + connect(mTorDirA, SIGNAL(triggered()), mTorrentTab, SLOT(selectDir())); + mTorrentTab->toolBar()->addAction(mTorRefreshA); + mTorrentTab->toolBar()->addSeparator(); + mTorrentTab->toolBar()->addAction(mTorDirA); + mTorrentTab->toolBar()->addAction(mTorMoveA); + mTorrentTab->toolBar()->addAction(mTorDeleteA); + mTorrentTab->toolBar()->addSeparator(); + mTorrentTab->toolBar()->addAction(mTorInfoA); + QMenu *torFileM = new QMenu(tr("File")); + torFileM->addAction(mTorDirA); + torFileM->addAction(mTorRefreshA); + torFileM->addSeparator(); + torFileM->addAction(quitA); + mTorrentTab->menuBar()->addMenu(torFileM); + QMenu *torEditM = new QMenu(tr("Edit")); + torEditM->addAction(mTorDeleteA); + torEditM->addAction(mTorMoveA); + torEditM->addSeparator(); + torEditM->addAction(mTorInfoA); + mTorrentTab->menuBar()->addMenu(torEditM); + mTorrentTab->addAction(mTorInfoA); + mTorrentTab->addAction(createSeparator()); + mTorrentTab->addAction(mTorRefreshA); + mTorrentTab->addAction(createSeparator()); + mTorrentTab->addAction(mTorMoveA); + mTorrentTab->addAction(mTorDeleteA); + mTorrentTab->addAction(createSeparator()); + mTorrentTab->addAction(mTorDirA); } -void ShemovCleaner::writeHeaderData(){ - QSettings s; - s.setValue("fileheaders", mFileView->header()->saveState()); +QAction *ShemovCleaner::createSeparator(){ + QAction *retval = new QAction(this); + retval->setSeparator(true); + return retval; } diff --git a/shemovcleaner.h b/shemovcleaner.h index 80ccddb..93b1581 100644 --- a/shemovcleaner.h +++ b/shemovcleaner.h @@ -2,52 +2,33 @@ #define SHEMOVCLEANER_H #include -#include -#include -class QPushButton; -class QLineEdit; -class QTreeView; -class QStandardItemModel; +class QTabWidget; +class TorrentWidget; class QLabel; -class FileSorter; -class TorrentDisplay; +class QAction; class ShemovCleaner : public QMainWindow { Q_OBJECT public: - ShemovCleaner(QWidget *parent = 0); - ~ShemovCleaner(); + ShemovCleaner(QWidget *parent = 0, Qt::WindowFlags f = 0); - private slots: - void selectDir(); - void fileSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected); - void gatherData(); - void deleteFiles(); - void moveFiles(); - void torrentInfo(); - void searchFile(); + public slots: + void statusBarMessage(const QString &msg); + void setSelectionCount(const QString &msg); private: - void setupGui(); - void createStatusbar(); - void readHeaderData(); - void writeHeaderData(); - void readSettings(); - void writeSettings(); - QLineEdit *mDir; - QPushButton *mSelDir; - QLineEdit *mSearchTorrents; - QPushButton *mDoSearchTorrents; - QPushButton *mMove; - QPushButton *mDelete; - QPushButton *mInfo; - QString mExt; + void createStatusBar(); + void createActions(); + QAction *createSeparator(); QLabel *mSelected; - QStandardItemModel *mModel; - FileSorter *mProxy; - QTreeView *mFileView; - TorrentDisplay *mTorrentDisplay; + QTabWidget *mTab; + TorrentWidget *mTorrentTab; + QAction *mTorRefreshA; + QAction *mTorDeleteA; + QAction *mTorMoveA; + QAction *mTorInfoA; + QAction *mTorDirA; }; #endif // SHEMOVCLEANER_H diff --git a/shemovcleaner.qrc b/shemovcleaner.qrc index dc6aa2f..0916a47 100644 --- a/shemovcleaner.qrc +++ b/shemovcleaner.qrc @@ -7,5 +7,6 @@ delete.png diaper.png folder.png + refresh.png 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#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() << 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 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 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()); +} diff --git a/torrentwidget.h b/torrentwidget.h new file mode 100644 index 0000000..b1f33bb --- /dev/null +++ b/torrentwidget.h @@ -0,0 +1,64 @@ +#ifndef TORRENTWIDGET_H +#define TORRENTWIDGET_H + +#include +#include +#include +#include + +class QPushButton; +class QLineEdit; +class QTreeView; +class QStandardItemModel; +class QLabel; +class QToolBar; +class QMenuBar; +class FileSorter; +class TorrentDisplay; + +class TorrentWidget : public QWidget { + Q_OBJECT + public: + TorrentWidget(QWidget *parent = 0); + QToolBar *toolBar() { return mToolBar; } + QMenuBar *menuBar() { return mMenuBar; } + ~TorrentWidget(); + + signals: + void statusMessage(const QString &msg); + void selectionCountChanged(const QString &msg); + + public slots: + void selectDir(); + void gatherData(); + void deleteFiles(); + void moveFiles(); + void torrentInfo(); + void searchFile(); + + protected: + virtual void contextMenuEvent(QContextMenuEvent *e); + + private slots: + void fileSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected); + + private: + void setupGui(); + void readHeaderData(); + void writeHeaderData(); + void readSettings(); + void writeSettings(); + QLineEdit *mDir; + QPushButton *mSelDir; + QLineEdit *mSearchTorrents; + QPushButton *mDoSearchTorrents; + QString mExt; + QStandardItemModel *mModel; + FileSorter *mProxy; + QTreeView *mFileView; + TorrentDisplay *mTorrentDisplay; + QToolBar *mToolBar; + QMenuBar *mMenuBar; +}; + +#endif // TORRENTWIDGET_H -- cgit v1.2.3-70-g09d2