]> cloud.milkyroute.net Git - dolphin.git/commitdiff
refactor(search): De-couple baloo URL parsing logic from UI
authorIsmael Asensio <isma.af@gmail.com>
Wed, 13 Nov 2019 21:16:35 +0000 (22:16 +0100)
committerIsmael Asensio <isma.af@gmail.com>
Wed, 13 Nov 2019 21:21:07 +0000 (22:21 +0100)
Summary:
Extracts the logic that parses `baloosearch:` urls into a new model class. The parser logic itself is kept as is.
The search box UI is later updated using the model fields.

This refactor has been proposed by @bruns in the review of D24422, as it largely simplifies the unit tests and further expansion/improvements.

Test Plan:
No behavior changes.
Test case is added in the follow-up revision: D25258

Reviewers: #dolphin, elvisangelaccio, bruns

Reviewed By: #dolphin, elvisangelaccio, bruns

Subscribers: ngraham, bruns, kfm-devel

Tags: #dolphin

Differential Revision: https://phabricator.kde.org/D25257

src/CMakeLists.txt
src/search/dolphinquery.cpp [new file with mode: 0644]
src/search/dolphinquery.h [new file with mode: 0644]
src/search/dolphinsearchbox.cpp
src/search/dolphinsearchbox.h

index 14701a1f41169e7042e8ab46273f22a7e8ec3cb6..617d59480794d5477d91f98545d5ec342dfad035 100644 (file)
@@ -216,6 +216,7 @@ set(dolphinstatic_SRCS
     panels/folders/folderspanel.cpp
     panels/terminal/terminalpanel.cpp
     search/dolphinfacetswidget.cpp
+    search/dolphinquery.cpp
     search/dolphinsearchbox.cpp
     settings/general/behaviorsettingspage.cpp
     settings/general/configurepreviewplugindialog.cpp
diff --git a/src/search/dolphinquery.cpp b/src/search/dolphinquery.cpp
new file mode 100644 (file)
index 0000000..09a8418
--- /dev/null
@@ -0,0 +1,98 @@
+/***************************************************************************
+ *   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            *
+ ***************************************************************************/
+
+#include "dolphinquery.h"
+
+#include <config-baloo.h>
+#ifdef HAVE_BALOO
+#include <Baloo/Query>
+#endif
+
+namespace {
+    /** Checks if a given term in the Baloo::Query::searchString() is a special search term.
+     * This is a copy of `DolphinFacetsWidget::isRatingTerm()` method.
+     */
+    bool isSearchTerm(const QString& term)
+    {
+        static const QLatin1String searchTokens[] {
+            QLatin1String("modified>="),
+            QLatin1String("rating>=")
+        };
+
+        for (const auto &searchToken : searchTokens) {
+            if (term.startsWith(searchToken)) {
+                return true;
+            }
+        }
+        return false;
+    }
+}
+
+DolphinQuery DolphinQuery::fromBalooSearchUrl(const QUrl& searchUrl)
+{
+    DolphinQuery model;
+    model.m_searchUrl = searchUrl;
+
+#ifdef HAVE_BALOO
+    const Baloo::Query query = Baloo::Query::fromSearchUrl(searchUrl);
+
+    model.m_includeFolder = query.includeFolder();
+
+    model.m_searchText = query.searchString();
+
+    const QStringList types = query.types();
+    model.m_fileType = types.isEmpty() ? QString() : types.first();
+
+    const QStringList subTerms = query.searchString().split(' ', QString::SkipEmptyParts);
+    foreach (const QString& subTerm, subTerms) {
+        if (subTerm.startsWith(QLatin1String("filename:"))) {
+            const QString value = subTerm.mid(9);
+            model.m_searchText = value;
+        } else if (isSearchTerm(subTerm)) {
+            model.m_searchTerms << subTerm;
+        }
+    }
+#endif
+    return model;
+}
+
+QUrl DolphinQuery::searchUrl() const
+{
+    return m_searchUrl;
+}
+
+QString DolphinQuery::text() const
+{
+    return m_searchText;
+}
+
+QString DolphinQuery::type() const
+{
+    return m_fileType;
+}
+
+QStringList DolphinQuery::searchTerms() const
+{
+    return m_searchTerms;
+}
+
+QString DolphinQuery::includeFolder() const
+{
+    return m_includeFolder;
+}
diff --git a/src/search/dolphinquery.h b/src/search/dolphinquery.h
new file mode 100644 (file)
index 0000000..736abf6
--- /dev/null
@@ -0,0 +1,60 @@
+/***************************************************************************
+ *   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            *
+ ***************************************************************************/
+
+#ifndef DOLPHINQUERY_H
+#define DOLPHINQUERY_H
+
+#include "dolphin_export.h"
+
+#include <QString>
+#include <QUrl>
+
+/**
+ * @brief Simple query model that parses a Baloo search Url and extracts its
+ * separate components to be displayed on dolphin search box.
+ */
+class DOLPHIN_EXPORT DolphinQuery
+{
+public:
+    /** Calls Baloo::Query::fromSearchUrl() with the given @p searchUrl
+     * and parses the result to extract its separate components */
+    static DolphinQuery fromBalooSearchUrl(const QUrl& searchUrl);
+
+    /** @return the \a searchUrl passed to Baloo::Query::fromSearchUrl() */
+    QUrl searchUrl() const;
+    /** @return the user text part of the query, to be shown in the searchbar */
+    QString text() const;
+    /** @return the first of Baloo::Query::types(), or an empty string */
+    QString type() const;
+    /** @return a list of the search terms of the Baloo::Query that act as a filter,
+     * such as \"rating>= <i>value<i>\" or \"modified>= <i>date<i>\"*/
+    QStringList searchTerms() const;
+    /** @return Baloo::Query::includeFolder(), that is, the initial directory
+     * for the query or an empty string if its a global search" */
+    QString includeFolder() const;
+
+private:
+    QUrl m_searchUrl;
+    QString m_searchText;
+    QString m_fileType;
+    QStringList m_searchTerms;
+    QString m_includeFolder;
+};
+
+#endif //DOLPHINQUERY_H
index 751b23942fc9397dafeaf4e4b9211a5cde7ca0b4..ee7cbe62835800c4b3e4ba680c9136c03d70ac4a 100644 (file)
@@ -22,6 +22,7 @@
 
 #include "dolphin_searchsettings.h"
 #include "dolphinfacetswidget.h"
+#include "dolphinquery.h"
 #include "panels/places/placesitemmodel.h"
 
 #include <KLocalizedString>
@@ -143,7 +144,8 @@ QUrl DolphinSearchBox::urlForSearching() const
 void DolphinSearchBox::fromSearchUrl(const QUrl& url)
 {
     if (url.scheme() == QLatin1String("baloosearch")) {
-        fromBalooSearchUrl(url);
+        const DolphinQuery query = DolphinQuery::fromBalooSearchUrl(url);
+        updateFromQuery(query);
     } else if (url.scheme() == QLatin1String("filenamesearch")) {
         const QUrlQuery query(url);
         setText(query.queryItemValue(QStringLiteral("search")));
@@ -498,11 +500,8 @@ QUrl DolphinSearchBox::balooUrlForSearching() const
 #endif
 }
 
-void DolphinSearchBox::fromBalooSearchUrl(const QUrl& url)
+void DolphinSearchBox::updateFromQuery(const DolphinQuery& query)
 {
-#ifdef HAVE_BALOO
-    const Baloo::Query query = Baloo::Query::fromSearchUrl(url);
-
     // Block all signals to avoid unnecessary "searchRequest" signals
     // while we adjust the search text and the facet widget.
     blockSignals(true);
@@ -514,30 +513,17 @@ void DolphinSearchBox::fromBalooSearchUrl(const QUrl& url)
         setSearchPath(QUrl::fromLocalFile(QDir::homePath()));
     }
 
-    m_facetsWidget->resetOptions();
-
-    setText(query.searchString());
-
-    QStringList types = query.types();
-    if (!types.isEmpty()) {
-        m_facetsWidget->setFacetType(types.first());
-    }
+    setText(query.text());
 
-    const QStringList subTerms = query.searchString().split(' ', QString::SkipEmptyParts);
-    foreach (const QString& subTerm, subTerms) {
-        if (subTerm.startsWith(QLatin1String("filename:"))) {
-            const QString value = subTerm.mid(9);
-            setText(value);
-        } else if (m_facetsWidget->isRatingTerm(subTerm)) {
-            m_facetsWidget->setRatingTerm(subTerm);
-        }
+    m_facetsWidget->resetOptions();
+    m_facetsWidget->setFacetType(query.type());
+    const QStringList searchTerms = query.searchTerms();
+    for (const QString& searchTerm : searchTerms) {
+        m_facetsWidget->setRatingTerm(searchTerm);
     }
 
     m_startSearchTimer->stop();
     blockSignals(false);
-#else
-    Q_UNUSED(url)
-#endif
 }
 
 void DolphinSearchBox::updateFacetsVisible()
index 241dc40c12c5d4b34c27f26ce7d18513ec820347..5fef4ec5a7bdd5464e27818b762ea1456b754d6c 100644 (file)
@@ -24,6 +24,7 @@
 #include <QWidget>
 
 class DolphinFacetsWidget;
+class DolphinQuery;
 class QLineEdit;
 class KSeparator;
 class QToolButton;
@@ -152,10 +153,9 @@ private:
     QUrl balooUrlForSearching() const;
 
     /**
-     * Extracts information from the given Baloo search \a url to
-     * initialize the search box properly.
+     * Sets the searchbox UI with the parameters established by the \a query
      */
-    void fromBalooSearchUrl(const QUrl& url);
+    void updateFromQuery(const DolphinQuery& query);
 
     void updateFacetsVisible();