mirror of
https://invent.kde.org/system/dolphin
synced 2024-10-28 03:21:56 +00:00
refactor(search): De-couple baloo URL parsing logic from UI
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
This commit is contained in:
parent
3984e607bb
commit
8d92c8be7f
|
@ -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
|
||||
|
|
98
src/search/dolphinquery.cpp
Normal file
98
src/search/dolphinquery.cpp
Normal file
|
@ -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;
|
||||
}
|
60
src/search/dolphinquery.h
Normal file
60
src/search/dolphinquery.h
Normal file
|
@ -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
|
|
@ -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()));
|
||||
}
|
||||
|
||||
setText(query.text());
|
||||
|
||||
m_facetsWidget->resetOptions();
|
||||
|
||||
setText(query.searchString());
|
||||
|
||||
QStringList types = query.types();
|
||||
if (!types.isEmpty()) {
|
||||
m_facetsWidget->setFacetType(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);
|
||||
setText(value);
|
||||
} else if (m_facetsWidget->isRatingTerm(subTerm)) {
|
||||
m_facetsWidget->setRatingTerm(subTerm);
|
||||
}
|
||||
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()
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
Loading…
Reference in a new issue