diff options
| -rw-r--r-- | src/dolphincontextmenu.cpp | 4 | ||||
| -rw-r--r-- | src/dolphinmainwindow.cpp | 49 | ||||
| -rw-r--r-- | src/dolphinmainwindow.h | 6 | ||||
| -rw-r--r-- | src/dolphinpart.rc | 3 | ||||
| -rw-r--r-- | src/dolphinui.rc | 3 | ||||
| -rw-r--r-- | src/settings/contextmenu/contextmenusettingspage.cpp | 4 | ||||
| -rw-r--r-- | src/settings/dolphinsettingsdialog.cpp | 2 |
7 files changed, 63 insertions, 8 deletions
diff --git a/src/dolphincontextmenu.cpp b/src/dolphincontextmenu.cpp index 65d841060..2568f503f 100644 --- a/src/dolphincontextmenu.cpp +++ b/src/dolphincontextmenu.cpp @@ -445,8 +445,8 @@ void DolphinContextMenu::addAdditionalActions(const KFileItemListProperties &pro addSeparator(); QList<QAction *> additionalActions; - if (props.isDirectory() && props.isLocal() && ContextMenuSettings::showOpenTerminal()) { - additionalActions << m_mainWindow->actionCollection()->action(QStringLiteral("open_terminal")); + if (props.isLocal() && ContextMenuSettings::showOpenTerminal()) { + additionalActions << m_mainWindow->actionCollection()->action(QStringLiteral("open_terminal_here")); } m_fileItemActions->addActionsTo(this, KFileItemActions::MenuActionSource::All, additionalActions); diff --git a/src/dolphinmainwindow.cpp b/src/dolphinmainwindow.cpp index 589c2c185..3e9d463d2 100644 --- a/src/dolphinmainwindow.cpp +++ b/src/dolphinmainwindow.cpp @@ -1087,8 +1087,45 @@ void DolphinMainWindow::openPreferredSearchTool() void DolphinMainWindow::openTerminal() { - const QUrl url = m_activeViewContainer->url(); + openTerminalJob(m_activeViewContainer->url()); +} + +void DolphinMainWindow::openTerminalHere() +{ + QList<QUrl> urls = {}; + + for (const KFileItem& item : m_activeViewContainer->view()->selectedItems()) { + QUrl url = item.url(); + if (item.isFile()) { + url.setPath(QFileInfo(url.path()).absolutePath()); + } + if (!urls.contains(url)) { + urls << url; + } + } + + // No items are selected. Open a terminal window for the current location. + if (urls.count() == 0) { + openTerminal(); + return; + } + if (urls.count() > 5) { + QString question = i18np("Are you sure you want to open 1 terminal window?", + "Are you sure you want to open %1 terminal windows?", urls.count()); + const int answer = KMessageBox::warningYesNo(this, question); + if (answer != KMessageBox::Yes) { + return; + } + } + + for (const QUrl& url : urls) { + openTerminalJob(url); + } +} + +void DolphinMainWindow::openTerminalJob(const QUrl& url) +{ if (url.isLocalFile()) { auto job = new KTerminalLauncherJob(QString()); job->setWorkingDirectory(url.toLocalFile()); @@ -1721,6 +1758,16 @@ void DolphinMainWindow::setupActions() actionCollection()->setDefaultShortcut(openTerminal, Qt::SHIFT | Qt::Key_F4); connect(openTerminal, &QAction::triggered, this, &DolphinMainWindow::openTerminal); + QAction* openTerminalHere = actionCollection()->addAction(QStringLiteral("open_terminal_here")); + // i18n: "Here" refers to the location(s) of the currently selected item(s) or the currently viewed location if nothing is selected. + openTerminalHere->setText(i18nc("@action:inmenu Tools", "Open Terminal Here")); + openTerminalHere->setWhatsThis(xi18nc("@info:whatsthis", + "<para>This opens <emphasis>terminal</emphasis> applications for the selected items' locations.</para>" + "<para>To learn more about terminals use the help in the terminal application.</para>")); + openTerminalHere->setIcon(QIcon::fromTheme(QStringLiteral("utilities-terminal"))); + actionCollection()->setDefaultShortcut(openTerminalHere, Qt::SHIFT | Qt::ALT | Qt::Key_F4); + connect(openTerminalHere, &QAction::triggered, this, &DolphinMainWindow::openTerminalHere); + #ifdef HAVE_TERMINAL QAction* focusTerminalPanel = actionCollection()->addAction(QStringLiteral("focus_terminal_panel")); focusTerminalPanel->setText(i18nc("@action:inmenu Tools", "Focus Terminal Panel")); diff --git a/src/dolphinmainwindow.h b/src/dolphinmainwindow.h index 17327f2de..6e775c5cc 100644 --- a/src/dolphinmainwindow.h +++ b/src/dolphinmainwindow.h @@ -399,6 +399,12 @@ private Q_SLOTS: /** Opens a terminal window for the current location. */ void openTerminal(); + /** Opens terminal windows for the selected items' locations. */ + void openTerminalHere(); + + /** Opens a terminal window for the URL. */ + void openTerminalJob(const QUrl& url); + /** Focus a Terminal Panel. */ void focusTerminalPanel(); diff --git a/src/dolphinpart.rc b/src/dolphinpart.rc index a65cf685e..d13f4aaed 100644 --- a/src/dolphinpart.rc +++ b/src/dolphinpart.rc @@ -1,6 +1,6 @@ <?xml version="1.0"?> <!DOCTYPE gui SYSTEM "kpartgui.dtd"> -<gui name="dolphinpart" version="15" translationDomain="dolphin"> +<gui name="dolphinpart" version="16" translationDomain="dolphin"> <MenuBar> <Menu name="edit"><text>&Edit</text> <Action name="new_menu"/> @@ -40,6 +40,7 @@ </Menu> <Menu name="tools"><text context="@title:menu">Tools</text> <Action name="open_terminal"/> + <Action name="open_terminal_here"/> <Action name="focus_terminal_panel"/> <Action name="find_file" /> <Action name="show_filter_bar" /> diff --git a/src/dolphinui.rc b/src/dolphinui.rc index 1b7f2e8b1..b6afe2abb 100644 --- a/src/dolphinui.rc +++ b/src/dolphinui.rc @@ -1,6 +1,6 @@ <?xml version="1.0"?> <!DOCTYPE gui SYSTEM "kpartgui.dtd"> -<gui name="dolphin" version="35"> +<gui name="dolphin" version="36"> <MenuBar> <Menu name="file"> <Action name="new_menu" /> @@ -69,6 +69,7 @@ <Menu name="tools"> <Action name="open_preferred_search_tool" /> <Action name="open_terminal" /> + <Action name="open_terminal_here" /> <Action name="focus_terminal_panel"/> <Action name="compare_files" /> <Action name="change_remote_encoding" /> diff --git a/src/settings/contextmenu/contextmenusettingspage.cpp b/src/settings/contextmenu/contextmenusettingspage.cpp index cec1f9649..97bb39ff0 100644 --- a/src/settings/contextmenu/contextmenusettingspage.cpp +++ b/src/settings/contextmenu/contextmenusettingspage.cpp @@ -127,7 +127,7 @@ bool ContextMenuSettingsPage::entryVisible(const QString& id) return ContextMenuSettings::showCopyLocation(); } else if (id == "duplicate") { return ContextMenuSettings::showDuplicateHere(); - } else if (id == "open_terminal") { + } else if (id == "open_terminal_here") { return ContextMenuSettings::showOpenTerminal(); } return false; @@ -149,7 +149,7 @@ void ContextMenuSettingsPage::setEntryVisible(const QString& id, bool visible) ContextMenuSettings::setShowCopyLocation(visible); } else if (id == "duplicate") { ContextMenuSettings::setShowDuplicateHere(visible); - } else if (id == "open_terminal") { + } else if (id == "open_terminal_here") { ContextMenuSettings::setShowOpenTerminal(visible); } } diff --git a/src/settings/dolphinsettingsdialog.cpp b/src/settings/dolphinsettingsdialog.cpp index d699ef894..bd4c5fb02 100644 --- a/src/settings/dolphinsettingsdialog.cpp +++ b/src/settings/dolphinsettingsdialog.cpp @@ -86,7 +86,7 @@ DolphinSettingsDialog::DolphinSettingsDialog(const QUrl& url, QWidget* parent, K QStringLiteral("open_in_new_window"), QStringLiteral("copy_location"), QStringLiteral("duplicate"), - QStringLiteral("open_terminal"), + QStringLiteral("open_terminal_here") }); KPageWidgetItem* contextMenuSettingsFrame = addPage(contextMenuSettingsPage, i18nc("@title:group", "Context Menu")); |
