diff --git a/src/dolphincontextmenu.cpp b/src/dolphincontextmenu.cpp --- a/src/dolphincontextmenu.cpp +++ b/src/dolphincontextmenu.cpp @@ -305,8 +305,11 @@ const QUrl selectedUrl(m_fileInfo.url()); if (selectedUrl.isValid()) { PlacesItemModel model; - const QString text = selectedUrl.fileName(); - PlacesItem* item = model.createPlacesItem(text, selectedUrl, KIO::iconNameForUrl(selectedUrl)); + const DolphinViewContainer* container = m_mainWindow->activeViewContainer(); + // FIXME: KIO::iconNameForUrl() returns 'baloo' icon for search URLs when it should + // return 'folder-saved-search-symbolic' + // https://bugs.kde.org/show_bug.cgi?id=386182 + PlacesItem* item = model.createPlacesItem(container->placesText(), selectedUrl, KIO::iconNameForUrl(selectedUrl)); model.appendItemToGroup(item); model.saveBookmarks(); } diff --git a/src/dolphinviewcontainer.cpp b/src/dolphinviewcontainer.cpp --- a/src/dolphinviewcontainer.cpp +++ b/src/dolphinviewcontainer.cpp @@ -362,7 +362,7 @@ QString text; if (isSearchModeEnabled()) { - text = m_searchBox->searchPath().fileName() + QLatin1String(": ") + m_searchBox->text(); + text = i18n("Search for %1 in %2", m_searchBox->text(), m_searchBox->searchPath().fileName()); } else { text = url().fileName(); if (text.isEmpty()) { diff --git a/src/search/dolphinsearchbox.h b/src/search/dolphinsearchbox.h --- a/src/search/dolphinsearchbox.h +++ b/src/search/dolphinsearchbox.h @@ -139,6 +139,7 @@ void slotReturnPressed(); void slotFacetsButtonToggled(); void slotFacetChanged(); + void slotSearchSaved(); private: void initButton(QToolButton* button); @@ -167,6 +168,7 @@ QLabel* m_searchLabel; QLineEdit* m_searchInput; + QAction* m_saveSearchAction; QScrollArea* m_optionsScrollArea; QToolButton* m_fileNameButton; QToolButton* m_contentButton; diff --git a/src/search/dolphinsearchbox.cpp b/src/search/dolphinsearchbox.cpp --- a/src/search/dolphinsearchbox.cpp +++ b/src/search/dolphinsearchbox.cpp @@ -22,11 +22,14 @@ #include "dolphin_searchsettings.h" #include "dolphinfacetswidget.h" +#include + #include #include #include #include #include +// #include #include #include @@ -54,6 +57,7 @@ m_topLayout(0), m_searchLabel(0), m_searchInput(0), + m_saveSearchAction(0), m_optionsScrollArea(0), m_fileNameButton(0), m_contentButton(0), @@ -250,13 +254,15 @@ { m_startSearchTimer->stop(); m_startedSearching = true; + m_saveSearchAction->setEnabled(true); emit searchRequest(); } void DolphinSearchBox::emitCloseRequest() { m_startSearchTimer->stop(); m_startedSearching = false; + m_saveSearchAction->setEnabled(false); emit closeRequest(); } @@ -299,6 +305,23 @@ emit searchRequest(); } +void DolphinSearchBox::slotSearchSaved() +{ + const QUrl searchURL = urlForSearching(); + if (searchURL.isValid()) { + PlacesItemModel model; + const QString label = i18n("Search for %1 in %2", text(), searchPath().fileName()); + // FIXME: We hardcode the 'folder-saved-search-symbolic' icon here because we can't trust KIO::iconNameForUrl() + // Due to https://bugs.kde.org/show_bug.cgi?id=386182 + // Once that is fixed, please use KIO::iconNameForUrl() instead + PlacesItem* item = model.createPlacesItem(label, + searchURL, + QStringLiteral("folder-saved-search-symbolic")); + model.appendItemToGroup(item); + model.saveBookmarks(); + } +} + void DolphinSearchBox::initButton(QToolButton* button) { button->installEventFilter(this); @@ -356,6 +379,14 @@ this, &DolphinSearchBox::slotSearchTextChanged); setFocusProxy(m_searchInput); + // Add "Save search" button inside search box + m_saveSearchAction = new QAction(this); + m_saveSearchAction->setIcon (QIcon::fromTheme(QStringLiteral("document-save-symbolic"))); + m_saveSearchAction->setText(i18nc("action:button", "Save this search to quickly access it again in the future")); + m_saveSearchAction->setEnabled(false); + m_searchInput->addAction(m_saveSearchAction, QLineEdit::TrailingPosition); + connect(m_saveSearchAction, &QAction::triggered, this, &DolphinSearchBox::slotSearchSaved); + // Apply layout for the search input QHBoxLayout* searchInputLayout = new QHBoxLayout(); searchInputLayout->setMargin(0);