X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/43da84eefc7d68ce86cda2d353216dbe7552fc2c..81065795b78e06ec679ec0589fba7082e777ef2a:/src/search/dolphinsearchbox.cpp diff --git a/src/search/dolphinsearchbox.cpp b/src/search/dolphinsearchbox.cpp index c6943c608..f3dd20462 100644 --- a/src/search/dolphinsearchbox.cpp +++ b/src/search/dolphinsearchbox.cpp @@ -21,49 +21,46 @@ #include "dolphin_searchsettings.h" #include "dolphinfacetswidget.h" +#include "panels/places/placesitemmodel.h" -#include -#include #include -#include #include +#include +#include +#ifdef HAVE_BALOO +#include +#include +#endif #include #include -#include +#include #include -#include +#include #include +#include #include #include #include -#include #include -#include -#ifdef HAVE_BALOO - #include - #include -#endif -#include - DolphinSearchBox::DolphinSearchBox(QWidget* parent) : QWidget(parent), m_startedSearching(false), m_active(true), - m_topLayout(0), - m_searchLabel(0), - m_searchInput(0), - m_optionsScrollArea(0), - m_fileNameButton(0), - m_contentButton(0), - m_separator(0), - m_fromHereButton(0), - m_everywhereButton(0), - m_facetsToggleButton(0), - m_facetsWidget(0), + m_topLayout(nullptr), + m_searchInput(nullptr), + m_saveSearchAction(nullptr), + m_optionsScrollArea(nullptr), + m_fileNameButton(nullptr), + m_contentButton(nullptr), + m_separator(nullptr), + m_fromHereButton(nullptr), + m_everywhereButton(nullptr), + m_facetsToggleButton(nullptr), + m_facetsWidget(nullptr), m_searchPath(), - m_startSearchTimer(0) + m_startSearchTimer(nullptr) { } @@ -89,22 +86,22 @@ void DolphinSearchBox::setSearchPath(const QUrl& url) QFontMetrics metrics(m_fromHereButton->font()); const int maxWidth = metrics.height() * 8; - QString location = url.fileName(); + const QUrl cleanedUrl = url.adjusted(QUrl::RemoveUserInfo | QUrl::StripTrailingSlash); + QString location = cleanedUrl.fileName(); if (location.isEmpty()) { - if (url.isLocalFile()) { - location = QStringLiteral("/"); - } else { - location = url.scheme() + QLatin1String(" - ") + url.host(); - } + location = cleanedUrl.toString(QUrl::PreferLocalFile); + } + if (m_fromHereButton->isChecked() && cleanedUrl.path() == QDir::homePath()) { + m_fromHereButton->setChecked(false); + m_everywhereButton->setChecked(true); + } else { + m_fromHereButton->setChecked(true); + m_everywhereButton->setChecked(false); } const QString elidedLocation = metrics.elidedText(location, Qt::ElideMiddle, maxWidth); m_fromHereButton->setText(i18nc("action:button", "From Here (%1)", elidedLocation)); - - const bool showSearchFromButtons = url.isLocalFile(); - m_separator->setVisible(showSearchFromButtons); - m_fromHereButton->setVisible(showSearchFromButtons); - m_everywhereButton->setVisible(showSearchFromButtons); + m_fromHereButton->setToolTip(i18nc("action:button", "Limit search to '%1' and its subfolders", cleanedUrl.toString(QUrl::PreferLocalFile))); bool hasFacetsSupport = false; #ifdef HAVE_BALOO @@ -140,9 +137,6 @@ QUrl DolphinSearchBox::urlForSearching() const QString encodedUrl; if (m_everywhereButton->isChecked()) { - // It is very unlikely, that the majority of Dolphins target users - // mean "the whole harddisk" instead of "my home folder" when - // selecting the "Everywhere" button. encodedUrl = QDir::homePath(); } else { encodedUrl = m_searchPath.url(); @@ -233,10 +227,14 @@ bool DolphinSearchBox::eventFilter(QObject* obj, QEvent* event) // #379135: we get the FocusIn event when we close a tab but we don't want to emit // the activated() signal before the removeTab() call in DolphinTabWidget::closeTab() returns. // To avoid this issue, we delay the activation of the search box. - QTimer::singleShot(0, this, [this] { - setActive(true); - setFocus(); - }); + // We also don't want to schedule the activation process if we are already active, + // otherwise we can enter in a loop of FocusIn/FocusOut events with the searchbox of another tab. + if (!isActive()) { + QTimer::singleShot(0, this, [this] { + setActive(true); + setFocus(); + }); + } break; default: @@ -250,6 +248,7 @@ void DolphinSearchBox::emitSearchRequest() { m_startSearchTimer->stop(); m_startedSearching = true; + m_saveSearchAction->setEnabled(true); emit searchRequest(); } @@ -257,6 +256,7 @@ void DolphinSearchBox::emitCloseRequest() { m_startSearchTimer->stop(); m_startedSearching = false; + m_saveSearchAction->setEnabled(false); emit closeRequest(); } @@ -299,6 +299,18 @@ void DolphinSearchBox::slotFacetChanged() 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()); + model.createPlacesItem(label, + searchURL, + QStringLiteral("folder-saved-search-symbolic")); + } +} + void DolphinSearchBox::initButton(QToolButton* button) { button->installEventFilter(this); @@ -342,11 +354,9 @@ void DolphinSearchBox::init() closeButton->setToolTip(i18nc("@info:tooltip", "Quit searching")); connect(closeButton, &QToolButton::clicked, this, &DolphinSearchBox::emitCloseRequest); - // Create search label - m_searchLabel = new QLabel(this); - // Create search box m_searchInput = new QLineEdit(this); + m_searchInput->setPlaceholderText(i18n("Search...")); m_searchInput->installEventFilter(this); m_searchInput->setClearButtonEnabled(true); m_searchInput->setFont(QFontDatabase::systemFont(QFontDatabase::GeneralFont)); @@ -356,11 +366,18 @@ void DolphinSearchBox::init() 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); + searchInputLayout->setContentsMargins(0, 0, 0, 0); searchInputLayout->addWidget(closeButton); - searchInputLayout->addWidget(m_searchLabel); searchInputLayout->addWidget(m_searchInput); // Create "Filename" and "Content" button @@ -378,13 +395,16 @@ void DolphinSearchBox::init() m_separator = new KSeparator(Qt::Vertical, this); - // Create "From Here" and "Everywhere"button + // Create "From Here" and "Your files" buttons m_fromHereButton = new QToolButton(this); m_fromHereButton->setText(i18nc("action:button", "From Here")); initButton(m_fromHereButton); m_everywhereButton = new QToolButton(this); - m_everywhereButton->setText(i18nc("action:button", "Everywhere")); + m_everywhereButton->setText(i18nc("action:button", "Your files")); + m_everywhereButton->setToolTip(i18nc("action:button", "Search in your home directory")); + m_everywhereButton->setIcon(QIcon::fromTheme(QStringLiteral("user-home"))); + m_everywhereButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); initButton(m_everywhereButton); QButtonGroup* searchLocationGroup = new QButtonGroup(this); @@ -418,7 +438,7 @@ void DolphinSearchBox::init() // Apply layout for the options QHBoxLayout* optionsLayout = new QHBoxLayout(); - optionsLayout->setMargin(0); + optionsLayout->setContentsMargins(0, 0, 0, 0); optionsLayout->addWidget(m_fileNameButton); optionsLayout->addWidget(m_contentButton); optionsLayout->addWidget(m_separator); @@ -444,7 +464,7 @@ void DolphinSearchBox::init() m_optionsScrollArea->setWidgetResizable(true); m_topLayout = new QVBoxLayout(this); - m_topLayout->setMargin(0); + m_topLayout->setContentsMargins(0, 0, 0, 0); m_topLayout->addLayout(searchInputLayout); m_topLayout->addWidget(m_optionsScrollArea); m_topLayout->addWidget(m_facetsWidget); @@ -485,7 +505,7 @@ QUrl DolphinSearchBox::balooUrlForSearching() const query.setIncludeFolder(m_searchPath.toLocalFile()); } - query.setSearchString(queryStrings.join(QStringLiteral(" "))); + query.setSearchString(queryStrings.join(QLatin1Char(' '))); return query.toSearchUrl(i18nc("@title UDS_DISPLAY_NAME for a KIO directory listing. %1 is the query the user entered.", "Query Results from '%1'", text));