┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorStephan Sahm <[email protected]>2022-01-25 17:33:01 +0000
committerMéven Car <[email protected]>2022-01-25 17:33:01 +0000
commitd71b617205ce152dedc5d3a5b5b801697741f8eb (patch)
tree624e6d84dce4c12d732172747160ed68913ddabf /src
parent94262a1c02606279b03e40f2cb3ebc985ff69a08 (diff)
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
Diffstat (limited to 'src')
-rw-r--r--src/dolphinmainwindow.cpp17
-rw-r--r--src/dolphinmainwindow.h6
-rw-r--r--src/panels/terminal/terminalpanel.cpp35
-rw-r--r--src/panels/terminal/terminalpanel.h4
4 files changed, 60 insertions, 2 deletions
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 <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.
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 <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. "
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 <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();