diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -216,6 +216,7 @@ 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/dolphinfacetswidget.cpp b/src/search/dolphinfacetswidget.cpp --- a/src/search/dolphinfacetswidget.cpp +++ b/src/search/dolphinfacetswidget.cpp @@ -153,7 +153,7 @@ void DolphinFacetsWidget::setFacetType(const QString& type) { - for (int index = 1; index <= m_typeSelector->count(); index++) { + for (int index = 0; index <= m_typeSelector->count(); index++) { if (type == m_typeSelector->itemData(index).toString()) { m_typeSelector->setCurrentIndex(index); break; diff --git a/src/search/dolphinquery.h b/src/search/dolphinquery.h new file mode 100644 --- /dev/null +++ b/src/search/dolphinquery.h @@ -0,0 +1,60 @@ +/*************************************************************************** + * Copyright (C) 2019 by Ismael Asensio * + * * + * 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 +#include + +/** + * @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>= value\" or \"modified>= date\"*/ + 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 diff --git a/src/search/dolphinquery.cpp b/src/search/dolphinquery.cpp new file mode 100644 --- /dev/null +++ b/src/search/dolphinquery.cpp @@ -0,0 +1,98 @@ +/*************************************************************************** + * Copyright (C) 2019 by Ismael Asensio * + * * + * 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 +#ifdef HAVE_BALOO +#include +#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/dolphinsearchbox.h b/src/search/dolphinsearchbox.h --- a/src/search/dolphinsearchbox.h +++ b/src/search/dolphinsearchbox.h @@ -24,6 +24,7 @@ #include class DolphinFacetsWidget; +class DolphinQuery; class QLineEdit; class KSeparator; class QToolButton; @@ -152,10 +153,9 @@ 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 queryModel */ - void fromBalooSearchUrl(const QUrl& url); + void updateFromQuery (const DolphinQuery& query); void updateFacetsVisible(); diff --git a/src/search/dolphinsearchbox.cpp b/src/search/dolphinsearchbox.cpp --- a/src/search/dolphinsearchbox.cpp +++ b/src/search/dolphinsearchbox.cpp @@ -22,6 +22,7 @@ #include "dolphin_searchsettings.h" #include "dolphinfacetswidget.h" +#include "dolphinquery.h" #include "panels/places/placesitemmodel.h" #include @@ -143,7 +144,8 @@ 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 @@ #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 @@ 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()