]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/search/dolphinfacetswidget.cpp
Merge branch 'release/20.08' into master
[dolphin.git] / src / search / dolphinfacetswidget.cpp
index c0b6c52438b8a63a17072b6c31459ff617d1d7f5..a0003f6bd759c19a752304645c08707cf47e1090 100644 (file)
@@ -1,22 +1,9 @@
-/***************************************************************************
-*    Copyright (C) 2012 by Peter Penz <peter.penz19@gmail.com>            *
-*    Copyright (C) 2019 by Ismael Asensio <isma.af@mgmail.com>            *
-*                                                                         *
-*    This program is free software; you can redistribute it and/or modify *
-*    it under the terms of the GNU General Public License as published by *
-*    the Free Software Foundation; either version 2 of the License, or    *
-*    (at your option) any later version.                                  *
-*                                                                         *
-*    This program is distributed in the hope that it will be useful,      *
-*    but WITHOUT ANY WARRANTY; without even the implied warranty of       *
-*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the        *
-*    GNU General Public License for more details.                         *
-*                                                                         *
-*    You should have received a copy of the GNU General Public License    *
-*    along with this program; if not, write to the                        *
-*    Free Software Foundation, Inc.,                                      *
-*    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA           *
-* **************************************************************************/
+/*
+ *  SPDX-FileCopyrightText: 2012 Peter Penz <peter.penz19@gmail.com>
+ *  SPDX-FileCopyrightText: 2019 Ismael Asensio <isma.af@mgmail.com>
+ *
+ *  SPDX-License-Identifier: GPL-2.0-or-later
+ */
 
 #include "dolphinfacetswidget.h"
 
@@ -86,7 +73,7 @@ DolphinFacetsWidget::DolphinFacetsWidget(QWidget* parent) :
     topLayout->addWidget(m_ratingSelector);
     topLayout->addWidget(m_tagsSelector);
 
-    resetOptions();
+    resetSearchTerms();
 }
 
 DolphinFacetsWidget::~DolphinFacetsWidget()
@@ -99,12 +86,12 @@ void DolphinFacetsWidget::changeEvent(QEvent *event)
         if (isEnabled()) {
             updateTagsSelector();
         } else {
-            resetOptions();
+            resetSearchTerms();
         }
     }
 }
 
-void DolphinFacetsWidget::resetOptions()
+void DolphinFacetsWidget::resetSearchTerms()
 {
     m_typeSelector->setCurrentIndex(0);
     m_dateSelector->setCurrentIndex(0);
@@ -115,7 +102,7 @@ void DolphinFacetsWidget::resetOptions()
     updateTagsMenu();
 }
 
-QString DolphinFacetsWidget::ratingTerm() const
+QStringList DolphinFacetsWidget::searchTerms() const
 {
     QStringList terms;
 
@@ -131,11 +118,15 @@ QString DolphinFacetsWidget::ratingTerm() const
 
     if (!m_searchTags.isEmpty()) {
         for (auto const &tag : m_searchTags) {
-            terms << QStringLiteral("tag:%1").arg(tag);
+            if (tag.contains(QLatin1Char(' '))) {
+                terms << QStringLiteral("tag:\"%1\"").arg(tag);
+            } else {
+                terms << QStringLiteral("tag:%1").arg(tag);
+            }
         }
     }
 
-    return terms.join(QLatin1String(" AND "));
+    return terms;
 }
 
 QString DolphinFacetsWidget::facetType() const
@@ -143,50 +134,36 @@ QString DolphinFacetsWidget::facetType() const
     return m_typeSelector->currentData().toString();
 }
 
-bool DolphinFacetsWidget::isRatingTerm(const QString& term) const
+bool DolphinFacetsWidget::isSearchTerm(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;
-    bool containsTag = false;
-
-    foreach (const QString& subTerm, subTerms) {
-        if (subTerm.startsWith(QLatin1String("rating>="))) {
-            containsRating = true;
-        } else if (subTerm.startsWith(QLatin1String("modified>="))) {
-            containsModified = true;
-        } else if (subTerm.startsWith(QLatin1String("tag:")) ||
-                   subTerm.startsWith(QLatin1String("tag="))) {
-            containsTag = true;
+    static const QLatin1String searchTokens[] {
+        QLatin1String("modified>="),
+        QLatin1String("rating>="),
+        QLatin1String("tag:"), QLatin1String("tag=")
+    };
+
+    for (const auto &searchToken : searchTokens) {
+        if (term.startsWith(searchToken)) {
+            return true;
         }
     }
-
-    return containsModified || containsRating || containsTag;
+    return false;
 }
 
-void DolphinFacetsWidget::setRatingTerm(const QString& term)
+void DolphinFacetsWidget::setSearchTerm(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);
-        } else if (subTerm.startsWith(QLatin1String("tag:")) ||
-                   subTerm.startsWith(QLatin1String("tag="))) {
-            const QString value = subTerm.mid(4);
-            addSearchTag(value);
-        }
+    if (term.startsWith(QLatin1String("modified>="))) {
+        const QString value = term.mid(10);
+        const QDate date = QDate::fromString(value, Qt::ISODate);
+        setTimespan(date);
+    } else if (term.startsWith(QLatin1String("rating>="))) {
+        const QString value = term.mid(8);
+        const int stars = value.toInt() / 2;
+        setRating(stars);
+    } else if (term.startsWith(QLatin1String("tag:")) ||
+               term.startsWith(QLatin1String("tag="))) {
+        const QString value = term.mid(4);
+        addSearchTag(value);
     }
 }
 
@@ -282,18 +259,24 @@ void DolphinFacetsWidget::updateTagsMenuItems(const QUrl&, const KFileItemList&
     allTags.sort(Qt::CaseInsensitive);
     allTags.removeDuplicates();
 
+    const bool onlyOneTag = allTags.count() == 1;
+
     for (const QString& tagName : qAsConst(allTags)) {
         QAction* action = m_tagsSelector->menu()->addAction(QIcon::fromTheme(QStringLiteral("tag")), tagName);
         action->setCheckable(true);
         action->setChecked(m_searchTags.contains(tagName));
 
-        connect(action, &QAction::triggered, this, [this, tagName](bool isChecked) {
+        connect(action, &QAction::triggered, this, [this, tagName, onlyOneTag](bool isChecked) {
             if (isChecked) {
                 addSearchTag(tagName);
             } else {
                 removeSearchTag(tagName);
             }
             emit facetChanged();
+
+            if (!onlyOneTag) {
+                m_tagsSelector->menu()->show();
+            }
         });
     }