]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/search/searchcriterionselector.cpp
removed unused member variable (the dependency to DolphinMainWindow has been removed...
[dolphin.git] / src / search / searchcriterionselector.cpp
index 08987153a201c2bbeb3f4f1970ead978707190cd..b620080292969a5ddfc80d5e9870a0054f53914e 100644 (file)
 
 #include "searchcriterionselector.h"
 
+#define DISABLE_NEPOMUK_LEGACY
+#include <nepomuk/comparisonterm.h>
+#include <nepomuk/literalterm.h>
+#include <nepomuk/query.h>
+
+#include "nie.h"
 #include "searchcriterionvalue.h"
 
+#include <Soprano/LiteralValue>
+#include <Soprano/Vocabulary/NAO>
+
 #include <QComboBox>
 #include <QHBoxLayout>
 #include <QList>
@@ -53,15 +62,16 @@ SearchCriterionSelector::SearchCriterionSelector(Type type, QWidget* parent) :
 
     m_removeButton = new QPushButton(this);
     m_removeButton->setIcon(KIcon("list-remove"));
+    m_removeButton->setToolTip(i18nc("@info", "Remove search option"));
     m_removeButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
     connect(m_removeButton, SIGNAL(clicked()), this, SIGNAL(removeCriterion()));
 
     m_layout = new QHBoxLayout(this);
     m_layout->setMargin(0);
+    m_layout->addWidget(m_removeButton);
     m_layout->addWidget(m_descriptionsBox);
     m_layout->addWidget(m_comparatorBox);
     m_layout->addWidget(filler);
-    m_layout->addWidget(m_removeButton);
 
     setLayout(m_layout);
 
@@ -73,71 +83,30 @@ SearchCriterionSelector::~SearchCriterionSelector()
 {
 }
 
-void SearchCriterionSelector::createDescriptions()
+Nepomuk::Query::Term SearchCriterionSelector::queryTerm() const
 {
-    Q_ASSERT(m_descriptionsBox != 0);
-    Q_ASSERT(m_comparatorBox != 0);
-
-    // TODO: maybe this creation should be forwarded to a factory if
-    // the number of items increases in future
-    QList<SearchCriterionDescription::Comparator> defaultComps;
-    defaultComps.append(SearchCriterionDescription::Comparator(i18nc("@label", "Greater Than"), ">", "+"));
-    defaultComps.append(SearchCriterionDescription::Comparator(i18nc("@label", "Greater Than or Equal to"), ">=", "+"));
-    defaultComps.append(SearchCriterionDescription::Comparator(i18nc("@label", "Less Than"), "<", "+"));
-    defaultComps.append(SearchCriterionDescription::Comparator(i18nc("@label", "Less Than or Equal to"), "<=", "+"));
-
-    // add "Date" description
-    QList<SearchCriterionDescription::Comparator> dateComps;
-    dateComps.append(SearchCriterionDescription::Comparator(i18nc("@label", "Anytime"))); // TODO
-    dateComps.append(SearchCriterionDescription::Comparator(i18nc("@label", "Today"))); // TODO
-    dateComps.append(SearchCriterionDescription::Comparator(i18nc("@label", "This week"))); // TODO
-    dateComps.append(SearchCriterionDescription::Comparator(i18nc("@label", "This month"))); // TODO
-    foreach (const SearchCriterionDescription::Comparator& comp, defaultComps) {
-        dateComps.append(comp);
+    if (m_valueWidget == 0) {
+        return Nepomuk::Query::Term();
     }
 
-    DateValue* dateValue = new DateValue(this);
-    dateValue->hide();
-    SearchCriterionDescription date(i18nc("@label", "Date"),
-                                    "sourceModified",
-                                    dateComps,
-                                    dateValue);
-
-    // add "Size" description
-    QList<SearchCriterionDescription::Comparator> sizeComps = defaultComps;
-    sizeComps.insert(0, SearchCriterionDescription::Comparator(i18nc("@label Any (file size)", "Any")));
-
-    SizeValue* sizeValue = new SizeValue(this);
-    sizeValue->hide();
-    SearchCriterionDescription size(i18nc("@label", "Size"),
-                                    "contentSize",
-                                    sizeComps,
-                                    sizeValue);
-
-    // add "Tag" description
-    QList<SearchCriterionDescription::Comparator> tagComps;
-    tagComps.append(SearchCriterionDescription::Comparator(i18nc("@label All (tags)", "All")));
-    tagComps.append(SearchCriterionDescription::Comparator(i18nc("@label", "Equal to"), "=="));
+    const int descIndex = m_descriptionsBox->currentIndex();
+    const SearchCriterionDescription& descr = m_descriptions[descIndex];
 
-    TagValue* tagValue = new TagValue(this);
-    tagValue->hide();
-    SearchCriterionDescription tag(i18nc("@label", "Tag"),
-                                   "tag",
-                                   tagComps,
-                                   tagValue);
+    const int compIndex = m_comparatorBox->currentIndex();
+    const SearchCriterionDescription::Comparator& comp = descr.comparators()[compIndex];
+    if (!comp.isActive) {
+        return Nepomuk::Query::Term();
+    }
 
-    Q_ASSERT(static_cast<int>(SearchCriterionSelector::Date) == 0);
-    Q_ASSERT(static_cast<int>(SearchCriterionSelector::Size) == 1);
-    Q_ASSERT(static_cast<int>(SearchCriterionSelector::Tag) == 2);
-    m_descriptions.append(date);
-    m_descriptions.append(size);
-    m_descriptions.append(tag);
+    const Nepomuk::Query::ComparisonTerm term(descr.identifier(),
+                                              m_valueWidget->value(),
+                                              comp.value);
+    return term;
+}
 
-    // add all descriptions to the combo box
-    const int count = m_descriptions.count();
-    for (int i = 0; i < count; ++i) {
-        m_descriptionsBox->addItem(m_descriptions[i].name(), i);
-    }
+SearchCriterionSelector::Type SearchCriterionSelector::type() const
+{
+    return static_cast<Type>(m_descriptionsBox->currentIndex());
 }
 
 void SearchCriterionSelector::slotDescriptionChanged(int index)
@@ -161,7 +130,7 @@ void SearchCriterionSelector::slotDescriptionChanged(int index)
 
     // add value widget
     m_valueWidget = description.valueWidget();
-    m_layout->insertWidget(2, m_valueWidget);
+    m_layout->insertWidget(3, m_valueWidget);
 
     m_comparatorBox->setCurrentIndex(0);
     slotComparatorChanged(0);
@@ -176,11 +145,100 @@ void SearchCriterionSelector::slotComparatorChanged(int index)
     const int descIndex = m_descriptionsBox->currentIndex();
     const SearchCriterionDescription& descr = m_descriptions[descIndex];
     const SearchCriterionDescription::Comparator& comp = descr.comparators()[index];
-    m_valueWidget->setVisible(!comp.operation.isEmpty());
 
-    // create query string
-    const QString queryString = comp.prefix + descr.identifier() + comp.operation + m_valueWidget->value();
-    emit criterionChanged(queryString);
+    m_valueWidget->initializeValue(comp.autoValueType);
+    // only show the value widget, if an operation is defined
+    // and no automatic calculation is provided
+    m_valueWidget->setVisible(comp.isActive && comp.autoValueType.isEmpty());
+
+    emit criterionChanged();
+}
+
+void SearchCriterionSelector::createDescriptions()
+{
+    Q_ASSERT(m_descriptionsBox != 0);
+    Q_ASSERT(m_comparatorBox != 0);
+
+    // TODO: maybe this creation should be forwarded to a factory if
+    // the number of items increases in future
+    QList<SearchCriterionDescription::Comparator> defaultComps;
+    defaultComps.append(SearchCriterionDescription::Comparator(i18nc("@label", "Greater Than"), Nepomuk::Query::ComparisonTerm::Greater));
+    defaultComps.append(SearchCriterionDescription::Comparator(i18nc("@label", "Greater Than or Equal to"), Nepomuk::Query::ComparisonTerm::GreaterOrEqual));
+    defaultComps.append(SearchCriterionDescription::Comparator(i18nc("@label", "Less Than"), Nepomuk::Query::ComparisonTerm::Smaller));
+    defaultComps.append(SearchCriterionDescription::Comparator(i18nc("@label", "Less Than or Equal to"), Nepomuk::Query::ComparisonTerm::SmallerOrEqual));
+
+    // add "Date" description
+    QList<SearchCriterionDescription::Comparator> dateComps;
+    dateComps.append(SearchCriterionDescription::Comparator(i18nc("@label", "Anytime")));
+    dateComps.append(SearchCriterionDescription::Comparator(i18nc("@label", "Today"), Nepomuk::Query::ComparisonTerm::GreaterOrEqual, "today"));
+    dateComps.append(SearchCriterionDescription::Comparator(i18nc("@label", "This Week"), Nepomuk::Query::ComparisonTerm::GreaterOrEqual, "thisWeek"));
+    dateComps.append(SearchCriterionDescription::Comparator(i18nc("@label", "This Month"), Nepomuk::Query::ComparisonTerm::GreaterOrEqual, "thisMonth"));
+    dateComps.append(SearchCriterionDescription::Comparator(i18nc("@label", "This Year"), Nepomuk::Query::ComparisonTerm::GreaterOrEqual, "thisYear"));
+    foreach (const SearchCriterionDescription::Comparator& comp, defaultComps) {
+        dateComps.append(comp);
+    }
+
+    DateValue* dateValue = new DateValue(this);
+    dateValue->hide();
+    SearchCriterionDescription date(i18nc("@label", "Date:"),
+                                    Nepomuk::Vocabulary::NIE::lastModified(),
+                                    dateComps,
+                                    dateValue);
+    Q_ASSERT(static_cast<int>(SearchCriterionSelector::Date) == 0);
+    m_descriptions.append(date);
+
+    // add "Size" description
+    QList<SearchCriterionDescription::Comparator> sizeComps = defaultComps;
+    sizeComps.insert(0, SearchCriterionDescription::Comparator(i18nc("@label Any (file size)", "Any")));
+
+    SizeValue* sizeValue = new SizeValue(this);
+    sizeValue->hide();
+    SearchCriterionDescription size(i18nc("@label", "Size:"),
+                                    Soprano::Vocabulary::NAO::lastModified(), // TODO
+                                    sizeComps,
+                                    sizeValue);
+    Q_ASSERT(static_cast<int>(SearchCriterionSelector::Size) == 1);
+    m_descriptions.append(size);
+
+    // add "Tag" description
+    QList<SearchCriterionDescription::Comparator> tagComps;
+    tagComps.append(SearchCriterionDescription::Comparator(i18nc("@label All (tags)", "All")));
+    tagComps.append(SearchCriterionDescription::Comparator(i18nc("@label", "Equal to"), Nepomuk::Query::ComparisonTerm::Equal));
+    // It is unclear yet how to express != for tags with the new Nepomuk query API. Disable it for KDE 4.4,
+    // but leave the translation string there to be able to enable this functionality for KDE 4.4.x:
+    const QString dummy = i18nc("@label", "Not Equal to");
+    Q_UNUSED(dummy);
+    //tagComps.append(SearchCriterionDescription::Comparator(i18nc("@label", "Not Equal to"), Nepomuk::Query::ComparisonTerm::Equal)); // TODO
+
+    TagValue* tagValue = new TagValue(this);
+    tagValue->hide();
+    SearchCriterionDescription tag(i18nc("@label", "Tag:"),
+                                   Soprano::Vocabulary::NAO::hasTag(),
+                                   tagComps,
+                                   tagValue);
+    Q_ASSERT(static_cast<int>(SearchCriterionSelector::Tag) == 2);
+    m_descriptions.append(tag);
+
+    // add "Rating" description
+    QList<SearchCriterionDescription::Comparator> ratingComps = defaultComps;
+    ratingComps.insert(0, SearchCriterionDescription::Comparator(i18nc("@label Any (rating)", "Any")));
+
+    RatingValue* ratingValue = new RatingValue(this);
+    ratingValue->hide();
+    SearchCriterionDescription rating(i18nc("@label", "Rating:"),
+                                      Soprano::Vocabulary::NAO::numericRating(),
+                                      ratingComps,
+                                      ratingValue);
+    Q_ASSERT(static_cast<int>(SearchCriterionSelector::Rating) == 3);
+    m_descriptions.append(rating);
+
+    // add all descriptions to the combo box and connect the value widgets
+    int i = 0;
+    foreach (const SearchCriterionDescription& desc, m_descriptions) {
+        m_descriptionsBox->addItem(desc.name(), i);
+        connect(desc.valueWidget(), SIGNAL(valueChanged(Nepomuk::Query::LiteralTerm)), this, SIGNAL(criterionChanged()));
+        ++i;
+    }
 }
 
 #include "searchcriterionselector.moc"