summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArno <arno@disconnect.de>2018-11-24 07:54:01 +0100
committerArno <arno@disconnect.de>2018-11-24 07:54:01 +0100
commit838f8d1760b8c7f72680ab0c57fd813c29940b86 (patch)
treece656bc192a08d8f1b2b622a5096fec879e6fbcd
parent935dae7c9de9e5d2df49f406f2acdc109df8e51f (diff)
downloadSheMov-838f8d1760b8c7f72680ab0c57fd813c29940b86.tar.gz
SheMov-838f8d1760b8c7f72680ab0c57fd813c29940b86.tar.bz2
SheMov-838f8d1760b8c7f72680ab0c57fd813c29940b86.zip
Resurrect search dialog
Add it to the global menu and make it accessible by CTRL+f when the focus is on the main window.
-rw-r--r--searchdialog.cpp156
-rw-r--r--searchdialog.h11
-rw-r--r--shemov.cpp11
3 files changed, 80 insertions, 98 deletions
diff --git a/searchdialog.cpp b/searchdialog.cpp
index 1652d61..642f02f 100644
--- a/searchdialog.cpp
+++ b/searchdialog.cpp
@@ -15,70 +15,56 @@
#include <QSortFilterProxyModel>
#include <QSqlDatabase>
#include <QSqlQuery>
+#include <QToolBar>
+#include <QApplication>
+#include <QHeaderView>
+#include <QSettings>
#include "smtreeview.h"
#include "smtreeitem.h"
#include "smtreemodel.h"
#include "searchdialog.h"
+#include "helper.h"
SearchDialog::SearchDialog(QWidget *parent, Qt::WindowFlags flags) : QDialog(parent, flags){
// Define GUI items
- setWindowTitle(tr("Search for"));
- mExFilenames = new QCheckBox(tr("Filenames"));
- mExFilenames->setChecked(true);
- mExMeta = new QCheckBox(tr("Metadata"));
- mExMeta->setChecked(true);
+ setWindowTitle(tr("Search..."));
+ QLabel *l1 = new QLabel(tr("Search"));
mSearch = new QLineEdit;
- mResult = new SmTreeView;
- mDoSearch = new QPushButton(tr("Search"));
- mClose = new QPushButton(tr("Close"));
+ connect(mSearch, &QLineEdit::returnPressed, this, &SearchDialog::search);
+ QToolBar *searchTB = new QToolBar;
+ QAction *doSearchA = new QAction(Helper::icon(Qt::transparent, qApp->palette().color(QPalette::Text), QChar(0x2245), true, false), tr("Search"), this);
+ connect(doSearchA, &QAction::triggered, this, &SearchDialog::search);
+ searchTB->addAction(doSearchA);
+ QAction *clearSearchA= new QAction(Helper::icon(Qt::transparent, qApp->palette().color(QPalette::Text), QChar(0x2694), true, false), tr("Clear"), this);
+ connect(clearSearchA, &QAction::triggered, [=] { mSearch->clear(); });
+ searchTB->addAction(clearSearchA);
+ QHBoxLayout *topLayout = new QHBoxLayout;
+ topLayout->addWidget(l1);
+ topLayout->addWidget(mSearch);
+ topLayout->addWidget(searchTB);
// init Model and View
- const QStringList headers = QStringList() << tr("Match") << tr("Series") << tr("SeriesPartId");
+ const QStringList headers = QStringList() << tr("Found") << tr("Series") << tr("SeriesPartId");
mModel = new SmTreeModel(headers, this);
mProxy = new QSortFilterProxyModel(this);
mProxy->setSourceModel(mModel);
+ mResult = new QTreeView;
mResult->setModel(mProxy);
mResult->setColumnHidden(2, true);
mResult->setSortingEnabled(true);
mResult->setEditTriggers(QAbstractItemView::NoEditTriggers);
- connect(mResult, &SmTreeView::doubleClicked, this, &SearchDialog::searchDoubleclicked);
+ QHBoxLayout *bottomLayout = new QHBoxLayout;
+ bottomLayout->addWidget(mResult);
// Layout
QVBoxLayout *mainLayout = new QVBoxLayout;
- QGroupBox *searchGb = new QGroupBox(tr("Search for:"));
- QVBoxLayout *searchGbL = new QVBoxLayout;
- searchGbL->addWidget(mSearch);
- searchGb->setLayout(searchGbL);
- mainLayout->addWidget(searchGb);
- QGroupBox *excludeGb = new QGroupBox(tr("Include:"));
- QHBoxLayout *excludeGbL = new QHBoxLayout;
- excludeGbL->addWidget(mExFilenames);
- excludeGbL->addStretch();
- excludeGbL->addWidget(mExMeta);
- excludeGb->setLayout(excludeGbL);
- mainLayout->addWidget(excludeGb);
- QGroupBox *resultGb = new QGroupBox(tr("Search result:"));
- QHBoxLayout *resultGbL = new QHBoxLayout;
- resultGbL->addWidget(mResult);
- resultGb->setLayout(resultGbL);
- mainLayout->addWidget(resultGb);
- QHBoxLayout *buttonLayout = new QHBoxLayout;
- mDoSearch = new QPushButton(tr("Search"));
- mClose = new QPushButton(tr("Close"));
- buttonLayout->addStretch();
- buttonLayout->addWidget(mDoSearch);
- buttonLayout->addWidget(mClose);
- mainLayout->addLayout(buttonLayout);
+ mainLayout->addLayout(topLayout);
+ mainLayout->addLayout(bottomLayout);
setLayout(mainLayout);
- setMinimumWidth(800);
-
- // connect the dots...
- connect(mClose, &QPushButton::clicked, this, &SearchDialog::hide);
- connect(mDoSearch, &QPushButton::clicked, this, &SearchDialog::search);
- connect(mExFilenames, &QPushButton::clicked, this, &SearchDialog::disableSearch);
- connect(mExMeta, &QPushButton::clicked, this, &SearchDialog::disableSearch);
-
+ setMinimumSize(QSize(1024, 600));
+ connect(this, &SearchDialog::rejected, this, &SearchDialog::writeSettings);
+ readSettings();
}
void SearchDialog::show(){
@@ -93,51 +79,54 @@ void SearchDialog::search(){
}
QSqlDatabase db = QSqlDatabase::database("treedb");
SmTreeItem *root = new SmTreeItem(3, nullptr);
- if(mExMeta->isChecked()){
- QSqlQuery metadataQ(db);
- metadataQ.prepare("SELECT iseriespart_id, tsubject, series.tseries_name, seriesparts.tsubtitle FROM metadata, seriesparts, series WHERE tsubject ~* :re AND metadata.iseriespart_id = seriesparts.iseriesparts_id AND seriesparts.iseries_id = series.iseries_id");
- metadataQ.bindValue(":re", mSearch->text());
- SmTreeItem *metadataItem = new SmTreeItem(QVariantList() << tr("Metadata") << QVariant() << QVariant(), root);
- root->appendChild(metadataItem);
- int ctr = 0;
- metadataQ.exec();
- while(metadataQ.next()){
- ++ctr;
- appendChild(metadataQ.value(0), metadataQ.value(1), metadataQ.value(2), metadataQ.value(3), metadataItem);
- }
- if(ctr == 0){
- appendEmpty(metadataItem);
- }
+
+ //search metadata
+ QSqlQuery metadataQ(db);
+ metadataQ.prepare("SELECT iseriespart_id, tsubject, series.tseries_name, seriesparts.tsubtitle FROM metadata, seriesparts, series WHERE tsubject ~* :re AND metadata.iseriespart_id = seriesparts.iseriesparts_id AND seriesparts.iseries_id = series.iseries_id");
+ metadataQ.bindValue(":re", mSearch->text());
+ SmTreeItem *metadataItem = new SmTreeItem(QVariantList() << tr("Metadata") << QVariant() << QVariant(), root);
+ root->appendChild(metadataItem);
+ int ctr = 0;
+ metadataQ.exec();
+ while(metadataQ.next()){
+ ++ctr;
+ appendChild(metadataQ.value(0), metadataQ.value(1), metadataQ.value(2), metadataQ.value(3), metadataItem);
+ }
+ if(ctr == 0){
+ appendEmpty(metadataItem);
}
- if(mExFilenames->isChecked()){
- QSqlQuery filenameQ(db);
- filenameQ.prepare("SELECT tfilename, iseriespart_id, series.tseries_name, seriesparts.tsubtitle FROM files, seriesparts, series WHERE tfilename ~* :re AND files.iseriespart_id = seriesparts.iseriesparts_id AND seriesparts.iseries_id = series.iseries_id");
- filenameQ.bindValue(":re", mSearch->text());
- SmTreeItem *filenameItem = new SmTreeItem(QVariantList() << tr("Filenames") << QVariant() << QVariant(), root);
- root->appendChild(filenameItem);
- int ctr = 0;
- filenameQ.exec();
- while(filenameQ.next()){
- ++ctr;
- appendChild(filenameQ.value(1), filenameQ.value(0), filenameQ.value(2), filenameQ.value(3), filenameItem);
- }
- if(ctr == 0){
- appendEmpty(filenameItem);
- }
+ //search filenames
+ QSqlQuery filenameQ(db);
+ filenameQ.prepare("SELECT tfilename, iseriespart_id, series.tseries_name, seriesparts.tsubtitle FROM files, seriesparts, series WHERE tfilename ~* :re AND files.iseriespart_id = seriesparts.iseriesparts_id AND seriesparts.iseries_id = series.iseries_id");
+ filenameQ.bindValue(":re", mSearch->text());
+ SmTreeItem *filenameItem = new SmTreeItem(QVariantList() << tr("Filenames") << QVariant() << QVariant(), root);
+ root->appendChild(filenameItem);
+ ctr = 0;
+ filenameQ.exec();
+ while(filenameQ.next()){
+ ++ctr;
+ appendChild(filenameQ.value(1), filenameQ.value(0), filenameQ.value(2), filenameQ.value(3), filenameItem);
+ }
+ if(ctr == 0){
+ appendEmpty(filenameItem);
}
mModel->setRoot(root);
mResult->expandAll();
}
-void SearchDialog::disableSearch(){
- bool exFnChecked = mExFilenames->isChecked();
- bool exMetaChecked = mExMeta->isChecked();
- if(!exFnChecked && !exMetaChecked){
- mDoSearch->setEnabled(false);
- }else{
- mDoSearch->setEnabled(true);
- }
+void SearchDialog::writeSettings(){
+ QHeaderView *h = mResult->header();
+ QSettings s;
+ s.setValue("searchdlgheaders", h->saveState());
+ s.setValue("searchdlgpos", pos());
+}
+
+void SearchDialog::readSettings(){
+ QSettings s;
+ QByteArray headerState = s.value("searchdlgheaders").toByteArray();
+ mResult->header()->restoreState(headerState);
+ move(s.value("searchdlgpos").toPoint());
}
void SearchDialog::appendChild(QVariant id, QVariant subject, QVariant name, QVariant sub, SmTreeItem *parent){
@@ -156,10 +145,3 @@ void SearchDialog::appendEmpty(SmTreeItem *parent){
SmTreeItem *emptyItem = new SmTreeItem(QVariantList() << tr("no match!") << QVariant() << QVariant(), parent);
parent->appendChild(emptyItem);
}
-
-void SearchDialog::searchDoubleclicked(){
- QPersistentModelIndex pIdx = mResult->currentIndex();
- QModelIndex idx = mProxy->mapToSource(pIdx);
- SmTreeItem *curItem = static_cast<SmTreeItem*>(idx.internalPointer());
- emit searchResultClicked(curItem->data(2).toInt());
-}
diff --git a/searchdialog.h b/searchdialog.h
index b5106fb..c2f8047 100644
--- a/searchdialog.h
+++ b/searchdialog.h
@@ -16,6 +16,7 @@ class QPushButton;
class SmTreeView;
class SmTreeModel;
class SmTreeItem;
+class QTreeView;
class QSortFilterProxyModel;
class SearchDialog : public QDialog {
@@ -31,20 +32,16 @@ class SearchDialog : public QDialog {
private slots:
void search();
- void disableSearch();
- void searchDoubleclicked();
+ void writeSettings();
+ void readSettings();
private:
void appendChild(QVariant id, QVariant subject, QVariant name, QVariant sub, SmTreeItem *parent);
void appendEmpty(SmTreeItem *parent);
QLineEdit *mSearch;
- QCheckBox *mExFilenames;
- QCheckBox *mExMeta;
- SmTreeView *mResult;
+ QTreeView *mResult;
SmTreeModel *mModel;
QSortFilterProxyModel *mProxy;
- QPushButton *mDoSearch;
- QPushButton *mClose;
};
#endif // SEARCHDIALOG_H
diff --git a/shemov.cpp b/shemov.cpp
index 65a88b5..75d7f48 100644
--- a/shemov.cpp
+++ b/shemov.cpp
@@ -49,7 +49,9 @@ SheMov::SheMov(QWidget *parent, Qt::WindowFlags flags) : QMainWindow(parent, fla
//init database as early as possible
splash.showMessage(tr("Initializing globals..."), Qt::AlignHCenter, Qt::yellow);
qApp->processEvents();
- (void) SmGlobals::instance();
+ mSearchDialog = new SearchDialog(this);
+ mSearchDialog->setHidden(true);
+ (void) SmGlobals::instance();
mAnalyzeActorsA = new QAction(tr("Actors..."), this);
connect(mAnalyzeActorsA, &QAction::triggered, this, &SheMov::analyzeActors);
@@ -61,9 +63,9 @@ SheMov::SheMov(QWidget *parent, Qt::WindowFlags flags) : QMainWindow(parent, fla
connect(mAnalyzePartsA, &QAction::triggered, this, &SheMov::analyzeParts);
mConsistencyA = new QAction(tr("Check consisteny..."), this);
connect(mConsistencyA, &QAction::triggered, this, &SheMov::checkConsistency);
- /*mSearchDialogA = new QAction(tr("Search..."), this);
- mSearchDialogA->setShortcut(tr("CTRL+f"));
- connect(mSearchDialogA, &QAction::triggered, mSearchDialog, &SearchDialog::show);*/
+ QAction *searchDialogA = new QAction(tr("Search..."), this);
+ searchDialogA->setShortcut(tr("CTRL+f"));
+ connect(searchDialogA, &QAction::triggered, mSearchDialog, &SearchDialog::show);
mQuitA = new QAction(tr("Quit"), this);
mQuitA->setShortcut(tr("CTRL+q"));
connect(mQuitA, &QAction::triggered, qApp, &QApplication::closeAllWindows);
@@ -94,6 +96,7 @@ SheMov::SheMov(QWidget *parent, Qt::WindowFlags flags) : QMainWindow(parent, fla
globalMenu->addSeparator();
globalMenu->addAction(mConfigA);
globalMenu->addAction(mStatisticsA);
+ globalMenu->addAction(searchDialogA);
globalMenu->addSeparator();
globalMenu->addAction(mAboutQtA);
globalMenu->addAction(mAboutShemovA);