X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/47a5071fc9eace09cdc9e4e89eacda06fb893194..3bf471e0:/src/panels/terminal/terminalpanel.cpp diff --git a/src/panels/terminal/terminalpanel.cpp b/src/panels/terminal/terminalpanel.cpp index f6eb2f28f..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 @@ -15,10 +16,10 @@ #include #include #include -#include #include -#include #include +#include +#include #include #include @@ -68,7 +69,7 @@ QString TerminalPanel::currentWorkingDirectory() void TerminalPanel::terminalExited() { m_terminal = nullptr; - emit hideTerminalPanel(); + Q_EMIT hideTerminalPanel(); } bool TerminalPanel::isHiddenInVisibleWindow() const @@ -102,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); @@ -130,11 +146,7 @@ void TerminalPanel::showEvent(QShowEvent* event) if (!m_terminal) { m_clearTerminal = true; - KPluginFactory* factory = nullptr; - KService::Ptr service = KService::serviceByDesktopName(QStringLiteral("konsolepart")); - if (service) { - factory = KPluginLoader(service->library()).factory(); - } + KPluginFactory *factory = KPluginFactory::loadFactory(KPluginMetaData(QStringLiteral("konsolepart"))).plugin; m_konsolePart = factory ? (factory->create(this)) : nullptr; if (m_konsolePart) { connect(m_konsolePart, &KParts::ReadOnlyPart::destroyed, this, &TerminalPanel::terminalExited); @@ -145,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. " @@ -286,7 +315,7 @@ void TerminalPanel::slotKonsolePartCurrentDirectoryChanged(const QString& dir) KMountPoint::Ptr mountPoint = KMountPoint::currentMountPoints().findByPath(m_konsolePartCurrentDirectory); if (mountPoint && mountPoint->mountType() != QStringLiteral("fuse.kio-fuse")) { // Not in KIOFUse mount, so just switch to the corresponding URL. - emit changeUrl(url); + Q_EMIT changeUrl(url); return; } @@ -296,11 +325,11 @@ void TerminalPanel::slotKonsolePartCurrentDirectoryChanged(const QString& dir) watcher->deleteLater(); if (reply.isError()) { // KIOFuse errored out... just show the normal URL - emit changeUrl(url); + Q_EMIT changeUrl(url); } else { // Our location happens to be in a KIOFuse mount and is mounted. // Let's change the DolphinView to point to the remote URL equivalent. - emit changeUrl(QUrl::fromUserInput(reply.value())); + Q_EMIT changeUrl(QUrl::fromUserInput(reply.value())); } }); }