summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ShemovCleaner.pro6
-rw-r--r--filewidget.cpp8
-rw-r--r--filewidget.h2
-rw-r--r--searchdialog.cpp144
-rw-r--r--searchdialog.h34
-rw-r--r--shemovcleaner.qrc1
-rw-r--r--system-search.pngbin0 -> 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
new file mode 100644
index 0000000..6469d33
--- /dev/null
+++ b/system-search.png
Binary files differ