#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "searchwidget.h" #include "globals.h" #include "helper.h" SearchWidget::SearchWidget(QWidget *parent) : QWidget(parent) { setupGui(); } SearchWidget::~SearchWidget(){ writeSettings(); } void SearchWidget::setupGui(){ mSearch = new QLineEdit; connect(mSearch, SIGNAL(returnPressed()), this, SLOT(search())); QLabel *searchL = new QLabel(tr("&Search")); searchL->setBuddy(mSearch); QPushButton *doSearch = new QPushButton(tr("Go!")); connect(doSearch, SIGNAL(clicked()), this, SLOT(search())); QHBoxLayout *searchLayout = new QHBoxLayout; searchLayout->addWidget(searchL); searchLayout->addWidget(mSearch); searchLayout->addWidget(doSearch); mResultView = new QTreeView; mResultView->setSortingEnabled(false); mResultView->setSelectionBehavior(QAbstractItemView::SelectRows); mResultView->setSelectionMode(QAbstractItemView::SingleSelection); mResultModel = new QStandardItemModel; mProxy = new QSortFilterProxyModel; mProxy->setSourceModel(mResultModel); mResultView->setModel(mProxy); mMenuBar = new QMenuBar; mToolBar = new QToolBar; mToolBar->setIconSize(QSize(16, 16)); createActions(); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(mMenuBar); mainLayout->addWidget(mToolBar); mainLayout->addLayout(searchLayout); mainLayout->addWidget(mResultView); setLayout(mainLayout); } void SearchWidget::createActions(){ QMenu *fileMenu = new QMenu(tr("&File"), this); fileMenu->addAction(Globals::instance()->action(Globals::QuitAction)); QMenu *editMenu = new QMenu(tr("&Edit"), this); QAction *clearA = new QAction(QIcon(":/delete.png"), tr("Clear"), this); connect(clearA, SIGNAL(triggered()), this, SLOT(clear())); editMenu->addAction(clearA); editMenu->addSeparator(); mToolBar->addAction(clearA); mToolBar->addSeparator(); QActionGroup *searchModeAG = new QActionGroup(this); mSearchFileA = new QAction(QIcon(":/huge_bra.png"), tr("Filename"), this); mSearchFileA->setCheckable(true); searchModeAG->addAction(mSearchFileA); mSearchOriginA = new QAction(QIcon(":/higheels.png"), tr("Origin"), this); mSearchOriginA->setCheckable(true); searchModeAG->addAction(mSearchOriginA); mSearchTitleA = new QAction(QIcon(":/hourglass_figure.png"), tr("Title"), this); mSearchTitleA->setCheckable(true); searchModeAG->addAction(mSearchTitleA); mSearchSubtitleA = new QAction(QIcon(":/gaping_ass.png"), tr("Subtitle"), this); mSearchSubtitleA->setCheckable(true); searchModeAG->addAction(mSearchSubtitleA); editMenu->addActions(searchModeAG->actions()); editMenu->addSeparator(); mToolBar->addActions(searchModeAG->actions()); mToolBar->addSeparator(); connect(searchModeAG, SIGNAL(triggered(QAction*)), this, SLOT(setSearchMode(QAction*))); editMenu->addAction(Globals::instance()->action(Globals::ConfigAction)); mToolBar->addAction(Globals::instance()->action(Globals::ConfigAction)); mMenuBar->addMenu(fileMenu); mMenuBar->addMenu(editMenu); } void SearchWidget::search(){ mResultView->setSortingEnabled(false); QString fn = mSearch->text(); if(fn.isEmpty()){ return; } QSqlDatabase db = QSqlDatabase::database("shemovdb"); if(!db.isOpen()){ db.open(); } mResultModel->clear(); QStandardItem *root = mResultModel->invisibleRootItem(); mResultModel->setHorizontalHeaderLabels(QStringList() << QChar(0x26A7) << tr("Name") << tr("Size") << tr("Duration") << ""); QSqlQuery q(db); if(mSearchMode == File){ q.prepare("SELECT tfilename, bisize, iduration FROM files WHERE tfilename ~ :fn"); }else if(mSearchMode == Origin){ q.prepare("SELECT files_origin.tname, files_origin.bisize, files.iduration FROM files, files_origin WHERE files_origin.tname ~ :fn AND files_origin.ifiles_id = files.ifiles_id"); }else if(mSearchMode == Title){ q.prepare("SELECT files.tfilename, files.bisize, files.iduration FROM files, seriesparts, series WHERE series.iseries_id = seriesparts.iseries_id AND seriesparts.iseriesparts_id = files.iseriespart_id AND series.tseries_name ~ :fn"); }else if(mSearchMode == Subtitle){ q.prepare("SELECT files.tfilename, files.bisize, files.iduration FROM files, seriesparts, series WHERE series.iseries_id = seriesparts.iseries_id AND seriesparts.iseriesparts_id = files.iseriespart_id AND seriesparts.tsubtitle ~ :fn"); }else{ return; } q.bindValue(":fn", fn); q.exec(); while(q.next()){ QList data; for(int i = 0; i < NumColumns + 1; ++i){ QStandardItem *item = new QStandardItem; item->setEditable(false); data << item; if(i == SizeColumn || i == DurationColumn){ item->setFont(QFont("courier new")); item->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter); } } data[IconColumn]->setIcon(QIcon(":/diaper.png")); data[NameColumn]->setText(q.value(0).toString()); qint64 sizemb = q.value(1).toLongLong(); QLocale l; QString size = QString("%1").arg(l.toString(sizemb)); data[SizeColumn]->setText(size); Helper::Duration dur(q.value(2).toLongLong()); data[DurationColumn]->setText(dur.toString()); root->appendRow(data); } for(int i = 0; i < NumColumns; ++i){ mResultView->resizeColumnToContents(i); } mResultView->setSortingEnabled(true); } void SearchWidget::clear(){ mSearch->clear(); mResultModel->clear(); } void SearchWidget::setSearchMode(QAction *action){ if(action == mSearchFileA){ mSearchMode = File; }else if(action == mSearchOriginA){ mSearchMode = Origin; }else if(action == mSearchTitleA){ mSearchMode = Title; }else if(action == mSearchSubtitleA){ mSearchMode = Subtitle; } } QString SearchWidget::currentSearch(){ if(!mSearch->text().isEmpty()){ return mSearch->text(); } return tr("nothing!"); } void SearchWidget::readSettings(){ QSettings s; mSearchMode = s.value("search/mode").toInt(); if(mSearchMode == File){ mSearchFileA->toggle(); }else if(mSearchMode == Origin){ mSearchOriginA->toggle(); }else if(mSearchMode == Title){ mSearchTitleA->toggle(); }else if(mSearchMode == Subtitle){ mSearchSubtitleA->toggle(); } mSearch->setText(s.value("search/string").toString()); mResultView->header()->restoreState(s.value("search/header").toByteArray()); } void SearchWidget::writeSettings(){ QSettings s; s.setValue("search/mode", mSearchMode); s.setValue("search/string", mSearch->text()); s.setValue("search/header", mResultView->header()->saveState()); }