diff options
-rw-r--r-- | ShemovCleaner.pro | 6 | ||||
-rw-r--r-- | filewidget.cpp | 8 | ||||
-rw-r--r-- | filewidget.h | 2 | ||||
-rw-r--r-- | searchdialog.cpp | 144 | ||||
-rw-r--r-- | searchdialog.h | 34 | ||||
-rw-r--r-- | shemovcleaner.qrc | 1 | ||||
-rw-r--r-- | system-search.png | bin | 0 -> 1375 bytes |
7 files changed, 192 insertions, 3 deletions
diff --git a/ShemovCleaner.pro b/ShemovCleaner.pro index bffc1bd..6375e5a 100644 --- a/ShemovCleaner.pro +++ b/ShemovCleaner.pro @@ -37,7 +37,8 @@ HEADERS += actorwidget.h \ torrentwidget.h \ viewer.h \ cachedfiledata.h \ - itemselectionwidget.h + itemselectionwidget.h \ + searchdialog.h SOURCES += actorwidget.cpp \ configurationwidget.cpp \ filecopier.cpp \ @@ -56,5 +57,6 @@ SOURCES += actorwidget.cpp \ torrentwidget.cpp \ viewer.cpp \ cachedfiledata.cpp \ - itemselectionwidget.cpp + itemselectionwidget.cpp \ + searchdialog.cpp RESOURCES += shemovcleaner.qrc diff --git a/filewidget.cpp b/filewidget.cpp index 4a5556c..3979cf3 100644 --- a/filewidget.cpp +++ b/filewidget.cpp @@ -47,6 +47,7 @@ #include "globals.h" #include "viewer.h" #include "progressdialog.h" +#include "searchdialog.h" FileWidget::FileWidget(QWidget *parent) : QWidget(parent), mCopyToMenu(0) { mFileCopier = new FileCopier(this); @@ -127,6 +128,7 @@ void FileWidget::setupGui(){ mOrignDlg = new OriginDialog(this); connect(mOrignDlg, &OriginDialog::statusMessage, this, &FileWidget::statusMessage); connect(mOrignDlg, &OriginDialog::refreshNeeded, this, &FileWidget::gatherData); + mSearchDlg = new SearchDialog(nullptr, 0); mMenuBar = new QMenuBar; mToolBar = new QToolBar; mToolBar->setIconSize(QSize(16, 16)); @@ -191,6 +193,8 @@ void FileWidget::createActions(){ connect(mGuessSubjectA, &QAction::triggered, this, &FileWidget::guessSubject); QAction *searchGoogleA = new QAction(QIcon(":/web-browser.png"), tr("Search Google..."), this); connect(searchGoogleA, &QAction::triggered, this, &FileWidget::searchGoogle); + QAction *searchDlgA = new QAction(QIcon(":/system-search.png"), tr("Search dialog..."), this); + connect(searchDlgA, &QAction::triggered, mSearchDlg, &SearchDialog::show); QMenu *fileMenu = new QMenu(tr("&File")); fileMenu->addAction(mSelDirA); @@ -209,6 +213,7 @@ void FileWidget::createActions(){ editMenu->addSeparator(); editMenu->addAction(mGuessSubjectA); editMenu->addAction(searchGoogleA); + editMenu->addAction(searchDlgA); editMenu->addSeparator(); editMenu->addAction(mCopyA); editMenu->addAction(mCutA); @@ -241,10 +246,11 @@ void FileWidget::createActions(){ mToolBar->addAction(mAddAsOriginA); mToolBar->addAction(mGuessSubjectA); mToolBar->addAction(searchGoogleA); + mToolBar->addAction(searchDlgA); mToolBar->addAction(createSeparator()); mToolBar->addAction(Globals::instance()->action(Globals::ConfigAction)); - addActions(QList<QAction*>() << mGuessSubjectA << searchGoogleA << createSeparator() << mRefreshA << mSelDirA << createSeparator() << mCopyA << mCutA << mPasteA << mDeleteA << createSeparator() << mAddAsOriginA << createSeparator() << mPreviewA << createSeparator() << mPropertiesA); + addActions(QList<QAction*>() << mGuessSubjectA << searchGoogleA << searchDlgA << createSeparator() << mRefreshA << mSelDirA << createSeparator() << mCopyA << mCutA << mPasteA << mDeleteA << createSeparator() << mAddAsOriginA << createSeparator() << mPreviewA << createSeparator() << mPropertiesA); } void FileWidget::fileData(const QString &fullPath, const QString &md5){ diff --git a/filewidget.h b/filewidget.h index 0f4bc90..850cc6f 100644 --- a/filewidget.h +++ b/filewidget.h @@ -27,6 +27,7 @@ class ProgressDialog; class CachedFileData; class QStandardItem; class QComboBox; +class SearchDialog; class FileWidget : public QWidget { Q_OBJECT @@ -137,6 +138,7 @@ class FileWidget : public QWidget { QComboBox *mMimeFilters; int mFileAction; QStringList mDescript; + SearchDialog *mSearchDlg; }; #endif // FILEWIDGET_H diff --git a/searchdialog.cpp b/searchdialog.cpp new file mode 100644 index 0000000..dfefd79 --- /dev/null +++ b/searchdialog.cpp @@ -0,0 +1,144 @@ +#include <QLabel> +#include <QComboBox> +#include <QLineEdit> +#include <QPushButton> +#include <QHBoxLayout> +#include <QVBoxLayout> +#include <QGroupBox> +#include <QTreeView> +#include <QStandardItemModel> +#include <QSortFilterProxyModel> +#include <QSqlDatabase> +#include <QSqlQuery> + +#include "searchdialog.h" + +SearchDialog::SearchDialog(QWidget *parent, Qt::WindowFlags f) : QDialog(parent, f){ + //search bar + QLabel *typeL = new QLabel(tr("Search by:")); + mTypeSel = new QComboBox; + mTypeSel->addItem(tr("Title"), Title); + mTypeSel->addItem(tr("Filename"), Filename); + connect(mTypeSel, QOverload<int>::of(&QComboBox::activated), this, &SearchDialog::doSearch); + mSearch = new QLineEdit; + QPushButton *goB = new QPushButton(tr("Go!")); + connect(goB, &QPushButton::clicked, this, &SearchDialog::doSearch); + QHBoxLayout *topHBL = new QHBoxLayout; + topHBL->addWidget(typeL); + topHBL->addWidget(mTypeSel); + topHBL->addWidget(mSearch); + topHBL->addWidget(goB); + + //result view + QGroupBox *resGB = new QGroupBox(tr("Search result")); + mResM = new QStandardItemModel; + QSortFilterProxyModel *resMProxy = new QSortFilterProxyModel; + resMProxy->setSourceModel(mResM); + mResV = new QTreeView; + mResV->setModel(resMProxy); + connect(mResV->selectionModel(), &QItemSelectionModel::currentChanged, this, &SearchDialog::doResultTitle); + QHBoxLayout *resGBL = new QHBoxLayout; + resGBL->addWidget(mResV); + resGB->setLayout(resGBL); + QGroupBox *dataGB = new QGroupBox(tr("Data")); + mDataM = new QStandardItemModel; + QSortFilterProxyModel *dataMProxy = new QSortFilterProxyModel; + dataMProxy->setSourceModel(mDataM); + mDataV = new QTreeView; + mDataV->setModel(dataMProxy); + QHBoxLayout *dataGBL = new QHBoxLayout; + dataGBL->addWidget(mDataV); + dataGB->setLayout(dataGBL); + QHBoxLayout *resL = new QHBoxLayout; + resL->addWidget(resGB); + resL->addWidget(dataGB); + + //hide button + QPushButton *hideB = new QPushButton(tr("Close")); + connect(hideB, &QPushButton::clicked, this, &SearchDialog::hide); + QHBoxLayout *buttonL = new QHBoxLayout; + buttonL->addStretch(); + buttonL->addWidget(hideB); + buttonL->addStretch(); + + //main layout + QVBoxLayout *mainL = new QVBoxLayout; + mainL->addLayout(topHBL); + mainL->addLayout(resL); + mainL->addLayout(buttonL); + setLayout(mainL); + setMinimumSize(QSize(1024, 468)); +} + +void SearchDialog::doSearch(){ + int type = mTypeSel->currentData().toInt(); + if(type == Title){ + doSearchTitle(); + } +} + +void SearchDialog::doResult(const QModelIndex &cur, const QModelIndex &prev){ + Q_UNUSED(prev) + int type = mTypeSel->currentData().toInt(); + if(type == Title){ + doResultTitle(cur); + } +} + +void SearchDialog::doSearchTitle(){ + if(mSearch->text().isEmpty()){ + return; + } + mResV->setSortingEnabled(false); + mResM->clear(); + mResM->setColumnCount(1); + mResM->setHeaderData(0, Qt::Horizontal, tr("Title")); + QStandardItem *root = mResM->invisibleRootItem(); + QSqlDatabase db = QSqlDatabase::database("shemovdb"); + QSqlQuery tQ(db); + tQ.prepare("SELECT DISTINCT(iseries_id), tseries_name FROM series WHERE tseries_name ~ :title ORDER BY tseries_name"); + tQ.bindValue(":title", mSearch->text()); + tQ.exec(); + while(tQ.next()){ + QStandardItem *cur = new QStandardItem(tQ.value(1).toString()); + cur->setIcon(QIcon(":/huge_bra.png")); + cur->setData(tQ.value(0), SeriesIdRole); + cur->setEditable(false); + root->appendRow(cur); + } + mResV->setSortingEnabled(true); +} + +void SearchDialog::doResultTitle(const QModelIndex &sel){ + int seriesId = sel.data(SeriesIdRole).toInt(); + QSqlDatabase db = QSqlDatabase::database("shemovdb"); + QSqlQuery rQ(db); + QStringList items; + rQ.prepare("SELECT series.tseries_name, seriesparts.iseriespart, seriesparts.tsubtitle FROM series, seriesparts WHERE series.iseries_id = :sid AND seriesparts.iseries_id = series.iseries_id"); + rQ.bindValue(":sid", seriesId); + rQ.exec(); + while(rQ.next()){ + int sPart = rQ.value(1).toInt(); + QString sub = rQ.value(2).toString(); + QString cur; + if(sPart > 0){ + cur = QString("%1 - %2").arg(rQ.value(0).toString()).arg(sPart, 3, 10, QChar('0')); + }else{ + cur = QString("%1 - %2").arg(rQ.value(0).toString()).arg(sub); + } + items << cur; + } + std::sort(items.begin(), items.end()); + mDataV->setSortingEnabled(false); + mDataM->clear(); + mDataM->setColumnCount(1); + mDataM->setHeaderData(0, Qt::Horizontal, tr("Parts")); + QStandardItem *root = mDataM->invisibleRootItem(); + for(QString i : items){ + QStandardItem *cur = new QStandardItem(i); + cur->setIcon(QIcon(":/butt_plug.png")); + cur->setEditable(false); + root->appendRow(cur); + } + mDataV->setSortingEnabled(true); +} diff --git a/searchdialog.h b/searchdialog.h new file mode 100644 index 0000000..bfa2443 --- /dev/null +++ b/searchdialog.h @@ -0,0 +1,34 @@ +#ifndef SEARCHDIALOG_H +#define SEARCHDIALOG_H + +#include <QDialog> + +class QLineEdit; +class QComboBox; +class QTreeView; +class QStandardItemModel; + +class SearchDialog : public QDialog { + Q_OBJECT + public: + enum SearchTypes { Filename, Title }; + enum CustomRoles { SeriesIdRole = Qt::UserRole + 1}; + explicit SearchDialog(QWidget *parent, Qt::WindowFlags f = 0); + + public slots: + void doSearch(); + void doResult(const QModelIndex &cur, const QModelIndex &prev); + void doSearchTitle(); + void doResultTitle(const QModelIndex &sel); + + + private: + QLineEdit *mSearch; + QComboBox *mTypeSel; + QTreeView *mResV; + QTreeView *mDataV; + QStandardItemModel *mResM; + QStandardItemModel *mDataM; +}; + +#endif // SEARCHDIALOG_H diff --git a/shemovcleaner.qrc b/shemovcleaner.qrc index 7e2838c..c5017d8 100644 --- a/shemovcleaner.qrc +++ b/shemovcleaner.qrc @@ -22,5 +22,6 @@ <file>bizarre_amputee.png</file> <file>male_chastity_belt.png</file> <file>web-browser.png</file> + <file>system-search.png</file> </qresource> </RCC> diff --git a/system-search.png b/system-search.png Binary files differnew file mode 100644 index 0000000..6469d33 --- /dev/null +++ b/system-search.png |