#include <KProtocolInfo>
#include <KProtocolManager>
#include <KShell>
+#include <KShortcutsDialog>
#include <KStandardAction>
#include <KStartupInfo>
#include <KSycoca>
setupDockWidgets();
- setupGUI(Keys | Save | Create | ToolBar);
+ setupGUI(Save | Create | ToolBar);
stateChanged(QStringLiteral("new_file"));
QClipboard* clipboard = QApplication::clipboard();
}
}
+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();
"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.
* 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.
#include "terminalpanel.h"
+#include <KActionCollection>
#include <KIO/DesktopExecParser>
#include <KIO/Job>
#include <KIO/JobUiDelegate>
#include <KPluginFactory>
#include <KProtocolInfo>
#include <KShell>
+#include <KXMLGUIBuilder>
+#include <KXMLGUIFactory>
#include <kde_terminal_interface.h>
#include <QAction>
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);
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. "
#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;
bool terminalHasFocus() const;
bool hasProgramRunning() const;
QString runningProgramName() const;
+ KActionCollection *actionCollection();
public Q_SLOTS:
void terminalExited();