]> cloud.milkyroute.net Git - dolphin.git/commitdiff
Expose konsolepart shortcuts in Dolphin's shortcuts view
authorStephan Sahm <stephan.sahm@gmx.de>
Tue, 25 Jan 2022 17:33:01 +0000 (17:33 +0000)
committerMéven Car <meven29@gmail.com>
Tue, 25 Jan 2022 17:33:01 +0000 (17:33 +0000)
Adapt some changes from Yakuake https://invent.kde.org/utilities/yakuake/-/commit/a0b08cb1f71ef18449bfbf5852c01e323604142f

credit to Stephan Sahm @schlichtanders

BUG: 428265

src/dolphinmainwindow.cpp
src/dolphinmainwindow.h
src/panels/terminal/terminalpanel.cpp
src/panels/terminal/terminalpanel.h

index ef671e8207bd4490b2ca815ee040e85c59f60e9a..ff3cfa3bfbbbe9152c145afd762225eb8c063e8c 100644 (file)
@@ -53,6 +53,7 @@
 #include <KProtocolInfo>
 #include <KProtocolManager>
 #include <KShell>
+#include <KShortcutsDialog>
 #include <KStandardAction>
 #include <KStartupInfo>
 #include <KSycoca>
@@ -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<DolphinViewContainer*> 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.
index 761766df8562080400d5a185fb7f18ddae6044a5..5ada022cbdec511cb195d0f03a9a51fa30ca6e23 100644 (file)
@@ -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.
index 9d30dcd62be640c4e6acbebf01f944ec2a3f7f5a..75bfe93d011583949b39753a9d4d7e3a798cf7bf 100644 (file)
@@ -6,6 +6,7 @@
 
 #include "terminalpanel.h"
 
+#include <KActionCollection>
 #include <KIO/DesktopExecParser>
 #include <KIO/Job>
 #include <KIO/JobUiDelegate>
@@ -17,6 +18,8 @@
 #include <KPluginFactory>
 #include <KProtocolInfo>
 #include <KShell>
+#include <KXMLGUIBuilder>
+#include <KXMLGUIFactory>
 #include <kde_terminal_interface.h>
 
 #include <QAction>
@@ -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<TerminalInterface*>(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. "
index dc6605da6bd03695bf7281a4d16d00c16825265a..5a2b0bb839bb61be80f7517c958e0edc108a166f 100644 (file)
@@ -7,12 +7,13 @@
 #ifndef TERMINALPANEL_H
 #define TERMINALPANEL_H
 
-#include "panels/panel.h"
 #include "kiofuse_interface.h"
+#include "panels/panel.h"
 
 #include <QQueue>
 
 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();