From: Stephan Sahm Date: Tue, 25 Jan 2022 17:33:01 +0000 (+0000) Subject: Expose konsolepart shortcuts in Dolphin's shortcuts view X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/commitdiff_plain/d71b617205ce152dedc5d3a5b5b801697741f8eb?hp=94262a1c02606279b03e40f2cb3ebc985ff69a08 Expose konsolepart shortcuts in Dolphin's shortcuts view Adapt some changes from Yakuake https://invent.kde.org/utilities/yakuake/-/commit/a0b08cb1f71ef18449bfbf5852c01e323604142f credit to Stephan Sahm @schlichtanders BUG: 428265 --- diff --git a/src/dolphinmainwindow.cpp b/src/dolphinmainwindow.cpp index ef671e820..ff3cfa3bf 100644 --- a/src/dolphinmainwindow.cpp +++ b/src/dolphinmainwindow.cpp @@ -53,6 +53,7 @@ #include #include #include +#include #include #include #include @@ -170,7 +171,7 @@ DolphinMainWindow::DolphinMainWindow() : setupDockWidgets(); - setupGUI(Keys | Save | Create | ToolBar); + setupGUI(Save | Create | ToolBar); stateChanged(QStringLiteral("new_file")); QClipboard* clipboard = QApplication::clipboard(); @@ -1372,6 +1373,19 @@ void DolphinMainWindow::slotStorageTearDownExternallyRequested(const QString& mo } } +void DolphinMainWindow::slotKeyBindings() +{ + KShortcutsDialog dialog(KShortcutsEditor::AllActions, KShortcutsEditor::LetterShortcutsAllowed, this); + dialog.addCollection(actionCollection()); + if (m_terminalPanel) { + KActionCollection *konsolePartActionCollection = m_terminalPanel->actionCollection(); + if (konsolePartActionCollection) { + dialog.addCollection(konsolePartActionCollection, QStringLiteral("KonsolePart")); + } + } + dialog.configure(); +} + void DolphinMainWindow::setViewsToHomeIfMountPathOpen(const QString& mountPath) { const QVector theViewContainers = viewContainers(); @@ -1709,6 +1723,7 @@ void DolphinMainWindow::setupActions() "contain mostly the same commands and configuration options.")); connect(showMenuBar, &KToggleAction::triggered, // Fixes #286822 this, &DolphinMainWindow::toggleShowMenuBar, Qt::QueuedConnection); + KStandardAction::keyBindings(this, &DolphinMainWindow::slotKeyBindings, actionCollection()); KStandardAction::preferences(this, &DolphinMainWindow::editSettings, actionCollection()); // setup 'Help' menu for the m_controlButton. The other one is set up in the base class. diff --git a/src/dolphinmainwindow.h b/src/dolphinmainwindow.h index 761766df8..5ada022cb 100644 --- a/src/dolphinmainwindow.h +++ b/src/dolphinmainwindow.h @@ -576,6 +576,12 @@ private Q_SLOTS: * to go to. */ void slotGoForward(QAction* action); + + /** + * Is called when configuring the keyboard shortcuts + */ + void slotKeyBindings(); + private: /** * Sets up the various menus and actions and connects them. diff --git a/src/panels/terminal/terminalpanel.cpp b/src/panels/terminal/terminalpanel.cpp index 9d30dcd62..75bfe93d0 100644 --- a/src/panels/terminal/terminalpanel.cpp +++ b/src/panels/terminal/terminalpanel.cpp @@ -6,6 +6,7 @@ #include "terminalpanel.h" +#include #include #include #include @@ -17,6 +18,8 @@ #include #include #include +#include +#include #include #include @@ -100,6 +103,21 @@ QString TerminalPanel::runningProgramName() const return m_terminal ? m_terminal->foregroundProcessName() : QString(); } +KActionCollection *TerminalPanel::actionCollection() +{ + // m_terminal is the only reference reset to nullptr in case the terminal is + // closed again + if (m_terminal && m_konsolePart && m_terminalWidget) { + const auto guiClients = m_konsolePart->childClients(); + for (auto *client : guiClients) { + if (client->actionCollection()->associatedWidgets().contains(m_terminalWidget)) { + return client->actionCollection(); + } + } + } + return nullptr; +} + bool TerminalPanel::hasProgramRunning() const { return m_terminal && (m_terminal->foregroundProcessId() != -1); @@ -139,6 +157,23 @@ void TerminalPanel::showEvent(QShowEvent* event) m_layout->removeWidget(m_konsolePartMissingMessage); } m_terminal = qobject_cast(m_konsolePart); + + // needed to collect the correct KonsolePart actionCollection + // namely the one of the single inner terminal and not the outer KonsolePart + if (!m_konsolePart->factory() && m_terminalWidget) { + if (!m_konsolePart->clientBuilder()) { + m_konsolePart->setClientBuilder(new KXMLGUIBuilder(m_terminalWidget)); + } + + auto factory = new KXMLGUIFactory(m_konsolePart->clientBuilder(), this); + factory->addClient(m_konsolePart); + + // Prevents the KXMLGui warning about removing the client + connect(m_terminalWidget, &QObject::destroyed, this, [factory, this] { + factory->removeClient(m_konsolePart); + }); + } + } else if (!m_konsolePartMissingMessage) { const auto konsoleInstallUrl = QUrl("appstream://org.kde.konsole.desktop"); const auto konsoleNotInstalledText = i18n("Terminal cannot be shown because Konsole is not installed. " diff --git a/src/panels/terminal/terminalpanel.h b/src/panels/terminal/terminalpanel.h index dc6605da6..5a2b0bb83 100644 --- a/src/panels/terminal/terminalpanel.h +++ b/src/panels/terminal/terminalpanel.h @@ -7,12 +7,13 @@ #ifndef TERMINALPANEL_H #define TERMINALPANEL_H -#include "panels/panel.h" #include "kiofuse_interface.h" +#include "panels/panel.h" #include class TerminalInterface; +class KActionCollection; class KMessageWidget; class QVBoxLayout; class QWidget; @@ -47,6 +48,7 @@ public: bool terminalHasFocus() const; bool hasProgramRunning() const; QString runningProgramName() const; + KActionCollection *actionCollection(); public Q_SLOTS: void terminalExited();