When you open a new tab while the search mode is enabled, the

newly opened tab also starts the same search (Because new tab is opened with
the current view url), but the search box is in read-only mode. So you cannot
close the search bar nor edit the search text.

This patch fixes this by parsing the search url. The value of the "search"
parameter is used as search text and the value of the "url" parameter is used
for the search path ("root" folder for the search when "Search from here" mode
is enabled).

In case of Baloo search urls, we use Baloo::Query::fromSearchUrl.

Removed everything related to read only mode in DolphinSearchBox, not needed
anymore.

REVIEW: 111968
BUG: 311950
FIXED-IN: 4.13.0
This commit is contained in:
Emmanuel Pescosta 2014-03-28 18:48:48 +01:00
parent ef8e30e7f1
commit 54208a66a0
5 changed files with 184 additions and 70 deletions

View file

@ -314,36 +314,18 @@ void DolphinViewContainer::setSearchModeEnabled(bool enabled)
m_urlNavigator->setVisible(!enabled); m_urlNavigator->setVisible(!enabled);
if (enabled) { if (enabled) {
KUrl url = m_urlNavigator->locationUrl(); const KUrl& locationUrl = m_urlNavigator->locationUrl();
m_searchBox->setText(QString()); m_searchBox->fromSearchUrl(locationUrl);
m_searchBox->setReadOnly(isSearchUrl(url), url);
// Remember the most recent non-search URL as search path
// of the search-box, so that it can be restored
// when switching back to the URL navigator.
int index = m_urlNavigator->historyIndex();
const int historySize = m_urlNavigator->historySize();
while (isSearchUrl(url) && (index < historySize)) {
++index;
url = m_urlNavigator->locationUrl(index);
}
if (!isSearchUrl(url)) {
m_searchBox->setSearchPath(url);
}
} else { } else {
m_view->setViewPropertiesContext(QString()); m_view->setViewPropertiesContext(QString());
// Restore the URL for the URL navigator. If Dolphin has been // Restore the URL for the URL navigator. If Dolphin has been
// started with a search-URL, the home URL is used as fallback. // started with a search-URL, the home URL is used as fallback.
const KUrl url = m_searchBox->searchPath(); KUrl url = m_searchBox->searchPath();
if (url.isValid() && !url.isEmpty()) { if (url.isEmpty() || !url.isValid() || isSearchUrl(url)) {
if (isSearchUrl(url)) { url = GeneralSettings::self()->homeUrl();
m_urlNavigator->goHome();
} else {
m_urlNavigator->setLocationUrl(url);
}
} }
m_urlNavigator->setLocationUrl(url);
} }
} }

View file

@ -179,8 +179,117 @@ QString DolphinFacetsWidget::facetType() const
return QString(); return QString();
} }
bool DolphinFacetsWidget::isRatingTerm(const Baloo::Term& term) const
{
const QList<Baloo::Term> subTerms = term.subTerms();
if (subTerms.isEmpty()) {
// If term has no sub terms, then the term itself is either a "rating" term
// or a "modified" term.
return term.property() == QLatin1String("modified") ||
term.property() == QLatin1String("rating");
} else if (subTerms.size() == 2) {
// If term has sub terms, then the sub terms are always "rating" and "modified" terms.
QStringList properties;
foreach (const Baloo::Term& subTerm, subTerms) {
properties << subTerm.property();
}
return properties.contains(QLatin1String("modified")) &&
properties.contains(QLatin1String("rating"));
}
return false;
}
void DolphinFacetsWidget::setRatingTerm(const Baloo::Term& 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.
QList<Baloo::Term> subTerms = term.subTerms();
if (subTerms.isEmpty()) {
subTerms << term;
}
foreach (const Baloo::Term& subTerm, subTerms) {
const QString property = subTerm.property();
if (property == QLatin1String("modified")) {
const QDate date = subTerm.value().toDate();
setTimespan(date);
} else if (property == QLatin1String("rating")) {
const int stars = subTerm.value().toInt() / 2;
setRating(stars);
}
}
}
#endif #endif
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);
}
}
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;
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)
{
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, QRadioButton* DolphinFacetsWidget::createRadioButton(const QString& text,
QButtonGroup* group) QButtonGroup* group)

View file

@ -58,12 +58,20 @@ public:
#ifdef HAVE_BALOO #ifdef HAVE_BALOO
Baloo::Term ratingTerm() const; Baloo::Term ratingTerm() const;
QString facetType() const; QString facetType() const;
bool isRatingTerm(const Baloo::Term& term) const;
void setRatingTerm(const Baloo::Term& term);
#endif #endif
void setFacetType(const QString& type);
signals: signals:
void facetChanged(); void facetChanged();
private: private:
void setRating(const int stars);
void setTimespan(const QDate& date);
/** /**
* @return New radiobutton which is connected to the * @return New radiobutton which is connected to the
* slotFacedChanged() slot whenever it has * slotFacedChanged() slot whenever it has

View file

@ -49,7 +49,6 @@
DolphinSearchBox::DolphinSearchBox(QWidget* parent) : DolphinSearchBox::DolphinSearchBox(QWidget* parent) :
QWidget(parent), QWidget(parent),
m_startedSearching(false), m_startedSearching(false),
m_readOnly(false),
m_active(true), m_active(true),
m_topLayout(0), m_topLayout(0),
m_searchLabel(0), m_searchLabel(0),
@ -63,7 +62,6 @@ DolphinSearchBox::DolphinSearchBox(QWidget* parent) :
m_facetsToggleButton(0), m_facetsToggleButton(0),
m_facetsWidget(0), m_facetsWidget(0),
m_searchPath(), m_searchPath(),
m_readOnlyQuery(),
m_startSearchTimer(0) m_startSearchTimer(0)
{ {
} }
@ -102,7 +100,7 @@ void DolphinSearchBox::setSearchPath(const KUrl& url)
const QString elidedLocation = metrics.elidedText(location, Qt::ElideMiddle, maxWidth); const QString elidedLocation = metrics.elidedText(location, Qt::ElideMiddle, maxWidth);
m_fromHereButton->setText(i18nc("action:button", "From Here (%1)", elidedLocation)); m_fromHereButton->setText(i18nc("action:button", "From Here (%1)", elidedLocation));
const bool showSearchFromButtons = url.isLocalFile() && !m_readOnly; const bool showSearchFromButtons = url.isLocalFile();
m_separator->setVisible(showSearchFromButtons); m_separator->setVisible(showSearchFromButtons);
m_fromHereButton->setVisible(showSearchFromButtons); m_fromHereButton->setVisible(showSearchFromButtons);
m_everywhereButton->setVisible(showSearchFromButtons); m_everywhereButton->setVisible(showSearchFromButtons);
@ -152,23 +150,24 @@ KUrl DolphinSearchBox::urlForSearching() const
return url; return url;
} }
void DolphinSearchBox::selectAll() void DolphinSearchBox::fromSearchUrl(const KUrl& url)
{ {
m_searchInput->selectAll(); if (url.protocol() == "baloosearch") {
} fromBalooSearchUrl(url);
} else if (url.protocol() == "filenamesearch") {
void DolphinSearchBox::setReadOnly(bool readOnly, const KUrl& query) const QMap<QString, QString>& queryItems = url.queryItems();
{ setText(queryItems.value("search"));
if (m_readOnly != readOnly || m_readOnlyQuery != query) { setSearchPath(queryItems.value("url"));
m_readOnly = readOnly; m_contentButton->setChecked(queryItems.value("checkContent") == "yes");
m_readOnlyQuery = query; } else {
applyReadOnlyState(); setText(QString());
setSearchPath(url);
} }
} }
bool DolphinSearchBox::isReadOnly() const void DolphinSearchBox::selectAll()
{ {
return m_readOnly; m_searchInput->selectAll();
} }
void DolphinSearchBox::setActive(bool active) void DolphinSearchBox::setActive(bool active)
@ -426,7 +425,6 @@ void DolphinSearchBox::init()
connect(m_startSearchTimer, SIGNAL(timeout()), this, SLOT(emitSearchRequest())); connect(m_startSearchTimer, SIGNAL(timeout()), this, SLOT(emitSearchRequest()));
updateFacetsToggleButton(); updateFacetsToggleButton();
applyReadOnlyState();
} }
KUrl DolphinSearchBox::balooUrlForSearching() const KUrl DolphinSearchBox::balooUrlForSearching() const
@ -464,26 +462,46 @@ KUrl DolphinSearchBox::balooUrlForSearching() const
#endif #endif
} }
void DolphinSearchBox::applyReadOnlyState() void DolphinSearchBox::fromBalooSearchUrl(const KUrl& url)
{ {
#ifdef HAVE_BALOO #ifdef HAVE_BALOO
if (m_readOnly) { const Baloo::Query query = Baloo::Query::fromSearchUrl(url);
m_searchLabel->setText(Baloo::Query::titleFromQueryUrl(m_readOnlyQuery)); const Baloo::Term term = query.term();
// Block all signals to avoid unnecessary "searchRequest" signals
// while we adjust the search text and the facet widget.
blockSignals(true);
const QVariantHash customOptions = query.customOptions();
if (customOptions.contains("includeFolder")) {
setSearchPath(customOptions.value("includeFolder").toString());
} else { } else {
#else setSearchPath(QDir::homePath());
{ }
if (!query.searchString().isEmpty()) {
setText(query.searchString());
}
QStringList types = query.types();
types.removeOne("File"); // We are only interested in facet widget types
if (!types.isEmpty()) {
m_facetsWidget->setFacetType(types.first());
}
foreach (const Baloo::Term& subTerm, term.subTerms()) {
const QString property = subTerm.property();
if (property == QLatin1String("filename")) {
setText(subTerm.value().toString());
} else if (m_facetsWidget->isRatingTerm(subTerm)) {
m_facetsWidget->setRatingTerm(subTerm);
}
}
m_startSearchTimer->stop();
blockSignals(false);
#endif #endif
m_searchLabel->setText(i18nc("@label:textbox", "Find:"));
}
m_searchInput->setVisible(!m_readOnly);
m_optionsScrollArea->setVisible(!m_readOnly);
if (m_readOnly) {
m_facetsWidget->hide();
} else {
m_facetsWidget->setVisible(SearchSettings::showFacetsWidget());
}
} }
void DolphinSearchBox::updateFacetsToggleButton() void DolphinSearchBox::updateFacetsToggleButton()

View file

@ -71,22 +71,17 @@ public:
/** @return URL that will start the searching of files. */ /** @return URL that will start the searching of files. */
KUrl urlForSearching() const; KUrl urlForSearching() const;
/**
* Extracts information from the given search \a url to
* initialize the search box properly.
*/
void fromSearchUrl(const KUrl& url);
/** /**
* Selects the whole text of the search box. * Selects the whole text of the search box.
*/ */
void selectAll(); void selectAll();
/**
* @param readOnly If set to true the searchbox cannot be modified
* by the user and acts as visual indicator for
* an externally triggered search query.
* @param query If readOnly is true this URL will be used
* to show a human readable information about the
* query.
*/
void setReadOnly(bool readOnly, const KUrl& query = KUrl());
bool isReadOnly() const;
/** /**
* Set the search box to the active mode, if \a active * Set the search box to the active mode, if \a active
* is true. The active mode is default. The inactive mode only differs * is true. The active mode is default. The inactive mode only differs
@ -155,12 +150,15 @@ private:
*/ */
KUrl balooUrlForSearching() const; KUrl balooUrlForSearching() const;
void applyReadOnlyState(); /**
* Extracts information from the given Baloo search \a url to
* initialize the search box properly.
*/
void fromBalooSearchUrl(const KUrl& url);
void updateFacetsToggleButton(); void updateFacetsToggleButton();
private: private:
bool m_startedSearching; bool m_startedSearching;
bool m_readOnly;
bool m_active; bool m_active;
QVBoxLayout* m_topLayout; QVBoxLayout* m_topLayout;
@ -177,7 +175,6 @@ private:
DolphinFacetsWidget* m_facetsWidget; DolphinFacetsWidget* m_facetsWidget;
KUrl m_searchPath; KUrl m_searchPath;
KUrl m_readOnlyQuery;
QTimer* m_startSearchTimer; QTimer* m_startSearchTimer;
}; };