]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/search/dolphinfacetswidget.cpp
Merge remote-tracking branch 'origin/master' into frameworks
[dolphin.git] / src / search / dolphinfacetswidget.cpp
index 678cb6b14189c41709064f60046d0987c00cb6c3..fa46a50e8a3b442d000c4d9f9fb9592dc7c22d10 100644 (file)
 #include <QHBoxLayout>
 #include <QVBoxLayout>
 
-#ifdef HAVE_NEPOMUK
-    #include <Nepomuk/Query/AndTerm>
-    #include <Nepomuk/Query/ComparisonTerm>
-    #include <Nepomuk/Query/LiteralTerm>
-    #include <Nepomuk/Query/OrTerm>
-    #include <Nepomuk/Query/Query>
-    #include <Nepomuk/Query/ResourceTypeTerm>
-    #include <Nepomuk/Vocabulary/NFO>
-    #include <Nepomuk/Vocabulary/NIE>
-    #include <Soprano/Vocabulary/NAO>
-#endif
-
 DolphinFacetsWidget::DolphinFacetsWidget(QWidget* parent) :
     QWidget(parent),
     m_documents(0),
@@ -58,13 +46,16 @@ DolphinFacetsWidget::DolphinFacetsWidget(QWidget* parent) :
     m_fourOrMore(0),
     m_maxRating(0)
 {
-    m_documents = createCheckBox(i18nc("@option:check", "Documents"));
-    m_images    = createCheckBox(i18nc("@option:check", "Images"));
-    m_audio     = createCheckBox(i18nc("@option:check", "Audio"));
-    m_videos    = createCheckBox(i18nc("@option:check", "Videos"));
+    QButtonGroup* filetypeGroup = new QButtonGroup(this);
+    m_anyType   = createRadioButton(i18nc("@option:check", "Any"), filetypeGroup);
+    m_documents = createRadioButton(i18nc("@option:check", "Documents"), filetypeGroup);
+    m_images    = createRadioButton(i18nc("@option:check", "Images"), filetypeGroup);
+    m_audio     = createRadioButton(i18nc("@option:check", "Audio Files"), filetypeGroup);
+    m_videos    = createRadioButton(i18nc("@option:check", "Videos"), filetypeGroup);
 
     QVBoxLayout* typeLayout = new QVBoxLayout();
     typeLayout->setSpacing(0);
+    typeLayout->addWidget(m_anyType);
     typeLayout->addWidget(m_documents);
     typeLayout->addWidget(m_images);
     typeLayout->addWidget(m_audio);
@@ -95,7 +86,7 @@ DolphinFacetsWidget::DolphinFacetsWidget(QWidget* parent) :
     m_twoOrMore   = createRadioButton(i18nc("@option:option", "2 or more"), ratingGroup);
     m_threeOrMore = createRadioButton(i18nc("@option:option", "3 or more"), ratingGroup);
     m_fourOrMore  = createRadioButton(i18nc("@option:option", "4 or more"), ratingGroup);
-    m_maxRating   = createRadioButton(i18nc("@option:option", "Maximum Rating"), ratingGroup);
+    m_maxRating   = createRadioButton(i18nc("@option:option", "Highest Rating"), ratingGroup);
 
     QVBoxLayout* ratingLayout = new QVBoxLayout();
     ratingLayout->setSpacing(0);
@@ -112,6 +103,7 @@ DolphinFacetsWidget::DolphinFacetsWidget(QWidget* parent) :
     topLayout->addLayout(ratingLayout);
     topLayout->addStretch();
 
+    m_anyType->setChecked(true);
     m_anytime->setChecked(true);
     m_anyRating->setChecked(true);
 }
@@ -120,38 +112,11 @@ DolphinFacetsWidget::~DolphinFacetsWidget()
 {
 }
 
-#ifdef HAVE_NEPOMUK
-Nepomuk::Query::Term DolphinFacetsWidget::facetsTerm() const
+#ifdef HAVE_BALOO
+Baloo::Term DolphinFacetsWidget::ratingTerm() const
 {
-    Nepomuk::Query::AndTerm andTerm;
-
-    const bool hasTypeFilter = m_documents->isChecked() ||
-                               m_images->isChecked() ||
-                               m_audio->isChecked() ||
-                               m_videos->isChecked();
-    if (hasTypeFilter) {
-        Nepomuk::Query::OrTerm orTerm;
-
-        if (m_documents->isChecked()) {
-            orTerm.addSubTerm(Nepomuk::Query::ResourceTypeTerm(Nepomuk::Vocabulary::NFO::Document()));
-        }
-
-        if (m_images->isChecked()) {
-            orTerm.addSubTerm(Nepomuk::Query::ResourceTypeTerm(Nepomuk::Vocabulary::NFO::Image()));
-        }
-
-        if (m_audio->isChecked()) {
-            orTerm.addSubTerm(Nepomuk::Query::ComparisonTerm(Nepomuk::Vocabulary::NIE::mimeType(),
-                                                             Nepomuk::Query::LiteralTerm("audio")));
-        }
-
-        if (m_videos->isChecked()) {
-            orTerm.addSubTerm(Nepomuk::Query::ComparisonTerm(Nepomuk::Vocabulary::NIE::mimeType(),
-                                                             Nepomuk::Query::LiteralTerm("video")));
-        }
-
-        andTerm.addSubTerm(orTerm);
-    }
+    Baloo::Term ratingTerm;
+    Baloo::Term modifiedTerm;
 
     if (!m_anyRating->isChecked()) {
         int stars = 1; // represents m_oneOrMore
@@ -166,46 +131,171 @@ Nepomuk::Query::Term DolphinFacetsWidget::facetsTerm() const
         }
 
         const int rating = stars * 2;
-        Nepomuk::Query::ComparisonTerm term(Soprano::Vocabulary::NAO::numericRating(),
-                                            Nepomuk::Query::LiteralTerm(rating),
-                                            Nepomuk::Query::ComparisonTerm::GreaterOrEqual);
-        andTerm.addSubTerm(term);
+        ratingTerm = Baloo::Term("rating", rating, Baloo::Term::GreaterEqual);
     }
 
     if (!m_anytime->isChecked()) {
         QDate date = QDate::currentDate(); // represents m_today
         if (m_yesterday->isChecked()) {
-            date.addDays(-1);
+            date = date.addDays(-1);
         } else if (m_thisWeek->isChecked()) {
-            date.addDays(1 - date.dayOfWeek());
+            date = date.addDays(1 - date.dayOfWeek());
         } else if (m_thisMonth->isChecked()) {
-            date.addDays(1 - date.day());
+            date = date.addDays(1 - date.day());
         } else if (m_thisYear->isChecked()) {
-            date.addDays(1 - date.dayOfYear());
+            date = date.addDays(1 - date.dayOfYear());
+        }
+
+        modifiedTerm = Baloo::Term("modified", date, Baloo::Term::GreaterEqual);
+    }
+
+    if (ratingTerm.isValid() && modifiedTerm.isValid()) {
+        Baloo::Term term(Baloo::Term::And);
+        term.addSubTerm(ratingTerm);
+        term.addSubTerm(modifiedTerm);
+
+        return term;
+    } else if (modifiedTerm.isValid()) {
+        return modifiedTerm;
+    } else if (ratingTerm.isValid()) {
+        return ratingTerm;
+    }
+
+    return Baloo::Term();
+}
+
+QString DolphinFacetsWidget::facetType() const
+{
+    if (m_documents->isChecked()) {
+        return QLatin1String("Document");
+    } else if (m_images->isChecked()) {
+        return QLatin1String("Image");
+    } else if (m_audio->isChecked()) {
+        return QLatin1String("Audio");
+    } else if (m_videos->isChecked()) {
+        return QLatin1String("Video");
+    }
+
+    return QString();
+}
+
+bool DolphinFacetsWidget::isRatingTerm(const Baloo::Term& term) const
+{
+    const QList<Baloo::Term> subTerms = term.subTerms();
+    if (subTerms.isEmpty()) {
+        // If term has no sub terms, then the term itself is either a "rating" term
+        // or a "modified" term.
+        return term.property() == QLatin1String("modified") ||
+               term.property() == QLatin1String("rating");
+
+    } else if (subTerms.size() == 2) {
+        // If term has sub terms, then the sub terms are always "rating" and "modified" terms.
+
+        QStringList properties;
+        foreach (const Baloo::Term& subTerm, subTerms) {
+            properties << subTerm.property();
         }
 
-        Nepomuk::Query::ComparisonTerm term(Nepomuk::Vocabulary::NIE::lastModified(),
-                                            Nepomuk::Query::LiteralTerm(QDateTime(date)),
-                                            Nepomuk::Query::ComparisonTerm::GreaterOrEqual);
-        andTerm.addSubTerm(term);
+        return properties.contains(QLatin1String("modified")) &&
+               properties.contains(QLatin1String("rating"));
+    }
+
+    return false;
+}
+
+void DolphinFacetsWidget::setRatingTerm(const Baloo::Term& term)
+{
+    // If term has sub terms, then the sub terms are always "rating" and "modified" terms.
+    // If term has no sub terms, then the term itself is either a "rating" term or a "modified"
+    // term. To avoid code duplication we add term to subTerms list, if the list is empty.
+    QList<Baloo::Term> subTerms = term.subTerms();
+    if (subTerms.isEmpty()) {
+        subTerms << term;
     }
 
-    return andTerm;
+    foreach (const Baloo::Term& subTerm, subTerms) {
+        const QString property = subTerm.property();
+
+        if (property == QLatin1String("modified")) {
+            const QDate date = subTerm.value().toDate();
+            setTimespan(date);
+        } else if (property == QLatin1String("rating")) {
+            const int stars = subTerm.value().toInt() / 2;
+            setRating(stars);
+        }
+    }
 }
+
 #endif
 
-QCheckBox* DolphinFacetsWidget::createCheckBox(const QString& text)
+void DolphinFacetsWidget::setFacetType(const QString& type)
 {
-    QCheckBox* checkBox = new QCheckBox(text);
-    connect(checkBox, SIGNAL(clicked()), this, SIGNAL(facetChanged()));
-    return checkBox;
+    if (type == QLatin1String("Document")) {
+        m_documents->setChecked(true);
+    } else if (type == QLatin1String("Image")) {
+        m_images->setChecked(true);
+    } else if (type == QLatin1String("Audio")) {
+        m_audio->setChecked(true);
+    } else if (type == QLatin1String("Video")) {
+        m_videos->setChecked(true);
+    } else {
+        m_anyType->setChecked(true);
+    }
+}
+
+void DolphinFacetsWidget::setRating(const int stars)
+{
+    switch (stars) {
+    case 5:
+        m_maxRating->setChecked(true);
+        break;
+
+    case 4:
+        m_fourOrMore->setChecked(true);
+        break;
+
+    case 3:
+        m_threeOrMore->setChecked(true);
+        break;
+
+    case 2:
+        m_twoOrMore->setChecked(true);
+        break;
+
+    case 1:
+        m_oneOrMore->setChecked(true);
+        break;
+
+    default:
+        m_anyRating->setChecked(true);
+    }
+}
+
+void DolphinFacetsWidget::setTimespan(const QDate& date)
+{
+    const QDate currentDate = QDate::currentDate();
+    const int days = date.daysTo(currentDate);
+
+    if (days <= 0) {
+        m_today->setChecked(true);
+    } else if (days <= 1) {
+        m_yesterday->setChecked(true);
+    } else if (days <= currentDate.dayOfWeek()) {
+        m_thisWeek->setChecked(true);
+    } else if (days <= currentDate.day()) {
+        m_thisMonth->setChecked(true);
+    } else if (days <= currentDate.dayOfYear()) {
+        m_thisYear->setChecked(true);
+    } else {
+        m_anytime->setChecked(true);
+    }
 }
 
 QRadioButton* DolphinFacetsWidget::createRadioButton(const QString& text,
                                                      QButtonGroup* group)
 {
     QRadioButton* button = new QRadioButton(text);
-    connect(button, SIGNAL(clicked()), this, SIGNAL(facetChanged()));
+    connect(button, &QRadioButton::clicked, this, &DolphinFacetsWidget::facetChanged);
     group->addButton(button);
     return button;
 }