X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/bdbcef3cff79a0e171b583036d0febf79b83d395..faa37a6138fc0a7458f61d2799370994b936396e:/src/search/dolphinsearchbox.cpp diff --git a/src/search/dolphinsearchbox.cpp b/src/search/dolphinsearchbox.cpp index 71c277473..16f17bbcd 100644 --- a/src/search/dolphinsearchbox.cpp +++ b/src/search/dolphinsearchbox.cpp @@ -17,10 +17,12 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * **************************************************************************/ +#include "global.h" #include "dolphinsearchbox.h" #include "dolphin_searchsettings.h" #include "dolphinfacetswidget.h" +#include "dolphinquery.h" #include "panels/places/placesitemmodel.h" #include @@ -37,9 +39,11 @@ #include #include #include +#include #include #include #include +#include #include #include #include @@ -49,7 +53,6 @@ DolphinSearchBox::DolphinSearchBox(QWidget* parent) : m_startedSearching(false), m_active(true), m_topLayout(nullptr), - m_searchLabel(nullptr), m_searchInput(nullptr), m_saveSearchAction(nullptr), m_optionsScrollArea(nullptr), @@ -58,7 +61,6 @@ DolphinSearchBox::DolphinSearchBox(QWidget* parent) : m_separator(nullptr), m_fromHereButton(nullptr), m_everywhereButton(nullptr), - m_facetsToggleButton(nullptr), m_facetsWidget(nullptr), m_searchPath(), m_startSearchTimer(nullptr) @@ -82,50 +84,47 @@ QString DolphinSearchBox::text() const void DolphinSearchBox::setSearchPath(const QUrl& url) { + if (url == m_searchPath) { + return; + } + + const QUrl cleanedUrl = url.adjusted(QUrl::RemoveUserInfo | QUrl::StripTrailingSlash); + + if (cleanedUrl.path() == QDir::homePath()) { + m_fromHereButton->setChecked(false); + m_everywhereButton->setChecked(true); + if (!m_searchPath.isEmpty()) { + return; + } + } else { + m_everywhereButton->setChecked(false); + m_fromHereButton->setChecked(true); + } + m_searchPath = url; QFontMetrics metrics(m_fromHereButton->font()); const int maxWidth = metrics.height() * 8; - const QUrl cleanedUrl = url.adjusted(QUrl::RemoveUserInfo | QUrl::StripTrailingSlash); QString location = cleanedUrl.fileName(); if (location.isEmpty()) { 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)); m_fromHereButton->setToolTip(i18nc("action:button", "Limit search to '%1' and its subfolders", cleanedUrl.toString(QUrl::PreferLocalFile))); - - bool hasFacetsSupport = false; -#ifdef HAVE_BALOO - const Baloo::IndexerConfig searchInfo; - hasFacetsSupport = searchInfo.fileIndexingEnabled() && searchInfo.shouldBeIndexed(m_searchPath.toLocalFile()); -#endif - m_facetsWidget->setEnabled(hasFacetsSupport); } QUrl DolphinSearchBox::searchPath() const { - return m_searchPath; + return m_everywhereButton->isChecked() ? QUrl::fromLocalFile(QDir::homePath()) : m_searchPath; } QUrl DolphinSearchBox::urlForSearching() const { QUrl url; - bool useBalooSearch = false; -#ifdef HAVE_BALOO - const Baloo::IndexerConfig searchInfo; - useBalooSearch = searchInfo.fileIndexingEnabled() && searchInfo.shouldBeIndexed(m_searchPath.toLocalFile()); -#endif - if (useBalooSearch) { + + if (isIndexingEnabled()) { url = balooUrlForSearching(); } else { url.setScheme(QStringLiteral("filenamesearch")); @@ -136,13 +135,7 @@ QUrl DolphinSearchBox::urlForSearching() const query.addQueryItem(QStringLiteral("checkContent"), QStringLiteral("yes")); } - QString encodedUrl; - if (m_everywhereButton->isChecked()) { - encodedUrl = QDir::homePath(); - } else { - encodedUrl = m_searchPath.url(); - } - query.addQueryItem(QStringLiteral("url"), encodedUrl); + query.addQueryItem(QStringLiteral("url"), searchPath().url()); url.setQuery(query); } @@ -153,16 +146,23 @@ 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"))); + if (m_searchPath.scheme() != url.scheme()) { + m_searchPath = QUrl(); + } setSearchPath(QUrl::fromUserInput(query.queryItemValue(QStringLiteral("url")), QString(), QUrl::AssumeLocalFile)); m_contentButton->setChecked(query.queryItemValue(QStringLiteral("checkContent")) == QLatin1String("yes")); } else { setText(QString()); + m_searchPath = QUrl(); setSearchPath(url); } + + updateFacetsVisible(); } void DolphinSearchBox::selectAll() @@ -204,7 +204,7 @@ void DolphinSearchBox::showEvent(QShowEvent* event) void DolphinSearchBox::hideEvent(QHideEvent* event) { - Q_UNUSED(event); + Q_UNUSED(event) m_startedSearching = false; m_startSearchTimer->stop(); } @@ -286,13 +286,6 @@ void DolphinSearchBox::slotReturnPressed() emit returnPressed(); } -void DolphinSearchBox::slotFacetsButtonToggled() -{ - const bool facetsIsVisible = !m_facetsWidget->isVisible(); - m_facetsWidget->setVisible(facetsIsVisible); - updateFacetsToggleButton(); -} - void DolphinSearchBox::slotFacetChanged() { m_startedSearching = true; @@ -335,14 +328,13 @@ void DolphinSearchBox::loadSettings() m_fileNameButton->setChecked(true); } - m_facetsWidget->setVisible(SearchSettings::showFacetsWidget()); + updateFacetsVisible(); } void DolphinSearchBox::saveSettings() { SearchSettings::setLocation(m_fromHereButton->isChecked() ? QStringLiteral("FromHere") : QStringLiteral("Everywhere")); SearchSettings::setWhat(m_fileNameButton->isChecked() ? QStringLiteral("FileName") : QStringLiteral("Content")); - SearchSettings::setShowFacetsWidget(m_facetsToggleButton->isChecked()); SearchSettings::self()->save(); } @@ -355,11 +347,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)); @@ -381,7 +371,6 @@ void DolphinSearchBox::init() QHBoxLayout* searchInputLayout = new QHBoxLayout(); searchInputLayout->setContentsMargins(0, 0, 0, 0); searchInputLayout->addWidget(closeButton); - searchInputLayout->addWidget(m_searchLabel); searchInputLayout->addWidget(m_searchInput); // Create "Filename" and "Content" button @@ -429,27 +418,23 @@ void DolphinSearchBox::init() m_menuFactory->fillMenuFromGroupingNames(moreSearchToolsButton->menu(), { "files-find" }, this->m_searchPath); } ); - // Create "Facets" widgets - m_facetsToggleButton = new QToolButton(this); - m_facetsToggleButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); - initButton(m_facetsToggleButton); - connect(m_facetsToggleButton, &QToolButton::clicked, this, &DolphinSearchBox::slotFacetsButtonToggled); - + // Create "Facets" widget m_facetsWidget = new DolphinFacetsWidget(this); m_facetsWidget->installEventFilter(this); m_facetsWidget->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Maximum); + m_facetsWidget->layout()->setSpacing(Dolphin::LAYOUT_SPACING_SMALL); connect(m_facetsWidget, &DolphinFacetsWidget::facetChanged, this, &DolphinSearchBox::slotFacetChanged); // Apply layout for the options QHBoxLayout* optionsLayout = new QHBoxLayout(); optionsLayout->setContentsMargins(0, 0, 0, 0); + optionsLayout->setSpacing(Dolphin::LAYOUT_SPACING_SMALL); optionsLayout->addWidget(m_fileNameButton); optionsLayout->addWidget(m_contentButton); optionsLayout->addWidget(m_separator); optionsLayout->addWidget(m_fromHereButton); optionsLayout->addWidget(m_everywhereButton); optionsLayout->addWidget(new KSeparator(Qt::Vertical, this)); - optionsLayout->addWidget(m_facetsToggleButton); optionsLayout->addWidget(moreSearchToolsButton); optionsLayout->addStretch(1); @@ -469,6 +454,7 @@ void DolphinSearchBox::init() m_topLayout = new QVBoxLayout(this); m_topLayout->setContentsMargins(0, 0, 0, 0); + m_topLayout->setSpacing(Dolphin::LAYOUT_SPACING_SMALL); m_topLayout->addLayout(searchInputLayout); m_topLayout->addWidget(m_optionsScrollArea); m_topLayout->addWidget(m_facetsWidget); @@ -481,8 +467,6 @@ void DolphinSearchBox::init() m_startSearchTimer->setSingleShot(true); m_startSearchTimer->setInterval(1000); connect(m_startSearchTimer, &QTimer::timeout, this, &DolphinSearchBox::emitSearchRequest); - - updateFacetsToggleButton(); } QUrl DolphinSearchBox::balooUrlForSearching() const @@ -509,7 +493,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)); @@ -518,11 +502,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); @@ -534,35 +515,32 @@ void DolphinSearchBox::fromBalooSearchUrl(const QUrl& url) setSearchPath(QUrl::fromLocalFile(QDir::homePath())); } - 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::updateFacetsToggleButton() +void DolphinSearchBox::updateFacetsVisible() { - const bool facetsIsVisible = SearchSettings::showFacetsWidget(); - m_facetsToggleButton->setChecked(facetsIsVisible ? true : false); - m_facetsToggleButton->setIcon(QIcon::fromTheme(facetsIsVisible ? QStringLiteral("arrow-up-double") : QStringLiteral("arrow-down-double"))); - m_facetsToggleButton->setText(facetsIsVisible ? i18nc("action:button", "Fewer Options") : i18nc("action:button", "More Options")); + const bool indexingEnabled = isIndexingEnabled(); + m_facetsWidget->setEnabled(indexingEnabled); + m_facetsWidget->setVisible(indexingEnabled); } +bool DolphinSearchBox::isIndexingEnabled() const +{ +#ifdef HAVE_BALOO + const Baloo::IndexerConfig searchInfo; + return searchInfo.fileIndexingEnabled() && searchInfo.shouldBeIndexed(searchPath().toLocalFile()); +#else + return false; +#endif +}