X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/a058c64eba30f11bfa87ac097371c04437d0471e..ed2d352c42a6d517d4f29b3582c0e00aa34fe647:/src/search/dolphinsearchbox.cpp diff --git a/src/search/dolphinsearchbox.cpp b/src/search/dolphinsearchbox.cpp index cdc0718df..9df417c4f 100644 --- a/src/search/dolphinsearchbox.cpp +++ b/src/search/dolphinsearchbox.cpp @@ -1,37 +1,24 @@ -/*************************************************************************** -* 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 +#if HAVE_BALOO #include +#include #endif #include @@ -40,7 +27,6 @@ #include #include #include -#include #include #include #include @@ -48,22 +34,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,7 +58,7 @@ DolphinSearchBox::~DolphinSearchBox() saveSettings(); } -void DolphinSearchBox::setText(const QString& text) +void DolphinSearchBox::setText(const QString &text) { m_searchInput->setText(text); } @@ -82,7 +68,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 +130,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 +163,7 @@ void DolphinSearchBox::setActive(bool active) m_active = active; if (active) { - emit activated(); + Q_EMIT activated(); } } } @@ -187,7 +173,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 +181,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 +189,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(); + Q_EMIT closeRequest(); } 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 +239,7 @@ void DolphinSearchBox::emitSearchRequest() m_startSearchTimer->stop(); m_startedSearching = true; m_saveSearchAction->setEnabled(true); - emit searchRequest(); + Q_EMIT searchRequest(); } void DolphinSearchBox::emitCloseRequest() @@ -262,7 +247,7 @@ void DolphinSearchBox::emitCloseRequest() m_startSearchTimer->stop(); m_startedSearching = false; m_saveSearchAction->setEnabled(false); - emit closeRequest(); + Q_EMIT closeRequest(); } void DolphinSearchBox::slotConfigurationChanged() @@ -273,43 +258,39 @@ void DolphinSearchBox::slotConfigurationChanged() } } -void DolphinSearchBox::slotSearchTextChanged(const QString& text) +void DolphinSearchBox::slotSearchTextChanged(const QString &text) { - if (text.isEmpty()) { m_startSearchTimer->stop(); } else { m_startSearchTimer->start(); } - emit searchTextChanged(text); + Q_EMIT searchTextChanged(text); } void DolphinSearchBox::slotReturnPressed() { 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 +325,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 +365,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,7 +383,7 @@ 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); @@ -415,12 +394,11 @@ void DolphinSearchBox::init() moreSearchToolsButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); moreSearchToolsButton->setText(i18n("More Search Tools")); moreSearchToolsButton->setMenu(new QMenu(this)); - connect(moreSearchToolsButton->menu(), &QMenu::aboutToShow, moreSearchToolsButton->menu(), [this, moreSearchToolsButton]() - { + 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); - } ); + m_menuFactory->fillMenuFromGroupingNames(moreSearchToolsButton->menu(), {"files-find"}, this->m_searchPath); + }); // Create "Facets" widget m_facetsWidget = new DolphinFacetsWidget(this); @@ -429,8 +407,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); @@ -442,11 +424,6 @@ void DolphinSearchBox::init() optionsLayout->addWidget(moreSearchToolsButton); 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 +434,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); @@ -473,15 +450,14 @@ void DolphinSearchBox::init() 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 +483,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. @@ -520,18 +496,21 @@ void DolphinSearchBox::updateFromQuery(const DolphinQuery& query) setSearchPath(QUrl::fromLocalFile(QDir::homePath())); } - setText(query.text()); + // If the input box has focus, do not update to avoid messing with user typing + if (!m_searchInput->hasFocus()) { + 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); } @@ -548,10 +527,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"