X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/a058c64eba30f11bfa87ac097371c04437d0471e..2cd3d58eec5695899c26ca66a631fb79867b6584:/src/search/dolphinsearchbox.cpp diff --git a/src/search/dolphinsearchbox.cpp b/src/search/dolphinsearchbox.cpp index cdc0718df..dfd733e5d 100644 --- a/src/search/dolphinsearchbox.cpp +++ b/src/search/dolphinsearchbox.cpp @@ -1,37 +1,25 @@ -/*************************************************************************** -* Copyright (C) 2010 by Peter Penz * -* * -* 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 * -* **************************************************************************/ +/* + * SPDX-FileCopyrightText: 2010 Peter Penz + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ -#include "global.h" #include "dolphinsearchbox.h" +#include "global.h" #include "dolphin_searchsettings.h" #include "dolphinfacetswidget.h" +#include "dolphinplacesmodelsingleton.h" #include "dolphinquery.h" -#include "panels/places/placesitemmodel.h" +#include "config-dolphin.h" +#include #include -#include #include -#include -#ifdef HAVE_BALOO -#include +#include +#if HAVE_BALOO #include +#include #endif #include @@ -40,7 +28,6 @@ #include #include #include -#include #include #include #include @@ -48,22 +35,22 @@ #include #include -DolphinSearchBox::DolphinSearchBox(QWidget* parent) : - QWidget(parent), - m_startedSearching(false), - m_active(true), - 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_facetsWidget(nullptr), - m_searchPath(), - m_startSearchTimer(nullptr) +DolphinSearchBox::DolphinSearchBox(QWidget *parent) + : QWidget(parent) + , m_startedSearching(false) + , m_active(true) + , 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_facetsWidget(nullptr) + , m_searchPath() + , m_startSearchTimer(nullptr) { } @@ -72,9 +59,11 @@ DolphinSearchBox::~DolphinSearchBox() saveSettings(); } -void DolphinSearchBox::setText(const QString& text) +void DolphinSearchBox::setText(const QString &text) { - m_searchInput->setText(text); + if (m_searchInput->text() != text) { + m_searchInput->setText(text); + } } QString DolphinSearchBox::text() const @@ -82,7 +71,7 @@ QString DolphinSearchBox::text() const return m_searchInput->text(); } -void DolphinSearchBox::setSearchPath(const QUrl& url) +void DolphinSearchBox::setSearchPath(const QUrl &url) { if (url == m_searchPath) { return; @@ -144,10 +133,10 @@ QUrl DolphinSearchBox::urlForSearching() const return url; } -void DolphinSearchBox::fromSearchUrl(const QUrl& url) +void DolphinSearchBox::fromSearchUrl(const QUrl &url) { - if (url.scheme() == QLatin1String("baloosearch")) { - const DolphinQuery query = DolphinQuery::fromBalooSearchUrl(url); + if (DolphinQuery::supportsScheme(url.scheme())) { + const DolphinQuery query = DolphinQuery::fromSearchUrl(url); updateFromQuery(query); } else if (url.scheme() == QLatin1String("filenamesearch")) { const QUrlQuery query(url); @@ -177,7 +166,7 @@ void DolphinSearchBox::setActive(bool active) m_active = active; if (active) { - emit activated(); + Q_EMIT activated(); } } } @@ -187,7 +176,7 @@ bool DolphinSearchBox::isActive() const return m_active; } -bool DolphinSearchBox::event(QEvent* event) +bool DolphinSearchBox::event(QEvent *event) { if (event->type() == QEvent::Polish) { init(); @@ -195,7 +184,7 @@ bool DolphinSearchBox::event(QEvent* event) return QWidget::event(event); } -void DolphinSearchBox::showEvent(QShowEvent* event) +void DolphinSearchBox::showEvent(QShowEvent *event) { if (!event->spontaneous()) { m_searchInput->setFocus(); @@ -203,29 +192,28 @@ void DolphinSearchBox::showEvent(QShowEvent* event) } } -void DolphinSearchBox::hideEvent(QHideEvent* event) +void DolphinSearchBox::hideEvent(QHideEvent *event) { Q_UNUSED(event) m_startedSearching = false; m_startSearchTimer->stop(); } -void DolphinSearchBox::keyReleaseEvent(QKeyEvent* event) +void DolphinSearchBox::keyReleaseEvent(QKeyEvent *event) { QWidget::keyReleaseEvent(event); if (event->key() == Qt::Key_Escape) { if (m_searchInput->text().isEmpty()) { - emit closeRequest(); + emitCloseRequest(); } else { m_searchInput->clear(); } - } - else if (event->key() == Qt::Key_Down) { - emit focusViewRequest(); + } else if (event->key() == Qt::Key_Down) { + Q_EMIT focusViewRequest(); } } -bool DolphinSearchBox::eventFilter(QObject* obj, QEvent* event) +bool DolphinSearchBox::eventFilter(QObject *obj, QEvent *event) { switch (event->type()) { case QEvent::FocusIn: @@ -254,7 +242,7 @@ void DolphinSearchBox::emitSearchRequest() m_startSearchTimer->stop(); m_startedSearching = true; m_saveSearchAction->setEnabled(true); - emit searchRequest(); + Q_EMIT searchRequest(); } void DolphinSearchBox::emitCloseRequest() @@ -262,7 +250,7 @@ void DolphinSearchBox::emitCloseRequest() m_startSearchTimer->stop(); m_startedSearching = false; m_saveSearchAction->setEnabled(false); - emit closeRequest(); + Q_EMIT closeRequest(); } void DolphinSearchBox::slotConfigurationChanged() @@ -273,43 +261,45 @@ void DolphinSearchBox::slotConfigurationChanged() } } -void DolphinSearchBox::slotSearchTextChanged(const QString& text) +void DolphinSearchBox::slotSearchTextChanged(const QString &text) { - if (text.isEmpty()) { - m_startSearchTimer->stop(); + // Restore URL when search box is cleared by closing and reopening the box. + emitCloseRequest(); + Q_EMIT openRequest(); } else { m_startSearchTimer->start(); } - emit searchTextChanged(text); + Q_EMIT searchTextChanged(text); } void DolphinSearchBox::slotReturnPressed() { + if (m_searchInput->text().isEmpty()) { + return; + } + emitSearchRequest(); - emit focusViewRequest(); + Q_EMIT focusViewRequest(); } void DolphinSearchBox::slotFacetChanged() { m_startedSearching = true; m_startSearchTimer->stop(); - emit searchRequest(); + Q_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")); + DolphinPlacesModelSingleton::instance().placesModel()->addPlace(label, searchURL, QStringLiteral("folder-saved-search-symbolic")); } } -void DolphinSearchBox::initButton(QToolButton* button) +void DolphinSearchBox::initButton(QToolButton *button) { button->installEventFilter(this); button->setAutoExclusive(true); @@ -344,38 +334,36 @@ void DolphinSearchBox::saveSettings() void DolphinSearchBox::init() { - // Create close button - QToolButton* closeButton = new QToolButton(this); - closeButton->setAutoRaise(true); - closeButton->setIcon(QIcon::fromTheme(QStringLiteral("dialog-close"))); - closeButton->setToolTip(i18nc("@info:tooltip", "Quit searching")); - connect(closeButton, &QToolButton::clicked, this, &DolphinSearchBox::emitCloseRequest); - // Create search box m_searchInput = new QLineEdit(this); - m_searchInput->setPlaceholderText(i18n("Search...")); + m_searchInput->setPlaceholderText(i18n("Search…")); m_searchInput->installEventFilter(this); m_searchInput->setClearButtonEnabled(true); m_searchInput->setFont(QFontDatabase::systemFont(QFontDatabase::GeneralFont)); - connect(m_searchInput, &QLineEdit::returnPressed, - this, &DolphinSearchBox::slotReturnPressed); - connect(m_searchInput, &QLineEdit::textChanged, - this, &DolphinSearchBox::slotSearchTextChanged); + connect(m_searchInput, &QLineEdit::returnPressed, this, &DolphinSearchBox::slotReturnPressed); + connect(m_searchInput, &QLineEdit::textChanged, 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->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); + // Create close button + QToolButton *closeButton = new QToolButton(this); + closeButton->setAutoRaise(true); + closeButton->setIcon(QIcon::fromTheme(QStringLiteral("dialog-close"))); + closeButton->setToolTip(i18nc("@info:tooltip", "Quit searching")); + connect(closeButton, &QToolButton::clicked, this, &DolphinSearchBox::emitCloseRequest); + // Apply layout for the search input - QHBoxLayout* searchInputLayout = new QHBoxLayout(); + QHBoxLayout *searchInputLayout = new QHBoxLayout(); searchInputLayout->setContentsMargins(0, 0, 0, 0); - searchInputLayout->addWidget(closeButton); searchInputLayout->addWidget(m_searchInput); + searchInputLayout->addWidget(closeButton); // Create "Filename" and "Content" button m_fileNameButton = new QToolButton(this); @@ -386,7 +374,7 @@ void DolphinSearchBox::init() m_contentButton->setText(i18nc("action:button", "Content")); initButton(m_contentButton); - QButtonGroup* searchWhatGroup = new QButtonGroup(this); + QButtonGroup *searchWhatGroup = new QButtonGroup(this); searchWhatGroup->addButton(m_fileNameButton); searchWhatGroup->addButton(m_contentButton); @@ -404,23 +392,28 @@ void DolphinSearchBox::init() m_everywhereButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); initButton(m_everywhereButton); - QButtonGroup* searchLocationGroup = new QButtonGroup(this); + QButtonGroup *searchLocationGroup = new QButtonGroup(this); searchLocationGroup->addButton(m_fromHereButton); searchLocationGroup->addButton(m_everywhereButton); - auto moreSearchToolsButton = new QToolButton(this); - moreSearchToolsButton->setAutoRaise(true); - moreSearchToolsButton->setPopupMode(QToolButton::InstantPopup); - moreSearchToolsButton->setIcon(QIcon::fromTheme("arrow-down-double")); - moreSearchToolsButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); - moreSearchToolsButton->setText(i18n("More Search Tools")); - moreSearchToolsButton->setMenu(new QMenu(this)); - connect(moreSearchToolsButton->menu(), &QMenu::aboutToShow, moreSearchToolsButton->menu(), [this, moreSearchToolsButton]() - { - m_menuFactory.reset(new KMoreToolsMenuFactory("dolphin/search-tools")); - moreSearchToolsButton->menu()->clear(); - m_menuFactory->fillMenuFromGroupingNames(moreSearchToolsButton->menu(), { "files-find" }, this->m_searchPath); - } ); + KService::Ptr kfind = KService::serviceByDesktopName(QStringLiteral("org.kde.kfind")); + + QToolButton *kfindToolsButton = nullptr; + if (kfind) { + kfindToolsButton = new QToolButton(this); + kfindToolsButton->setAutoRaise(true); + kfindToolsButton->setPopupMode(QToolButton::InstantPopup); + kfindToolsButton->setIcon(QIcon::fromTheme("arrow-down-double")); + kfindToolsButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); + kfindToolsButton->setText(i18n("Open %1", kfind->name())); + kfindToolsButton->setIcon(QIcon::fromTheme(kfind->icon())); + + connect(kfindToolsButton, &QToolButton::clicked, this, [this, kfind] { + auto *job = new KIO::ApplicationLauncherJob(kfind); + job->setUrls({m_searchPath}); + job->start(); + }); + } // Create "Facets" widget m_facetsWidget = new DolphinFacetsWidget(this); @@ -429,8 +422,12 @@ void DolphinSearchBox::init() m_facetsWidget->layout()->setSpacing(Dolphin::LAYOUT_SPACING_SMALL); connect(m_facetsWidget, &DolphinFacetsWidget::facetChanged, this, &DolphinSearchBox::slotFacetChanged); + // Put the options into a QScrollArea. This prevents increasing the view width + // in case that not enough width for the options is available. + QWidget *optionsContainer = new QWidget(this); + // Apply layout for the options - QHBoxLayout* optionsLayout = new QHBoxLayout(); + QHBoxLayout *optionsLayout = new QHBoxLayout(optionsContainer); optionsLayout->setContentsMargins(0, 0, 0, 0); optionsLayout->setSpacing(Dolphin::LAYOUT_SPACING_SMALL); optionsLayout->addWidget(m_fileNameButton); @@ -439,14 +436,11 @@ void DolphinSearchBox::init() optionsLayout->addWidget(m_fromHereButton); optionsLayout->addWidget(m_everywhereButton); optionsLayout->addWidget(new KSeparator(Qt::Vertical, this)); - optionsLayout->addWidget(moreSearchToolsButton); + if (kfindToolsButton) { + optionsLayout->addWidget(kfindToolsButton); + } optionsLayout->addStretch(1); - // Put the options into a QScrollArea. This prevents increasing the view width - // in case that not enough width for the options is available. - QWidget* optionsContainer = new QWidget(this); - optionsContainer->setLayout(optionsLayout); - m_optionsScrollArea = new QScrollArea(this); m_optionsScrollArea->setFrameShape(QFrame::NoFrame); m_optionsScrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); @@ -457,7 +451,7 @@ void DolphinSearchBox::init() m_optionsScrollArea->setWidgetResizable(true); m_topLayout = new QVBoxLayout(this); - m_topLayout->setContentsMargins(0, 0, 0, 0); + m_topLayout->setContentsMargins(0, Dolphin::LAYOUT_SPACING_SMALL, 0, 0); m_topLayout->setSpacing(Dolphin::LAYOUT_SPACING_SMALL); m_topLayout->addLayout(searchInputLayout); m_topLayout->addWidget(m_optionsScrollArea); @@ -466,22 +460,21 @@ void DolphinSearchBox::init() loadSettings(); // The searching should be started automatically after the user did not change - // the text within one second + // the text for a while m_startSearchTimer = new QTimer(this); m_startSearchTimer->setSingleShot(true); - m_startSearchTimer->setInterval(1000); + m_startSearchTimer->setInterval(500); connect(m_startSearchTimer, &QTimer::timeout, this, &DolphinSearchBox::emitSearchRequest); } -QString DolphinSearchBox::queryTitle(const QString& text) const +QString DolphinSearchBox::queryTitle(const QString &text) const { - return i18nc("@title UDS_DISPLAY_NAME for a KIO directory listing. %1 is the query the user entered.", - "Query Results from '%1'", text); + return i18nc("@title UDS_DISPLAY_NAME for a KIO directory listing. %1 is the query the user entered.", "Query Results from '%1'", text); } QUrl DolphinSearchBox::balooUrlForSearching() const { -#ifdef HAVE_BALOO +#if HAVE_BALOO const QString text = m_searchInput->text(); Baloo::Query query; @@ -507,7 +500,7 @@ QUrl DolphinSearchBox::balooUrlForSearching() const #endif } -void DolphinSearchBox::updateFromQuery(const DolphinQuery& query) +void DolphinSearchBox::updateFromQuery(const DolphinQuery &query) { // Block all signals to avoid unnecessary "searchRequest" signals // while we adjust the search text and the facet widget. @@ -524,14 +517,14 @@ void DolphinSearchBox::updateFromQuery(const DolphinQuery& query) if (query.hasContentSearch()) { m_contentButton->setChecked(true); - } else if (query.hasFileName()) { + } else if (query.hasFileName()) { m_fileNameButton->setChecked(true); } m_facetsWidget->resetSearchTerms(); m_facetsWidget->setFacetType(query.type()); const QStringList searchTerms = query.searchTerms(); - for (const QString& searchTerm : searchTerms) { + for (const QString &searchTerm : searchTerms) { m_facetsWidget->setSearchTerm(searchTerm); } @@ -548,10 +541,12 @@ void DolphinSearchBox::updateFacetsVisible() bool DolphinSearchBox::isIndexingEnabled() const { -#ifdef HAVE_BALOO +#if HAVE_BALOO const Baloo::IndexerConfig searchInfo; return searchInfo.fileIndexingEnabled() && !searchPath().isEmpty() && searchInfo.shouldBeIndexed(searchPath().toLocalFile()); #else return false; #endif } + +#include "moc_dolphinsearchbox.cpp"