diff --git a/doc/index.docbook b/doc/index.docbook
--- a/doc/index.docbook
+++ b/doc/index.docbook
@@ -2015,6 +2015,17 @@
Opens &konsole; within the current folder.
+
+
+
+&Ctrl;&Shift;F
+
+Tools
+Open Preferred Search Tool
+
+Opens preferred search tool in the current folder.
+
+
Tools
diff --git a/src/dolphinmainwindow.h b/src/dolphinmainwindow.h
--- a/src/dolphinmainwindow.h
+++ b/src/dolphinmainwindow.h
@@ -30,6 +30,7 @@
#include
#include
+#include
#include
#include
#include
@@ -351,6 +352,15 @@
*/
void toggleShowMenuBar();
+ /** Sets up updates for "Open Preferred Search Tool" action. */
+ void setupUpdateOpenPreferredSearchToolAction();
+
+ /** Updates "Open Preferred Search Tool" action. */
+ void updateOpenPreferredSearchToolAction();
+
+ /** Opens preferred search tool for the current location. */
+ void openPreferredSearchTool();
+
/** Opens a terminal window for the current location. */
void openTerminal();
@@ -566,6 +576,17 @@
/** Adds "What's This?" texts to many widgets and StandardActions. */
void setupWhatsThis();
+ /**
+ * Returns local path for the active container URL.
+ * If the given directory is not local, it can still be the URL of an
+ * ioslave using UDS_LOCAL_PATH which to be converted first.
+ * Return user's home path if unsuccessful.
+ */
+ QString localPath();
+
+ /** Returns preferred search tool as configured in "More Search Tools" menu. */
+ QPointer preferredSearchTool();
+
private:
/**
* Implements a custom error handling for the undo manager. This
@@ -599,6 +620,9 @@
TerminalPanel* m_terminalPanel;
PlacesPanel* m_placesPanel;
bool m_tearDownFromPlacesRequested;
+
+ QMenu m_searchTools;
+
};
inline DolphinViewContainer* DolphinMainWindow::activeViewContainer() const
diff --git a/src/dolphinmainwindow.cpp b/src/dolphinmainwindow.cpp
--- a/src/dolphinmainwindow.cpp
+++ b/src/dolphinmainwindow.cpp
@@ -57,6 +57,7 @@
#include
#include
#include
+#include
#include
#include
#include
@@ -187,6 +188,8 @@
toolBar()->installEventFilter(middleClickEventFilter);
setupWhatsThis();
+
+ QTimer::singleShot(0, this, &DolphinMainWindow::setupUpdateOpenPreferredSearchToolAction);
}
DolphinMainWindow::~DolphinMainWindow()
@@ -872,23 +875,81 @@
}
}
-void DolphinMainWindow::openTerminal()
+QString DolphinMainWindow::localPath()
{
- QString dir(QDir::homePath());
-
- // If the given directory is not local, it can still be the URL of an
- // ioslave using UDS_LOCAL_PATH which to be converted first.
KIO::StatJob* statJob = KIO::mostLocalUrl(m_activeViewContainer->url());
KJobWidgets::setWindow(statJob, this);
statJob->exec();
QUrl url = statJob->mostLocalUrl();
-
- //If the URL is local after the above conversion, set the directory.
if (url.isLocalFile()) {
- dir = url.toLocalFile();
+ return url.toLocalFile();
}
+ return QDir::homePath();
+}
- KToolInvocation::invokeTerminal(QString(), dir);
+QPointer DolphinMainWindow::preferredSearchTool()
+{
+ m_searchTools.clear();
+ KMoreToolsMenuFactory("dolphin/search-tools").fillMenuFromGroupingNames(
+ &m_searchTools, { "files-find" }, QUrl(localPath())
+ );
+ QList actions = m_searchTools.actions();
+ if (actions.isEmpty()) {
+ return nullptr;
+ }
+ QAction* action = actions.first();
+ if (action->isSeparator()) {
+ return nullptr;
+ }
+ return action;
+}
+
+void DolphinMainWindow::setupUpdateOpenPreferredSearchToolAction()
+{
+ QAction* openPreferredSearchTool = actionCollection()->action(QStringLiteral("open_preferred_search_tool"));
+ for (QWidget* widget : openPreferredSearchTool->associatedWidgets()) {
+ QMenu* menu = dynamic_cast(widget);
+ if (menu) {
+ connect(menu, &QMenu::aboutToShow, this, &DolphinMainWindow::updateOpenPreferredSearchToolAction);
+ }
+ }
+ connect(
+ actionCollection()->action(KStandardAction::name(KStandardAction::KeyBindings)), &QAction::hovered,
+ this, &DolphinMainWindow::updateOpenPreferredSearchToolAction
+ );
+ updateOpenPreferredSearchToolAction();
+}
+
+void DolphinMainWindow::updateOpenPreferredSearchToolAction()
+{
+ QAction* openPreferredSearchTool = actionCollection()->action(QStringLiteral("open_preferred_search_tool"));
+ if (!openPreferredSearchTool) {
+ return;
+ }
+ QPointer tool = preferredSearchTool();
+ if (tool) {
+ openPreferredSearchTool->setVisible(true);
+ openPreferredSearchTool->setText(i18nc("@action:inmenu Tools", "Open %1", tool->text()));
+ openPreferredSearchTool->setIcon(tool->icon());
+ } else {
+ openPreferredSearchTool->setVisible(false);
+ // still visible in Shortcuts configuration window
+ openPreferredSearchTool->setText(i18nc("@action:inmenu Tools", "Open Preferred Search Tool"));
+ openPreferredSearchTool->setIcon(QIcon::fromTheme(QStringLiteral("search")));
+ }
+}
+
+void DolphinMainWindow::openPreferredSearchTool()
+{
+ QPointer tool = preferredSearchTool();
+ if (tool) {
+ tool->trigger();
+ }
+}
+
+void DolphinMainWindow::openTerminal()
+{
+ KToolInvocation::invokeTerminal(QString(), localPath());
}
void DolphinMainWindow::editSettings()
@@ -1063,9 +1124,11 @@
QMenu* toolsMenu = new QMenu(i18nc("@action:inmenu", "Tools"), menu);
toolsMenu->addAction(ac->action(QStringLiteral("show_filter_bar")));
toolsMenu->addAction(ac->action(QStringLiteral("compare_files")));
+ toolsMenu->addAction(ac->action(QStringLiteral("open_preferred_search_tool")));
toolsMenu->addAction(ac->action(QStringLiteral("open_terminal")));
toolsMenu->addAction(ac->action(QStringLiteral("change_remote_encoding")));
menu->addMenu(toolsMenu);
+ connect(toolsMenu, &QMenu::aboutToShow, this, &DolphinMainWindow::updateOpenPreferredSearchToolAction);
// Add "Settings" menu entries
addActionToMenu(ac->action(KStandardAction::name(KStandardAction::KeyBindings)), menu);
@@ -1400,6 +1463,15 @@
compareFiles->setEnabled(false);
connect(compareFiles, &QAction::triggered, this, &DolphinMainWindow::compareFiles);
+ QAction* openPreferredSearchTool = actionCollection()->addAction(QStringLiteral("open_preferred_search_tool"));
+ openPreferredSearchTool->setText(i18nc("@action:inmenu Tools", "Open Preferred Search Tool"));
+ openPreferredSearchTool->setWhatsThis(xi18nc("@info:whatsthis",
+ "This opens a preferred search tool for the viewed location."
+ "Use More Search Tools menu to configure it."));
+ openPreferredSearchTool->setIcon(QIcon::fromTheme(QStringLiteral("search")));
+ actionCollection()->setDefaultShortcut(openPreferredSearchTool, Qt::CTRL + Qt::SHIFT + Qt::Key_F);
+ connect(openPreferredSearchTool, &QAction::triggered, this, &DolphinMainWindow::openPreferredSearchTool);
+
#ifdef HAVE_TERMINAL
if (KAuthorized::authorize(QStringLiteral("shell_access"))) {
QAction* openTerminal = actionCollection()->addAction(QStringLiteral("open_terminal"));
@@ -2123,6 +2195,8 @@
QWhatsThisClickedEvent* whatsThisEvent = dynamic_cast(event);
QDesktopServices::openUrl(QUrl(whatsThisEvent->href()));
return true;
+ } else if (event->type() == QEvent::WindowActivate) {
+ updateOpenPreferredSearchToolAction();
}
return KXmlGuiWindow::event(event);
}
diff --git a/src/dolphinpart.h b/src/dolphinpart.h
--- a/src/dolphinpart.h
+++ b/src/dolphinpart.h
@@ -194,7 +194,7 @@
void slotOpenTerminal();
/**
- * Open KFind with the current path.
+ * Open preferred search tool in the current directory to find files.
*/
void slotFindFile();
@@ -234,6 +234,8 @@
void openSelectionDialog(const QString& title, const QString& text,
bool selectItems);
+ QString localPath();
+
private:
DolphinView* m_view;
DolphinViewActionHandler* m_actionHandler;
diff --git a/src/dolphinpart.cpp b/src/dolphinpart.cpp
--- a/src/dolphinpart.cpp
+++ b/src/dolphinpart.cpp
@@ -40,6 +40,7 @@
#include
#include
#include
+#include
#include
#include
#include
@@ -530,30 +531,34 @@
// TODO save/restore name filter in saveState/restoreState like KonqDirPart did in kde3?
}
-void DolphinPart::slotOpenTerminal()
-{
- QString dir(QDir::homePath());
-
- QUrl u(url());
-
- // If the given directory is not local, it can still be the URL of an
- // ioslave using UDS_LOCAL_PATH which to be converted first.
- KIO::StatJob* statJob = KIO::mostLocalUrl(u);
+QString DolphinPart::localPath() {
+ KIO::StatJob* statJob = KIO::mostLocalUrl(url());
KJobWidgets::setWindow(statJob, widget());
statJob->exec();
- u = statJob->mostLocalUrl();
-
- //If the URL is local after the above conversion, set the directory.
- if (u.isLocalFile()) {
- dir = u.toLocalFile();
+ QUrl url = statJob->mostLocalUrl();
+ if (url.isLocalFile()) {
+ return url.toLocalFile();
}
+ return QDir::homePath();
+}
- KToolInvocation::invokeTerminal(QString(), dir);
+void DolphinPart::slotOpenTerminal()
+{
+ KToolInvocation::invokeTerminal(QString(), localPath());
}
void DolphinPart::slotFindFile()
{
- KRun::run(QStringLiteral("kfind"), {url()}, widget());
+ QMenu searchTools;
+ KMoreToolsMenuFactory("dolphin/search-tools").fillMenuFromGroupingNames(
+ &searchTools, { "files-find" }, QUrl(localPath())
+ );
+ QList actions = searchTools.actions();
+ if (!(actions.isEmpty())) {
+ actions.first()->trigger();
+ } else {
+ KRun::run(QStringLiteral("kfind"), {url()}, widget());
+ }
}
void DolphinPart::updateNewMenu()
diff --git a/src/dolphinui.rc b/src/dolphinui.rc
--- a/src/dolphinui.rc
+++ b/src/dolphinui.rc
@@ -1,5 +1,5 @@
-
+