]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/dolphinmainwindow.cpp
Port to KTerminalLauncherJob
[dolphin.git] / src / dolphinmainwindow.cpp
index 737856b23dd00e115ec82b6b71ea2e66397d5569..f3a5e3b4e89539fbc3d720b3f1874d7926701e65 100644 (file)
 #include <KStandardAction>
 #include <KStartupInfo>
 #include <KSycoca>
+#include <KTerminalLauncherJob>
 #include <KToggleAction>
 #include <KToolBar>
 #include <KToolBarPopupAction>
-#include <KToolInvocation>
 #include <KUrlComboBox>
 #include <KUrlNavigator>
 #include <KWindowSystem>
 #include <KXMLGUIFactory>
 
+#include <kio_version.h>
+
 #include <QApplication>
 #include <QClipboard>
 #include <QCloseEvent>
@@ -207,6 +209,11 @@ DolphinMainWindow::DolphinMainWindow() :
     connect(KSycoca::self(), QOverload<>::of(&KSycoca::databaseChanged), this, &DolphinMainWindow::updateOpenPreferredSearchToolAction);
 
     QTimer::singleShot(0, this, &DolphinMainWindow::updateOpenPreferredSearchToolAction);
+
+    m_fileItemActions.setParentWidget(this);
+    connect(&m_fileItemActions, &KFileItemActions::error, this, [this](const QString &errorMessage) {
+        showErrorMessage(errorMessage);
+    });
 }
 
 DolphinMainWindow::~DolphinMainWindow()
@@ -230,20 +237,6 @@ QVector<DolphinViewContainer*> DolphinMainWindow::viewContainers() const
     return viewContainers;
 }
 
-void DolphinMainWindow::setViewsWithInvalidPathsToHome()
-{
-    const QVector<DolphinViewContainer*> theViewContainers = viewContainers();
-    for (DolphinViewContainer *viewContainer : theViewContainers) {
-
-        // Only consider local dirs, not remote locations and abstract protocols
-        if (viewContainer->url().isLocalFile()) {
-            if (!QFileInfo::exists(viewContainer->url().toLocalFile())) {
-                viewContainer->setUrl(QUrl::fromLocalFile(QDir::homePath()));
-            }
-        }
-    }
-}
-
 void DolphinMainWindow::openDirectories(const QList<QUrl>& dirs, bool splitView)
 {
     m_tabWidget->openDirectories(dirs, splitView);
@@ -1040,7 +1033,9 @@ void DolphinMainWindow::openTerminal()
     const QUrl url = m_activeViewContainer->url();
 
     if (url.isLocalFile()) {
-        KToolInvocation::invokeTerminal(QString(), {}, url.toLocalFile());
+        auto job = new KTerminalLauncherJob(QString());
+        job->setWorkingDirectory(url.toLocalFile());
+        job->start();
         return;
     }
 
@@ -1054,14 +1049,18 @@ void DolphinMainWindow::openTerminal()
                 statUrl = job->mostLocalUrl();
             }
 
-            KToolInvocation::invokeTerminal(QString(), {}, statUrl.isLocalFile() ? statUrl.toLocalFile() : QDir::homePath());
+            auto job = new KTerminalLauncherJob(QString());
+            job->setWorkingDirectory(statUrl.isLocalFile() ? statUrl.toLocalFile() : QDir::homePath());
+            job->start();
         });
 
         return;
     }
 
     // Nothing worked, just use $HOME
-    KToolInvocation::invokeTerminal(QString(), {}, QDir::homePath());
+    auto job = new KTerminalLauncherJob(QString());
+    job->setWorkingDirectory(QDir::homePath());
+    job->start();
 }
 
 void DolphinMainWindow::editSettings()
@@ -1125,7 +1124,7 @@ void DolphinMainWindow::openContextMenu(const QPoint& pos,
                                         const QUrl& url,
                                         const QList<QAction*>& customActions)
 {
-    QPointer<DolphinContextMenu> contextMenu = new DolphinContextMenu(this, pos, item, url);
+    QPointer<DolphinContextMenu> contextMenu = new DolphinContextMenu(this, pos, item, url, &m_fileItemActions);
     contextMenu.data()->setCustomActions(customActions);
     const DolphinContextMenu::Command command = contextMenu.data()->open();
 
@@ -1371,7 +1370,7 @@ void DolphinMainWindow::setupActions()
     QMenu* menu = m_newFileMenu->menu();
     menu->setTitle(i18nc("@title:menu Create new folder, file, link, etc.", "Create New"));
     menu->setIcon(QIcon::fromTheme(QStringLiteral("list-add")));
-    m_newFileMenu->setDelayed(false);
+    m_newFileMenu->setPopupMode(QToolButton::InstantPopup);
     connect(menu, &QMenu::aboutToShow,
             this, &DolphinMainWindow::updateNewMenu);
 
@@ -1534,7 +1533,8 @@ void DolphinMainWindow::setupActions()
     stashSplit->setToolTip(i18nc("@info", "Opens the stash virtual directory in a split window"));
     stashSplit->setIcon(QIcon::fromTheme(QStringLiteral("folder-stash")));
     stashSplit->setCheckable(false);
-    stashSplit->setVisible(QDBusConnection::sessionBus().interface()->isServiceRegistered(QStringLiteral("org.kde.kio.StashNotifier")));
+    QDBusConnectionInterface *sessionInterface = QDBusConnection::sessionBus().interface();
+    stashSplit->setVisible(sessionInterface && sessionInterface->isServiceRegistered(QStringLiteral("org.kde.kio.StashNotifier")));
     connect(stashSplit, &QAction::triggered, this, &DolphinMainWindow::toggleSplitStash);
 
     KStandardAction::redisplay(this, &DolphinMainWindow::reloadView, actionCollection());
@@ -1574,8 +1574,7 @@ void DolphinMainWindow::setupActions()
         m_backAction->setObjectName(backAction->objectName());
         m_backAction->setShortcuts(backAction->shortcuts());
     }
-    m_backAction->setDelayed(true);
-    m_backAction->setStickyMenu(false);
+    m_backAction->setPopupMode(QToolButton::DelayedPopup);
     connect(m_backAction, &QAction::triggered, this, &DolphinMainWindow::goBack);
     connect(m_backAction->menu(), &QMenu::aboutToShow, this, &DolphinMainWindow::slotAboutToShowBackPopupMenu);
     connect(m_backAction->menu(), &QMenu::triggered, this, &DolphinMainWindow::slotGoBack);
@@ -1618,8 +1617,7 @@ void DolphinMainWindow::setupActions()
         m_forwardAction->setObjectName(forwardAction->objectName());
         m_forwardAction->setShortcuts(forwardAction->shortcuts());
     }
-    m_forwardAction->setDelayed(true);
-    m_forwardAction->setStickyMenu(false);
+    m_forwardAction->setPopupMode(QToolButton::DelayedPopup);
     connect(m_forwardAction, &QAction::triggered, this, &DolphinMainWindow::goForward);
     connect(m_forwardAction->menu(), &QMenu::aboutToShow, this, &DolphinMainWindow::slotAboutToShowForwardPopupMenu);
     connect(m_forwardAction->menu(), &QMenu::triggered, this, &DolphinMainWindow::slotGoForward);
@@ -1677,7 +1675,7 @@ void DolphinMainWindow::setupActions()
     KActionMenu *bookmarkMenu = new KActionMenu(i18nc("@title:menu", "&Bookmarks"), this);
     bookmarkMenu->setIcon(QIcon::fromTheme(QStringLiteral("bookmarks")));
     // Make the toolbar button version work properly on click
-    bookmarkMenu->setDelayed(false);
+    bookmarkMenu->setPopupMode(QToolButton::InstantPopup);
     m_bookmarkHandler = new DolphinBookmarkHandler(this, actionCollection(), bookmarkMenu->menu(), this);
     actionCollection()->addAction(QStringLiteral("bookmarks"), bookmarkMenu);
 
@@ -1695,8 +1693,13 @@ void DolphinMainWindow::setupActions()
     m_helpMenu = new KHelpMenu(nullptr);
     m_helpMenu->menu()->installEventFilter(this);
     // remove duplicate shortcuts
-    m_helpMenu->action(KHelpMenu::menuHelpContents)->setShortcut(QKeySequence());
-    m_helpMenu->action(KHelpMenu::menuWhatsThis)->setShortcut(QKeySequence());
+    auto removeHelpActionShortcut = [this](KHelpMenu::MenuId menuId) {
+        if (auto *action = m_helpMenu->action(menuId)) {
+            action->setShortcut(QKeySequence());
+        }
+    };
+    removeHelpActionShortcut(KHelpMenu::menuHelpContents);
+    removeHelpActionShortcut(KHelpMenu::menuWhatsThis);
 
     // not in menu actions
     QList<QKeySequence> nextTabKeys = KStandardShortcut::tabNext();
@@ -1979,7 +1982,7 @@ void DolphinMainWindow::setupDockWidgets()
     KActionMenu* panelsMenu = new KActionMenu(i18nc("@action:inmenu View", "Show Panels"), this);
     actionCollection()->addAction(QStringLiteral("panels"), panelsMenu);
     panelsMenu->setIcon(QIcon::fromTheme(QStringLiteral("view-sidetree")));
-    panelsMenu->setDelayed(false);
+    panelsMenu->setPopupMode(QToolButton::InstantPopup);
     const KActionCollection* ac = actionCollection();
     panelsMenu->addAction(ac->action(QStringLiteral("show_places_panel")));
 #ifdef HAVE_BALOO
@@ -2292,6 +2295,18 @@ void DolphinMainWindow::setupWhatsThis()
     // StandardAction separately because both are used in different locations.
     // m_helpMenu is only used for createControlButton() button.
 
+    auto setStandardActionWhatsThis = [this](KStandardAction::StandardAction actionId,
+                                             const QString &whatsThis) {
+        if (auto *action = actionCollection()->action(KStandardAction::name(actionId))) {
+            action->setWhatsThis(whatsThis);
+        }
+    };
+    auto setHelpActionWhatsThis = [this](KHelpMenu::MenuId menuId, const QString &whatsThis) {
+        if (auto *action = m_helpMenu->action(menuId)) {
+            action->setWhatsThis(whatsThis);
+        }
+    };
+
     // Links do not work within the Menubar so texts without links are provided there.
 
     // i18n: If the external link isn't available in your language you should
@@ -2302,13 +2317,12 @@ void DolphinMainWindow::setupWhatsThis()
     const QString whatsThisHelpContents = xi18nc("@info:whatsthis handbook",
         "<para>This opens the Handbook for this application. It provides "
         "explanations for every part of <emphasis>Dolphin</emphasis>.</para>");
-    actionCollection()->action(KStandardAction::name(KStandardAction::HelpContents))
-        ->setWhatsThis(whatsThisHelpContents
+    setStandardActionWhatsThis(KStandardAction::HelpContents, whatsThisHelpContents
         + xi18nc("@info:whatsthis second half of handbook hb text without link",
         "<para>If you want more elaborate introductions to the "
         "different features of <emphasis>Dolphin</emphasis> "
         "go to the KDE UserBase Wiki.</para>"));
-    m_helpMenu->action(KHelpMenu::menuHelpContents)->setWhatsThis(whatsThisHelpContents
+    setHelpActionWhatsThis(KHelpMenu::menuHelpContents, whatsThisHelpContents
         + xi18nc("@info:whatsthis second half of handbook text with link",
         "<para>If you want more elaborate introductions to the "
         "different features of <emphasis>Dolphin</emphasis> "
@@ -2320,8 +2334,7 @@ void DolphinMainWindow::setupWhatsThis()
         "using right now! Click it, then click any component of this "
         "application to ask \"What's this?\" about it. The mouse cursor "
         "will change appearance if no help is available for a spot.</para>");
-    actionCollection()->action(KStandardAction::name(KStandardAction::WhatsThis))
-       ->setWhatsThis(whatsThisWhatsThis
+    setStandardActionWhatsThis(KStandardAction::WhatsThis, whatsThisWhatsThis
         + xi18nc("@info:whatsthis second half of whatsthis button text without link",
         "<para>There are two other ways to get help for this application: The "
         "<interface>Dolphin Handbook</interface> in the <interface>Help"
@@ -2329,7 +2342,7 @@ void DolphinMainWindow::setupWhatsThis()
         "article about <emphasis>File Management</emphasis> online."
         "</para><para>The \"What's this?\" help is "
         "missing in most other windows so don't get too used to this.</para>"));
-    m_helpMenu->action(KHelpMenu::menuWhatsThis)->setWhatsThis(whatsThisWhatsThis
+    setHelpActionWhatsThis(KHelpMenu::menuWhatsThis, whatsThisWhatsThis
         + xi18nc("@info:whatsthis second half of whatsthis button text with link",
         "<para>There are two other ways to get help: "
         "The <link url='help:/dolphin/index.html'>Dolphin Handbook</link> and "
@@ -2340,9 +2353,8 @@ void DolphinMainWindow::setupWhatsThis()
     const QString whatsThisReportBug = xi18nc("@info:whatsthis","<para>This opens a "
         "window that will guide you through reporting errors or flaws "
         "in this application or in other KDE software.</para>");
-    actionCollection()->action(KStandardAction::name(KStandardAction::ReportBug))
-       ->setWhatsThis(whatsThisReportBug);
-    m_helpMenu->action(KHelpMenu::menuReportBug)->setWhatsThis(whatsThisReportBug
+    setStandardActionWhatsThis(KStandardAction::ReportBug, whatsThisReportBug);
+    setHelpActionWhatsThis(KHelpMenu::menuReportBug, whatsThisReportBug
         + xi18nc("@info:whatsthis second half of reportbug text with link",
         "<para>High-quality bug reports are much appreciated. To learn "
         "how to make your bug report as effective as possible "
@@ -2359,33 +2371,30 @@ void DolphinMainWindow::setupWhatsThis()
         "require money like servers, contributor meetings, etc.</para>"
         "<para><emphasis>KDE e.V.</emphasis> is the non-profit "
         "organization behind the KDE community.</para>");
-    actionCollection()->action(KStandardAction::name(KStandardAction::Donate))
-       ->setWhatsThis(whatsThisDonate);
-    m_helpMenu->action(KHelpMenu::menuDonate)->setWhatsThis(whatsThisDonate);
+    setStandardActionWhatsThis(KStandardAction::Donate, whatsThisDonate);
+    setHelpActionWhatsThis(KHelpMenu::menuDonate, whatsThisDonate);
 
     const QString whatsThisSwitchLanguage = xi18nc("@info:whatsthis",
         "With this you can change the language this application uses."
         "<nl/>You can even set secondary languages which will be used "
         "if texts are not available in your preferred language.");
-    actionCollection()->action(KStandardAction::name(KStandardAction::SwitchApplicationLanguage))
-       ->setWhatsThis(whatsThisSwitchLanguage);
-    m_helpMenu->action(KHelpMenu::menuSwitchLanguage)->setWhatsThis(whatsThisSwitchLanguage);
+    setStandardActionWhatsThis(KStandardAction::SwitchApplicationLanguage,
+                               whatsThisSwitchLanguage);
+    setHelpActionWhatsThis(KHelpMenu::menuSwitchLanguage, whatsThisSwitchLanguage);
 
     const QString whatsThisAboutApp = xi18nc("@info:whatsthis","This opens a "
         "window that informs you about the version, license, "
         "used libraries and maintainers of this application.");
-    actionCollection()->action(KStandardAction::name(KStandardAction::AboutApp))
-       ->setWhatsThis(whatsThisAboutApp);
-    m_helpMenu->action(KHelpMenu::menuAboutApp)->setWhatsThis(whatsThisAboutApp);
+    setStandardActionWhatsThis(KStandardAction::AboutApp, whatsThisAboutApp);
+    setHelpActionWhatsThis(KHelpMenu::menuAboutApp, whatsThisAboutApp);
 
     const QString whatsThisAboutKDE = xi18nc("@info:whatsthis","This opens a "
         "window with information about <emphasis>KDE</emphasis>. "
         "The KDE community are the people behind this free software."
         "<nl/>If you like using this application but don't know "
         "about KDE or want to see a cute dragon have a look!");
-    actionCollection()->action(KStandardAction::name(KStandardAction::AboutKDE))
-       ->setWhatsThis(whatsThisAboutKDE);
-    m_helpMenu->action(KHelpMenu::menuAboutKDE)->setWhatsThis(whatsThisAboutKDE);
+    setStandardActionWhatsThis(KStandardAction::AboutKDE, whatsThisAboutKDE);
+    setHelpActionWhatsThis(KHelpMenu::menuAboutKDE, whatsThisAboutKDE);
 }
 
 bool DolphinMainWindow::addHamburgerMenuToToolbar()