X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/0603e18cd4e36b988196a99810f2e3e803fe3125..2cd3d58eec5695899c26ca66a631fb79867b6584:/src/search/dolphinsearchbox.cpp diff --git a/src/search/dolphinsearchbox.cpp b/src/search/dolphinsearchbox.cpp index 860d9f6cd..dfd733e5d 100644 --- a/src/search/dolphinsearchbox.cpp +++ b/src/search/dolphinsearchbox.cpp @@ -4,21 +4,22 @@ * 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 "config-dolphin.h" +#include #include -#include #include -#include -#ifdef HAVE_BALOO -#include +#include +#if HAVE_BALOO #include +#include #endif #include @@ -27,7 +28,6 @@ #include #include #include -#include #include #include #include @@ -35,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) { } @@ -59,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 @@ -69,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; @@ -131,7 +133,7 @@ QUrl DolphinSearchBox::urlForSearching() const return url; } -void DolphinSearchBox::fromSearchUrl(const QUrl& url) +void DolphinSearchBox::fromSearchUrl(const QUrl &url) { if (DolphinQuery::supportsScheme(url.scheme())) { const DolphinQuery query = DolphinQuery::fromSearchUrl(url); @@ -174,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(); @@ -182,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(); @@ -190,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()) { - Q_EMIT closeRequest(); + emitCloseRequest(); } else { m_searchInput->clear(); } - } - else if (event->key() == Qt::Key_Down) { + } 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: @@ -260,11 +261,12 @@ 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(); } @@ -273,6 +275,10 @@ void DolphinSearchBox::slotSearchTextChanged(const QString& text) void DolphinSearchBox::slotReturnPressed() { + if (m_searchInput->text().isEmpty()) { + return; + } + emitSearchRequest(); Q_EMIT focusViewRequest(); } @@ -293,7 +299,7 @@ void DolphinSearchBox::slotSearchSaved() } } -void DolphinSearchBox::initButton(QToolButton* button) +void DolphinSearchBox::initButton(QToolButton *button) { button->installEventFilter(this); button->setAutoExclusive(true); @@ -330,33 +336,31 @@ void DolphinSearchBox::init() { // 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); + 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(m_searchInput); searchInputLayout->addWidget(closeButton); @@ -370,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); @@ -388,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); @@ -415,10 +424,10 @@ void DolphinSearchBox::init() // 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); + QWidget *optionsContainer = new QWidget(this); // Apply layout for the options - QHBoxLayout* optionsLayout = new QHBoxLayout(optionsContainer); + QHBoxLayout *optionsLayout = new QHBoxLayout(optionsContainer); optionsLayout->setContentsMargins(0, 0, 0, 0); optionsLayout->setSpacing(Dolphin::LAYOUT_SPACING_SMALL); optionsLayout->addWidget(m_fileNameButton); @@ -427,7 +436,9 @@ 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); m_optionsScrollArea = new QScrollArea(this); @@ -440,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); @@ -449,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; @@ -490,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. @@ -503,21 +513,18 @@ void DolphinSearchBox::updateFromQuery(const DolphinQuery& query) setSearchPath(QUrl::fromLocalFile(QDir::homePath())); } - // If the input box has focus, do not update to avoid messing with user typing - if (!m_searchInput->hasFocus()) { - setText(query.text()); - } + setText(query.text()); 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); } @@ -534,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"