]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/search/dolphinsearchoptionsconfigurator.cpp
Fix visual artefacts for tooltips, if compositing has been disabled. Thanks to Maciej...
[dolphin.git] / src / search / dolphinsearchoptionsconfigurator.cpp
index 006ac73028bf875883e1d3996e6035ef81c6cae6..e51ab8c64d67ea88fb93453a8b2a629d565f842e 100644 (file)
 
 #define DISABLE_NEPOMUK_LEGACY
 #include <nepomuk/andterm.h>
-#include <nepomuk/query.h>
+#include <nepomuk/filequery.h>
+#include <nepomuk/orterm.h>
 #include <nepomuk/queryparser.h>
-#include <nepomuk/term.h>
+#include <nepomuk/resourcetypeterm.h>
+#include <nepomuk/literalterm.h>
+
+#include "nfo.h"
 
 #include <kcombobox.h>
 #include <kdialog.h>
@@ -37,6 +41,7 @@
 #include <kseparator.h>
 
 #include "searchcriterionselector.h"
+#include "searchoptiondialogbox.h"
 
 #include <QButtonGroup>
 #include <QHBoxLayout>
@@ -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<SearchCriterionSelector*>(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<KDialog> 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<SearchOptionDialogBox> 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"