X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/233a08164f79d9909693c5de438f856467ad5b76..4ba9eb8ea34baee7e5e100a0d3c33f23f75cf708:/src/search/dolphinsearchoptionsconfigurator.cpp diff --git a/src/search/dolphinsearchoptionsconfigurator.cpp b/src/search/dolphinsearchoptionsconfigurator.cpp index 006ac7302..e51ab8c64 100644 --- a/src/search/dolphinsearchoptionsconfigurator.cpp +++ b/src/search/dolphinsearchoptionsconfigurator.cpp @@ -24,9 +24,13 @@ #define DISABLE_NEPOMUK_LEGACY #include -#include +#include +#include #include -#include +#include +#include + +#include "nfo.h" #include #include @@ -37,6 +41,7 @@ #include #include "searchcriterionselector.h" +#include "searchoptiondialogbox.h" #include #include @@ -79,12 +84,13 @@ static const CriterionItem g_criterionItems[] = { {"Date", SearchCriterionSelector::Date}, {"Size", SearchCriterionSelector::Size}, {"Tag", SearchCriterionSelector::Tag}, - {"Raging", SearchCriterionSelector::Rating} + {"Rating", SearchCriterionSelector::Rating} }; DolphinSearchOptionsConfigurator::DolphinSearchOptionsConfigurator(QWidget* parent) : QWidget(parent), m_initialized(false), + m_directory(), m_locationBox(0), m_whatBox(0), m_addSelectorButton(0), @@ -101,7 +107,7 @@ DolphinSearchOptionsConfigurator::DolphinSearchOptionsConfigurator(QWidget* pare m_locationBox = new KComboBox(this); for (unsigned int i = 0; i < sizeof(g_locationItems) / sizeof(SettingsItem); ++i) { - m_locationBox->addItem(g_locationItems[i].text); + m_locationBox->addItem(i18nc("@label", g_locationItems[i].text)); } // add "what" configuration @@ -109,8 +115,9 @@ DolphinSearchOptionsConfigurator::DolphinSearchOptionsConfigurator(QWidget* pare m_whatBox = new KComboBox(this); for (unsigned int i = 0; i < sizeof(g_whatItems) / sizeof(SettingsItem); ++i) { - m_whatBox->addItem(g_whatItems[i].text); + m_whatBox->addItem(i18nc("@label", g_whatItems[i].text)); } + connect(m_whatBox, SIGNAL(currentIndexChanged(int)), this, SLOT(updateButtons())); // add "Add selector" button m_addSelectorButton = new QPushButton(this); @@ -180,35 +187,41 @@ DolphinSearchOptionsConfigurator::~DolphinSearchOptionsConfigurator() SearchSettings::self()->writeConfig(); } -KUrl DolphinSearchOptionsConfigurator::nepomukUrl() const +QString DolphinSearchOptionsConfigurator::customSearchQuery() const { - Nepomuk::Query::Query query; - if (m_criteria.size() == 1) { - query.setTerm(m_criteria.first()->queryTerm()); - } else { - Nepomuk::Query::AndTerm andTerm; - foreach (const SearchCriterionSelector* criterion, m_criteria) { - const Nepomuk::Query::Term term = criterion->queryTerm(); - andTerm.addSubTerm(term); - } - query.setTerm(andTerm); - } + return m_customSearchQuery; +} - Nepomuk::Query::Query customQuery = Nepomuk::Query::QueryParser::parseQuery(m_customSearchQuery); - if (customQuery.isValid()) { - query.setTerm(Nepomuk::Query::AndTerm(query.term(), customQuery.term())); - } - return query.toSearchUrl(); +KUrl DolphinSearchOptionsConfigurator::directory() const +{ + return m_directory; +} + +KUrl DolphinSearchOptionsConfigurator::nepomukSearchUrl() const +{ + const Nepomuk::Query::Query query = nepomukQuery(); + if ( query.isValid() ) { + return query.toSearchUrl( i18nc( "@title UDS_DISPLAY_NAME for a KIO directory listing. %1 is the query the user entered.", + "Query Results from '%1'", + customSearchQuery() ) ); + } + else { + return KUrl(); + } } void DolphinSearchOptionsConfigurator::setCustomSearchQuery(const QString& searchQuery) { m_customSearchQuery = searchQuery.simplified(); + updateButtons(); +} - const bool enabled = hasSearchParameters(); - m_searchButton->setEnabled(enabled); - m_saveButton->setEnabled(enabled); +void DolphinSearchOptionsConfigurator::setDirectory(const KUrl& dir) +{ + if (dir.protocol() != QString::fromLatin1("nepomuksearch")) { + m_directory = dir; + } } void DolphinSearchOptionsConfigurator::showEvent(QShowEvent* event) @@ -254,13 +267,6 @@ void DolphinSearchOptionsConfigurator::slotAddSelectorButtonClicked() addCriterion(selector); } -void DolphinSearchOptionsConfigurator::slotCriterionChanged() -{ - const bool enabled = hasSearchParameters(); - m_searchButton->setEnabled(enabled); - m_saveButton->setEnabled(enabled); -} - void DolphinSearchOptionsConfigurator::removeCriterion() { SearchCriterionSelector* criterion = qobject_cast(sender()); @@ -272,69 +278,100 @@ void DolphinSearchOptionsConfigurator::removeCriterion() criterion->deleteLater(); - updateSelectorButton(); -} - -void DolphinSearchOptionsConfigurator::updateSelectorButton() -{ - const int selectors = m_vBoxLayout->count() - 1; - m_addSelectorButton->setEnabled(selectors < 10); + updateButtons(); } void DolphinSearchOptionsConfigurator::saveQuery() { - // TODO: provide a custom dialog class for KDE 4.5, which - // enables/disables the OK button depend on whether a text - // has been entered. - QPointer dialog = new KDialog(0, Qt::Dialog); - - QWidget* container = new QWidget(dialog); - - QLabel* label = new QLabel(i18nc("@label", "Name:"), container); - KLineEdit* lineEdit = new KLineEdit(container); - lineEdit->setMinimumWidth(250); - - QHBoxLayout* layout = new QHBoxLayout(container); - layout->addWidget(label, Qt::AlignRight); - layout->addWidget(lineEdit); - - dialog->setMainWidget(container); - dialog->setCaption(i18nc("@title:window", "Save Search Options")); - dialog->setButtons(KDialog::Ok | KDialog::Cancel); - dialog->setDefaultButton(KDialog::Ok); - dialog->setButtonText(KDialog::Ok, i18nc("@action:button", "Save")); - - KConfigGroup dialogConfig(KSharedConfig::openConfig("dolphinrc"), - "SaveSearchOptionsDialog"); - dialog->restoreDialogSize(dialogConfig); - if ((dialog->exec() == QDialog::Accepted) && !lineEdit->text().isEmpty()) { + QPointer dialog = new SearchOptionDialogBox( 0 ); + + if (dialog->exec() == QDialog::Accepted) { KFilePlacesModel* model = DolphinSettings::instance().placesModel(); - model->addPlace(lineEdit->text(), nepomukUrl()); + model->addPlace(dialog->text(), nepomukSearchUrl()); } delete dialog; } +void DolphinSearchOptionsConfigurator::updateButtons() +{ + const bool enable = nepomukQuery().isValid(); + m_searchButton->setEnabled(enable); + m_saveButton->setEnabled(enable); + + const int selectors = m_vBoxLayout->count() - 1; + m_addSelectorButton->setEnabled(selectors < 10); +} + void DolphinSearchOptionsConfigurator::addCriterion(SearchCriterionSelector* criterion) { connect(criterion, SIGNAL(removeCriterion()), this, SLOT(removeCriterion())); - connect(criterion, SIGNAL(criterionChanged()), this, SLOT(slotCriterionChanged())); + connect(criterion, SIGNAL(criterionChanged()), this, SLOT(updateButtons())); // insert the new selector before the KSeparator at the bottom const int index = m_vBoxLayout->count() - 1; m_vBoxLayout->insertWidget(index, criterion); - updateSelectorButton(); + updateButtons(); m_criteria.append(criterion); } -bool DolphinSearchOptionsConfigurator::hasSearchParameters() const +Nepomuk::Query::Query DolphinSearchOptionsConfigurator::nepomukQuery() const { - if (!m_customSearchQuery.isEmpty()) { - // performance optimization: if a custom search query is defined, - // there is no need to call the (quite expensive) method nepomukUrl() - return true; + Nepomuk::Query::AndTerm andTerm; + + // add search criterion terms + foreach (const SearchCriterionSelector* criterion, m_criteria) { + const Nepomuk::Query::Term term = criterion->queryTerm(); + andTerm.addSubTerm(term); + } + + bool addCustomQuery = true; + + // filter result by the "What" filter + switch (m_whatBox->currentIndex()) { + case 1: { + // Image + const Nepomuk::Query::ResourceTypeTerm image(Nepomuk::Vocabulary::NFO::Image()); + andTerm.addSubTerm(image); + break; } - return true; //nepomukUrl().path() != QLatin1String("/"); + case 2: { + // Text + const Nepomuk::Query::ResourceTypeTerm textDocument(Nepomuk::Vocabulary::NFO::TextDocument()); + andTerm.addSubTerm(textDocument); + break; + } + case 3: { + // Filenames + // trueg: Restriction to filename differs a bit from restriction to a type of file since it does not add a condition + // on the query but influences the text edited in the search bar directly. + // This is a bit tricky as we need to use the search bar text as plain text value for filename searches + // We do it the ugly way assuming the user only entered a literal value. + Nepomuk::Query::ComparisonTerm filenameTerm(Nepomuk::Vocabulary::NFO::fileName(), Nepomuk::Query::LiteralTerm(m_customSearchQuery)); + andTerm.addSubTerm(filenameTerm); + addCustomQuery = false; + } + default: break; + } + + if (addCustomQuery) { + // add custom query term from the searchbar + const Nepomuk::Query::Query customQuery = Nepomuk::Query::QueryParser::parseQuery(m_customSearchQuery); + if (customQuery.isValid()) { + andTerm.addSubTerm(customQuery.term()); + } + } + + Nepomuk::Query::FileQuery fileQuery; + fileQuery.setFileMode( Nepomuk::Query::FileQuery::QueryFiles ); + fileQuery.setTerm(andTerm); + + if ((m_locationBox->currentIndex() == 1) && m_directory.isValid()) { + // "From Here" is selected as location filter + fileQuery.addIncludeFolder(m_directory); + } + + return fileQuery; } #include "dolphinsearchoptionsconfigurator.moc"