* 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 <KIO/ApplicationLauncherJob>
#include <KLocalizedString>
-#include <KNS3/KMoreToolsMenuFactory>
#include <KSeparator>
-#include <config-baloo.h>
-#ifdef HAVE_BALOO
-#include <Baloo/Query>
+#include <KService>
+#if HAVE_BALOO
#include <Baloo/IndexerConfig>
+#include <Baloo/Query>
#endif
#include <QButtonGroup>
#include <QHBoxLayout>
#include <QIcon>
#include <QKeyEvent>
-#include <QLabel>
#include <QLineEdit>
#include <QScrollArea>
#include <QShowEvent>
#include <QToolButton>
#include <QUrlQuery>
-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)
{
}
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
return m_searchInput->text();
}
-void DolphinSearchBox::setSearchPath(const QUrl& url)
+void DolphinSearchBox::setSearchPath(const QUrl &url)
{
if (url == m_searchPath) {
return;
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);
return m_active;
}
-bool DolphinSearchBox::event(QEvent* event)
+bool DolphinSearchBox::event(QEvent *event)
{
if (event->type() == QEvent::Polish) {
init();
return QWidget::event(event);
}
-void DolphinSearchBox::showEvent(QShowEvent* event)
+void DolphinSearchBox::showEvent(QShowEvent *event)
{
if (!event->spontaneous()) {
m_searchInput->setFocus();
}
}
-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:
}
}
-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();
}
void DolphinSearchBox::slotReturnPressed()
{
+ if (m_searchInput->text().isEmpty()) {
+ return;
+ }
+
emitSearchRequest();
Q_EMIT focusViewRequest();
}
}
}
-void DolphinSearchBox::initButton(QToolButton* button)
+void DolphinSearchBox::initButton(QToolButton *button)
{
button->installEventFilter(this);
button->setAutoExclusive(true);
{
// 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);
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);
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);
// 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);
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);
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);
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;
#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.
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);
}
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"