]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/search/dolphinfacetswidget.cpp
Merge branch 'Applications/19.04'
[dolphin.git] / src / search / dolphinfacetswidget.cpp
index 4fd2eb30b5c80b20ecc3c7d7b91f95d8fdcfeed9..7c0e97f86ca4f4f12a7e65fa6d0f267487094fe2 100644 (file)
 
 #include "dolphinfacetswidget.h"
 
-#include <KLocale>
+#include <KLocalizedString>
+
 #include <QButtonGroup>
 #include <QCheckBox>
 #include <QDate>
-#include <QRadioButton>
 #include <QHBoxLayout>
-#include <QVBoxLayout>
+#include <QRadioButton>
 
 DolphinFacetsWidget::DolphinFacetsWidget(QWidget* parent) :
     QWidget(parent),
-    m_documents(0),
-    m_images(0),
-    m_audio(0),
-    m_videos(0),
-    m_anytime(0),
-    m_today(0),
-    m_yesterday(0),
-    m_thisWeek(0),
-    m_thisMonth(0),
-    m_thisYear(0),
-    m_anyRating(0),
-    m_oneOrMore(0),
-    m_twoOrMore(0),
-    m_threeOrMore(0),
-    m_fourOrMore(0),
-    m_maxRating(0)
+    m_folders(nullptr),
+    m_documents(nullptr),
+    m_images(nullptr),
+    m_audio(nullptr),
+    m_videos(nullptr),
+    m_anytime(nullptr),
+    m_today(nullptr),
+    m_yesterday(nullptr),
+    m_thisWeek(nullptr),
+    m_thisMonth(nullptr),
+    m_thisYear(nullptr),
+    m_anyRating(nullptr),
+    m_oneOrMore(nullptr),
+    m_twoOrMore(nullptr),
+    m_threeOrMore(nullptr),
+    m_fourOrMore(nullptr),
+    m_maxRating(nullptr)
 {
-    m_documents = createCheckBox(i18nc("@option:check", "Documents"));
-    m_images    = createCheckBox(i18nc("@option:check", "Images"));
-    m_audio     = createCheckBox(i18nc("@option:check", "Audio Files"));
-    m_videos    = createCheckBox(i18nc("@option:check", "Videos"));
+    QButtonGroup* filetypeGroup = new QButtonGroup(this);
+    m_anyType   = createRadioButton(i18nc("@option:check", "Any"), filetypeGroup);
+    m_folders   = createRadioButton(i18nc("@option:check", "Folders"), 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_folders);
     typeLayout->addWidget(m_documents);
     typeLayout->addWidget(m_images);
     typeLayout->addWidget(m_audio);
@@ -100,6 +106,7 @@ DolphinFacetsWidget::DolphinFacetsWidget(QWidget* parent) :
     topLayout->addLayout(ratingLayout);
     topLayout->addStretch();
 
+    m_anyType->setChecked(true);
     m_anytime->setChecked(true);
     m_anyRating->setChecked(true);
 }
@@ -108,9 +115,10 @@ DolphinFacetsWidget::~DolphinFacetsWidget()
 {
 }
 
-#ifdef HAVE_BALOO
-Baloo::Term DolphinFacetsWidget::ratingTerm() const
+QString DolphinFacetsWidget::ratingTerm() const
 {
+    QStringList terms;
+
     if (!m_anyRating->isChecked()) {
         int stars = 1; // represents m_oneOrMore
         if (m_twoOrMore->isChecked()) {
@@ -124,15 +132,9 @@ Baloo::Term DolphinFacetsWidget::ratingTerm() const
         }
 
         const int rating = stars * 2;
-
-        Baloo::Term term("rating", rating, Baloo::Term::GreaterEqual);
-        return term;
+        terms << QStringLiteral("rating>=%1").arg(rating);
     }
 
-    return Baloo::Term();
-
-    /*
-    // FIXME: Handle date time filters
     if (!m_anytime->isChecked()) {
         QDate date = QDate::currentDate(); // represents m_today
         if (m_yesterday->isChecked()) {
@@ -145,44 +147,129 @@ Baloo::Term DolphinFacetsWidget::ratingTerm() const
             date = date.addDays(1 - date.dayOfYear());
         }
 
-        Nepomuk2::Query::ComparisonTerm term(Nepomuk2::Vocabulary::NIE::lastModified(),
-                                            Nepomuk2::Query::LiteralTerm(QDateTime(date)),
-                                            Nepomuk2::Query::ComparisonTerm::GreaterOrEqual);
-        andTerm.addSubTerm(term);
+        terms << QStringLiteral("modified>=%1").arg(date.toString(Qt::ISODate));
     }
-    */
+
+    return terms.join(QStringLiteral(" AND "));
 }
 
-QStringList DolphinFacetsWidget::facetTypes() const
+QString DolphinFacetsWidget::facetType() const
 {
-    QStringList types;
-    if (m_documents->isChecked()) {
-        types << "Document";
+    if (m_folders->isChecked()) {
+        return QStringLiteral("Folder");
+    } else if (m_documents->isChecked()) {
+        return QStringLiteral("Document");
+    } else if (m_images->isChecked()) {
+        return QStringLiteral("Image");
+    } else if (m_audio->isChecked()) {
+        return QStringLiteral("Audio");
+    } else if (m_videos->isChecked()) {
+        return QStringLiteral("Video");
     }
 
-    if (m_images->isChecked()) {
-        types << "Image";
-    }
+    return QString();
+}
+
+bool DolphinFacetsWidget::isRatingTerm(const QString& term) const
+{
+    const QStringList subTerms = term.split(' ', QString::SkipEmptyParts);
+
+    // If term has sub terms, then sone of the sub terms are always "rating" and "modified" terms.
+    bool containsRating = false;
+    bool containsModified = false;
 
-    if (m_audio->isChecked()) {
-        types << "Audio";
+    foreach (const QString& subTerm, subTerms) {
+        if (subTerm.startsWith(QLatin1String("rating>="))) {
+            containsRating = true;
+        } else if (subTerm.startsWith(QLatin1String("modified>="))) {
+            containsModified = true;
+        }
     }
 
-    if (m_videos->isChecked()) {
-        types << "Video";
+    return containsModified || containsRating;
+}
+
+void DolphinFacetsWidget::setRatingTerm(const QString& 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.
+    QStringList subTerms = term.split(' ', QString::SkipEmptyParts);
+
+    foreach (const QString& subTerm, subTerms) {
+        if (subTerm.startsWith(QLatin1String("modified>="))) {
+            const QString value = subTerm.mid(10);
+            const QDate date = QDate::fromString(value, Qt::ISODate);
+            setTimespan(date);
+        } else if (subTerm.startsWith(QLatin1String("rating>="))) {
+            const QString value = subTerm.mid(8);
+            const int stars = value.toInt() / 2;
+            setRating(stars);
+        }
     }
+}
 
-    return types;
+void DolphinFacetsWidget::setFacetType(const QString& type)
+{
+    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);
+    }
 }
 
-#endif
+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;
 
-QCheckBox* DolphinFacetsWidget::createCheckBox(const QString& text)
+    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)
 {
-    QCheckBox* checkBox = new QCheckBox(text);
-    connect(checkBox, &QCheckBox::clicked, this, &DolphinFacetsWidget::facetChanged);
-    return checkBox;
+    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,
@@ -194,4 +281,3 @@ QRadioButton* DolphinFacetsWidget::createRadioButton(const QString& text,
     return button;
 }
 
-#include "dolphinfacetswidget.moc"