Expose konsolepart shortcuts in Dolphin's shortcuts view

Adapt some changes from Yakuake a0b08cb1f7

credit to Stephan Sahm @schlichtanders

BUG: 428265
This commit is contained in:
Stephan Sahm 2022-01-25 17:33:01 +00:00 committed by Méven Car
parent 94262a1c02
commit d71b617205
4 changed files with 60 additions and 2 deletions

View 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.

View 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.

View 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. "

View 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();