]> cloud.milkyroute.net Git - dolphin.git/commitdiff
Add Filelight menu to Tools menu
authorFelix Ernst <felixernst@kde.org>
Sat, 19 Apr 2025 12:32:25 +0000 (14:32 +0200)
committerFelix Ernst <felixernst@kde.org>
Sat, 19 Apr 2025 12:32:25 +0000 (14:32 +0200)
The menu for installing and launching Filelight was only available
through the status bar free space info button until now. By default
we do no longer show the free space info button because the status
bar has been changed to show less information by default.

This commit adds the "Manage Disk Space Usage" menu to the "Tools"
menu in the menu bar so it is more discoverable for users.

src/CMakeLists.txt
src/dolphinmainwindow.cpp
src/dolphinmainwindow.h
src/dolphinui.rc
src/dolphinuiforphones.rc
src/dolphinviewcontainer.cpp
src/dolphinviewcontainer.h
src/statusbar/diskspaceusagemenu.cpp [new file with mode: 0644]
src/statusbar/diskspaceusagemenu.h [new file with mode: 0644]
src/statusbar/statusbarspaceinfo.cpp
src/statusbar/statusbarspaceinfo.h

index 7f0ec8296dc678b46a7a41c7361dbb211d38afdb..70df0d77742a3e201e11889770c0ceb03e9fb0a6 100644 (file)
@@ -337,6 +337,7 @@ target_sources(dolphinstatic PRIVATE
     settings/viewmodes/viewsettingstab.cpp
     settings/viewmodes/contentdisplaytab.cpp
     settings/viewmodes/generalviewsettingspage.cpp
+    statusbar/diskspaceusagemenu.cpp
     statusbar/dolphinstatusbar.cpp
     statusbar/mountpointobserver.cpp
     statusbar/mountpointobservercache.cpp
@@ -405,6 +406,7 @@ target_sources(dolphinstatic PRIVATE
     settings/viewmodes/viewsettingstab.h
     settings/viewmodes/contentdisplaytab.h
     settings/viewmodes/generalviewsettingspage.h
+    statusbar/diskspaceusagemenu.h
     statusbar/dolphinstatusbar.h
     statusbar/mountpointobserver.h
     statusbar/mountpointobservercache.h
index 67db2c5e9d597dd0c6180eed75eed79f6525d9f2..1f483309f304ba8cfb1436a23902663aacc7fa3c 100644 (file)
@@ -29,6 +29,7 @@
 #include "search/dolphinquery.h"
 #include "selectionmode/actiontexthelper.h"
 #include "settings/dolphinsettingsdialog.h"
+#include "statusbar/diskspaceusagemenu.h"
 #include "statusbar/dolphinstatusbar.h"
 #include "views/dolphinnewfilemenuobserver.h"
 #include "views/dolphinremoteencoding.h"
@@ -126,6 +127,7 @@ DolphinMainWindow::DolphinMainWindow()
     , m_forwardAction(nullptr)
     , m_splitViewAction(nullptr)
     , m_splitViewMenuAction(nullptr)
+    , m_diskSpaceUsageMenu(nullptr)
     , m_sessionSaveTimer(nullptr)
     , m_sessionSaveWatcher(nullptr)
     , m_sessionSaveScheduled(false)
@@ -392,6 +394,7 @@ void DolphinMainWindow::changeUrl(const QUrl &url)
     updatePasteAction();
     updateViewActions();
     updateGoActions();
+    m_diskSpaceUsageMenu->setUrl(url);
 
     // will signal used urls to activities manager, too
     m_recentFiles->addUrl(url, QString(), "inode/directory");
@@ -1626,6 +1629,7 @@ void DolphinMainWindow::activeViewChanged(DolphinViewContainer *viewContainer)
         if (auto secondaryUrlNavigator = navigators->secondaryUrlNavigator()) {
             secondaryUrlNavigator->disconnect(this);
         }
+        oldViewContainer->disconnect(m_diskSpaceUsageMenu);
 
         // except the requestItemInfo so that on hover the information panel can still be updated
         connect(oldViewContainer->view(), &DolphinView::requestItemInfo, this, &DolphinMainWindow::requestItemInfo);
@@ -1647,6 +1651,13 @@ void DolphinMainWindow::activeViewChanged(DolphinViewContainer *viewContainer)
     updateViewActions();
     updateGoActions();
     updateSearchAction();
+    connect(m_diskSpaceUsageMenu,
+            &DiskSpaceUsageMenu::showMessage,
+            viewContainer,
+            [viewContainer](const QString &message, KMessageWidget::MessageType messageType) {
+                viewContainer->showMessage(message, messageType);
+            });
+    connect(m_diskSpaceUsageMenu, &DiskSpaceUsageMenu::showInstallationProgress, viewContainer, &DolphinViewContainer::showProgress);
 
     const QUrl url = viewContainer->url();
     Q_EMIT urlChanged(url);
@@ -2090,6 +2101,12 @@ void DolphinMainWindow::setupActions()
     compareFiles->setEnabled(false);
     connect(compareFiles, &QAction::triggered, this, &DolphinMainWindow::compareFiles);
 
+    QAction *manageDiskSpaceUsage = actionCollection()->addAction(QStringLiteral("manage_disk_space"));
+    manageDiskSpaceUsage->setText(i18nc("@action:inmenu Tools", "Manage Disk Space Usage"));
+    manageDiskSpaceUsage->setIcon(QIcon::fromTheme(QStringLiteral("filelight")));
+    m_diskSpaceUsageMenu = new DiskSpaceUsageMenu{this};
+    manageDiskSpaceUsage->setMenu(m_diskSpaceUsageMenu);
+
     QAction *openPreferredSearchTool = actionCollection()->addAction(QStringLiteral("open_preferred_search_tool"));
     openPreferredSearchTool->setText(i18nc("@action:inmenu Tools", "Open Preferred Search Tool"));
     openPreferredSearchTool->setWhatsThis(xi18nc("@info:whatsthis",
index b6aa9c020903c429736e96a23347277a0f643f92..8b9c4a211be7762a8cfff8c23bff71f18937706a 100644 (file)
@@ -32,6 +32,7 @@
 
 typedef KIO::FileUndoManager::CommandType CommandType;
 
+class DiskSpaceUsageMenu;
 class DolphinBookmarkHandler;
 class DolphinViewActionHandler;
 class DolphinSettingsDialog;
@@ -772,6 +773,7 @@ private:
     KToolBarPopupAction *m_forwardAction;
     KActionMenu *m_splitViewAction;
     QAction *m_splitViewMenuAction;
+    DiskSpaceUsageMenu *m_diskSpaceUsageMenu;
 
     QMenu m_searchTools;
     KFileItemActions m_fileItemActions;
index e51bf23432c655f5e2a948b1523846a61da619bf..3e6e4c463034e4ec100188a0f623eedc7da619f3 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 <!DOCTYPE gui SYSTEM "kpartgui.dtd">
-<gui name="dolphin" version="45">
+<gui name="dolphin" version="46">
     <MenuBar>
         <Menu name="file">
             <Action name="new_menu" />
@@ -73,6 +73,7 @@
             <Action name="open_preferred_search_tool" />
             <Action name="open_terminal" />
             <Action name="open_terminal_here" />
+            <Action name="manage_disk_space" />
             <Action name="compare_files" />
             <Action name="change_remote_encoding" />
         </Menu>
index 8cebd635f285243c255b2f9b1b515e951fb8d67d..0189c3bb6edf8bb4b8d40e2565c5c77736b12fdd 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 <!DOCTYPE gui SYSTEM "kpartgui.dtd">
-<gui name="dolphin" version="2">
+<gui name="dolphin" version="3">
     <MenuBar>
         <Menu name="file">
             <Action name="new_menu" />
@@ -73,6 +73,7 @@
             <Action name="open_preferred_search_tool" />
             <Action name="open_terminal" />
             <Action name="open_terminal_here" />
+            <Action name="manage_disk_space" />
             <Action name="compare_files" />
             <Action name="change_remote_encoding" />
         </Menu>
index 6d08c47c7d03990f4fed2c4e06b9d2887fb03fd4..9bda4d8881dea731054399ee62d7ea6e2d533d10 100644 (file)
@@ -522,6 +522,11 @@ void DolphinViewContainer::showMessage(const QString &message, KMessageWidget::M
 #endif
 }
 
+void DolphinViewContainer::showProgress(const QString &currentlyRunningTaskTitle, int progressPercent)
+{
+    m_statusBar->showProgress(currentlyRunningTaskTitle, progressPercent, DolphinStatusBar::CancelLoading::Disallowed);
+}
+
 void DolphinViewContainer::readSettings()
 {
     // The startup settings should (only) get applied if they have been
index e827c08856e1a740c2e17a8b175d6b116a623b0d..d4ab0e66ec758d39ec7cbc035cc51a74fd8b4000 100644 (file)
@@ -184,6 +184,12 @@ public:
      */
     void showMessage(const QString &message, KMessageWidget::MessageType messageType, std::initializer_list<QAction *> buttonActions = {});
 
+    /**
+     * Forwards to DolphinStatusBar::showProgress(). Only exception: The button to cancel the task is hidden.
+     * @see DolphinStatusBar::showProgress().
+     */
+    void showProgress(const QString &currentlyRunningTaskTitle, int progressPercent);
+
     /**
      * Refreshes the view container to get synchronized with the (updated) Dolphin settings.
      */
diff --git a/src/statusbar/diskspaceusagemenu.cpp b/src/statusbar/diskspaceusagemenu.cpp
new file mode 100644 (file)
index 0000000..e750a70
--- /dev/null
@@ -0,0 +1,189 @@
+/*
+    SPDX-FileCopyrightText: 2025 Felix Ernst <felixernst@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
+*/
+
+#include "diskspaceusagemenu.h"
+
+#include "dolphinpackageinstaller.h"
+#include "global.h"
+
+#include <KIO/ApplicationLauncherJob>
+#include <KLocalizedString>
+#include <KService>
+
+#include <QDesktopServices>
+#include <QHBoxLayout>
+#include <QLabel>
+#include <QPushButton>
+#include <QShowEvent>
+#include <QStorageInfo>
+#include <QWidgetAction>
+
+DiskSpaceUsageMenu::DiskSpaceUsageMenu(QWidget *parent)
+    : QMenu{parent}
+{
+    connect(this, &QMenu::aboutToShow, this, &DiskSpaceUsageMenu::updateMenu);
+}
+
+void DiskSpaceUsageMenu::slotInstallFilelightButtonClicked()
+{
+#ifdef Q_OS_WIN
+    QDesktopServices::openUrl(QUrl("https://apps.kde.org/filelight"));
+#else
+    auto packageInstaller = new DolphinPackageInstaller(
+        FILELIGHT_PACKAGE_NAME,
+        QUrl("appstream://org.kde.filelight.desktop"),
+        []() {
+            return KService::serviceByDesktopName(QStringLiteral("org.kde.filelight"));
+        },
+        this);
+    connect(packageInstaller, &KJob::result, this, [this](KJob *job) {
+        Q_EMIT showInstallationProgress(QString(), 100); // Hides the progress information in the status bar.
+        if (job->error()) {
+            Q_EMIT showMessage(job->errorString(), KMessageWidget::Error);
+        } else {
+            Q_EMIT showMessage(xi18nc("@info", "<application>Filelight</application> installed successfully."), KMessageWidget::Positive);
+            if (isVisible()) {
+                hide();
+                updateMenu();
+                show();
+            }
+        }
+    });
+    const auto installationTaskText{i18nc("@info:status", "Installing Filelight…")};
+    Q_EMIT showInstallationProgress(installationTaskText, -1);
+    connect(packageInstaller, &KJob::percentChanged, this, [this, installationTaskText](KJob * /* job */, long unsigned int percent) {
+        if (percent < 100) { // Ignore some weird reported values.
+            Q_EMIT showInstallationProgress(installationTaskText, percent);
+        }
+    });
+    packageInstaller->start();
+#endif
+}
+
+void DiskSpaceUsageMenu::updateMenu()
+{
+    clear();
+
+    // Creates a menu with tools that help to find out more about free
+    // disk space for the given url.
+
+    const KService::Ptr filelight = KService::serviceByDesktopName(QStringLiteral("org.kde.filelight"));
+    const KService::Ptr kdiskfree = KService::serviceByDesktopName(QStringLiteral("org.kde.kdf"));
+
+    if (!filelight && !kdiskfree) {
+        // Show an UI to install a tool to free up disk space because this is what a user pressing on a "free space" button would want.
+        if (!m_installFilelightWidgetAction) {
+            initialiseInstallFilelightWidgetAction();
+        }
+        addAction(m_installFilelightWidgetAction);
+        return;
+    }
+
+    if (filelight) {
+        QAction *filelightFolderAction = addAction(QIcon::fromTheme(QStringLiteral("filelight")), i18n("Disk Usage Statistics - current folder"));
+
+        connect(filelightFolderAction, &QAction::triggered, this, [this, filelight](bool) {
+            auto *job = new KIO::ApplicationLauncherJob(filelight);
+            job->setUrls({m_url});
+            job->start();
+        });
+
+        // For remote URLs like FTP analyzing the device makes no sense
+        if (m_url.isLocalFile()) {
+            QAction *filelightDiskAction = addAction(QIcon::fromTheme(QStringLiteral("filelight")), i18n("Disk Usage Statistics - current device"));
+
+            connect(filelightDiskAction, &QAction::triggered, this, [this, filelight](bool) {
+                const QStorageInfo info(m_url.toLocalFile());
+
+                if (info.isValid() && info.isReady()) {
+                    auto *job = new KIO::ApplicationLauncherJob(filelight);
+                    job->setUrls({QUrl::fromLocalFile(info.rootPath())});
+                    job->start();
+                }
+            });
+        }
+
+        QAction *filelightAllAction = addAction(QIcon::fromTheme(QStringLiteral("filelight")), i18n("Disk Usage Statistics - all devices"));
+
+        connect(filelightAllAction, &QAction::triggered, this, [this, filelight](bool) {
+            const QStorageInfo info(m_url.toLocalFile());
+
+            if (info.isValid() && info.isReady()) {
+                auto *job = new KIO::ApplicationLauncherJob(filelight);
+                job->start();
+            }
+        });
+    }
+
+    if (kdiskfree) {
+        QAction *kdiskfreeAction = addAction(QIcon::fromTheme(QStringLiteral("kdf")), i18n("KDiskFree"));
+
+        connect(kdiskfreeAction, &QAction::triggered, this, [kdiskfree] {
+            auto *job = new KIO::ApplicationLauncherJob(kdiskfree);
+            job->start();
+        });
+    }
+}
+
+void DiskSpaceUsageMenu::showEvent(QShowEvent *event)
+{
+    if (!event->spontaneous()) {
+        auto widgetAction = qobject_cast<QWidgetAction *>(actions().first());
+        if (widgetAction) {
+            widgetAction->defaultWidget()->setFocus();
+        }
+    }
+    QMenu::showEvent(event);
+}
+
+void DiskSpaceUsageMenu::initialiseInstallFilelightWidgetAction()
+{
+    Q_ASSERT(!m_installFilelightWidgetAction);
+
+    auto containerWidget = new QWidget{this};
+    containerWidget->setContentsMargins(Dolphin::VERTICAL_SPACER_HEIGHT,
+                                        Dolphin::VERTICAL_SPACER_HEIGHT,
+                                        Dolphin::VERTICAL_SPACER_HEIGHT, // Using the same value for every spacing in this containerWidget looks nice.
+                                        Dolphin::VERTICAL_SPACER_HEIGHT);
+    auto vLayout = new QVBoxLayout(containerWidget);
+
+    auto installFilelightTitle = new QLabel(i18nc("@title", "Free Up Disk Space"), containerWidget);
+    installFilelightTitle->setAlignment(Qt::AlignCenter);
+    installFilelightTitle->setTextInteractionFlags(Qt::TextSelectableByMouse | Qt::TextSelectableByKeyboard | Qt::LinksAccessibleByKeyboard);
+    QFont titleFont{installFilelightTitle->font()};
+    titleFont.setPointSize(titleFont.pointSize() + 2);
+    installFilelightTitle->setFont(titleFont);
+    vLayout->addWidget(installFilelightTitle);
+
+    vLayout->addSpacing(Dolphin::VERTICAL_SPACER_HEIGHT);
+
+    auto installFilelightBody =
+        // i18n: The new line ("<nl/>") tag is only there to format this text visually pleasing, i.e. to avoid having one very long line.
+        new QLabel(xi18nc("@title", "<para>Install additional software to view disk usage statistics<nl/>and identify big files and folders.</para>"),
+                   containerWidget);
+    installFilelightBody->setAlignment(Qt::AlignCenter);
+    installFilelightBody->setTextInteractionFlags(Qt::TextSelectableByMouse | Qt::TextSelectableByKeyboard | Qt::LinksAccessibleByKeyboard);
+    vLayout->addWidget(installFilelightBody);
+
+    vLayout->addSpacing(Dolphin::VERTICAL_SPACER_HEIGHT);
+
+    auto installFilelightButton =
+        new QPushButton(QIcon::fromTheme(QStringLiteral("filelight")), i18nc("@action:button", "Install Filelight…"), containerWidget);
+    installFilelightButton->setMinimumWidth(std::max(installFilelightButton->sizeHint().width(), installFilelightTitle->sizeHint().width()));
+    auto buttonLayout = new QHBoxLayout; // The parent is automatically set on addLayout() below.
+    buttonLayout->addWidget(installFilelightButton, 0, Qt::AlignHCenter);
+    vLayout->addLayout(buttonLayout);
+
+    // Make sure one Tab press focuses the button after the UI opened.
+    setFocusProxy(installFilelightButton);
+    containerWidget->setFocusPolicy(Qt::TabFocus);
+    containerWidget->setFocusProxy(installFilelightButton);
+    installFilelightButton->setAccessibleDescription(installFilelightBody->text());
+    connect(installFilelightButton, &QAbstractButton::clicked, this, &DiskSpaceUsageMenu::slotInstallFilelightButtonClicked);
+
+    m_installFilelightWidgetAction = new QWidgetAction{this};
+    m_installFilelightWidgetAction->setDefaultWidget(containerWidget); // transfers ownership of containerWidget
+}
diff --git a/src/statusbar/diskspaceusagemenu.h b/src/statusbar/diskspaceusagemenu.h
new file mode 100644 (file)
index 0000000..50984a7
--- /dev/null
@@ -0,0 +1,76 @@
+/*
+    SPDX-FileCopyrightText: 2025 Felix Ernst <felixernst@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
+*/
+
+#ifndef DISKSPACEUSAGEMENU_H
+#define DISKSPACEUSAGEMENU_H
+
+#include <KMessageWidget>
+
+#include <QMenu>
+#include <QPointer>
+#include <QUrl>
+
+class QShowEvent;
+class QWidgetAction;
+
+/**
+ * A menu that allows launching tools to view disk usage statistics like Filelight and KDiskFree when those are installed.
+ * If none are installed, this menu instead allows installing Filelight.
+ */
+class DiskSpaceUsageMenu : public QMenu
+{
+    Q_OBJECT
+
+public:
+    explicit DiskSpaceUsageMenu(QWidget *parent);
+
+    inline void setUrl(const QUrl &url)
+    {
+        m_url = url;
+    };
+
+Q_SIGNALS:
+    /**
+     * Requests for @p message with the given @p messageType to be shown to the user in a non-modal way.
+     */
+    void showMessage(const QString &message, KMessageWidget::MessageType messageType);
+
+    /**
+     * Requests for a progress update to be shown to the user in a non-modal way.
+     * @param currentlyRunningTaskTitle     The task that is currently progressing.
+     * @param installationProgressPercent   The current percentage of completion.
+     */
+    void showInstallationProgress(const QString &currentlyRunningTaskTitle, int installationProgressPercent);
+
+private Q_SLOTS:
+    /**
+     * Asynchronously starts a Filelight installation using DolphinPackageInstaller. @see DolphinPackageInstaller.
+     * Installation success or failure is reported through showMessage(). @see StatusBarSpaceInfo::showMessage().
+     * Installation progress is reported through showInstallationProgress(). @see StatusBarSpaceInfo::showInstallationProgress().
+     */
+    void slotInstallFilelightButtonClicked();
+
+    void updateMenu();
+
+protected:
+    /** Moves keyboard focus to the "Install Filelight" button if the Installation UI is shown. */
+    void showEvent(QShowEvent *event) override;
+
+private:
+    /**
+     * Creates a new QWidgetAction that contains a UI to install Filelight.
+     * m_installFilelightWidgetAction is initialised after calling this method once.
+     */
+    void initialiseInstallFilelightWidgetAction();
+
+private:
+    /** An action containing a UI to install Filelight. */
+    QPointer<QWidgetAction> m_installFilelightWidgetAction = nullptr;
+    /** The current url of the view. Filelight can be launched to show this directory. */
+    QUrl m_url;
+};
+
+#endif // DISKSPACEUSAGEMENU_H
index c25d028d68897a95fa79d5981273ee327aeadf82..4fb1f311e64976abfdadeb69df6e2b8a385488a0 100644 (file)
@@ -7,31 +7,19 @@
 #include "statusbarspaceinfo.h"
 
 #include "config-dolphin.h"
-#include "dolphinpackageinstaller.h"
-#include "global.h"
+#include "diskspaceusagemenu.h"
 #include "spaceinfoobserver.h"
 
 #include <KCapacityBar>
-#include <KIO/ApplicationLauncherJob>
 #include <KIO/Global>
 #include <KLocalizedString>
-#include <KService>
 
-#include <QDesktopServices>
 #include <QHBoxLayout>
-#include <QLabel>
-#include <QMenu>
-#include <QMouseEvent>
-#include <QPushButton>
-#include <QStorageInfo>
 #include <QToolButton>
-#include <QVBoxLayout>
-#include <QWidgetAction>
 
 StatusBarSpaceInfo::StatusBarSpaceInfo(QWidget *parent)
     : QWidget(parent)
     , m_observer(nullptr)
-    , m_installFilelightWidgetAction{nullptr}
     , m_hasSpaceInfo{false}
     , m_shown{false}
 {
@@ -41,9 +29,10 @@ StatusBarSpaceInfo::StatusBarSpaceInfo(QWidget *parent)
     m_textInfoButton = new QToolButton(this);
     m_textInfoButton->setAutoRaise(true);
     m_textInfoButton->setPopupMode(QToolButton::InstantPopup);
-    m_buttonMenu = new QMenu(this);
-    m_textInfoButton->setMenu(m_buttonMenu);
-    connect(m_buttonMenu, &QMenu::aboutToShow, this, &StatusBarSpaceInfo::updateMenu);
+    auto menu = new DiskSpaceUsageMenu{this};
+    connect(menu, &DiskSpaceUsageMenu::showMessage, this, &StatusBarSpaceInfo::showMessage);
+    connect(menu, &DiskSpaceUsageMenu::showInstallationProgress, this, &StatusBarSpaceInfo::showInstallationProgress);
+    m_textInfoButton->setMenu(menu);
 
     auto layout = new QHBoxLayout(this);
     // We reduce the outside margin of the flat button so it visually has the same margin as the status bar text label on the other end of the bar.
@@ -79,6 +68,7 @@ void StatusBarSpaceInfo::setUrl(const QUrl &url)
 {
     if (m_url != url) {
         m_url = url;
+        static_cast<DiskSpaceUsageMenu *>(m_textInfoButton->menu())->setUrl(url);
         m_hasSpaceInfo = false;
         if (m_observer) {
             m_observer.reset(new SpaceInfoObserver(m_url, this));
@@ -122,108 +112,6 @@ QSize StatusBarSpaceInfo::minimumSizeHint() const
     return QSize();
 }
 
-void StatusBarSpaceInfo::updateMenu()
-{
-    m_buttonMenu->clear();
-
-    // Creates a menu with tools that help to find out more about free
-    // disk space for the given url.
-
-    const KService::Ptr filelight = KService::serviceByDesktopName(QStringLiteral("org.kde.filelight"));
-    const KService::Ptr kdiskfree = KService::serviceByDesktopName(QStringLiteral("org.kde.kdf"));
-
-    if (!filelight && !kdiskfree) {
-        // Show an UI to install a tool to free up disk space because this is what a user pressing on a "free space" button would want.
-        if (!m_installFilelightWidgetAction) {
-            initialiseInstallFilelightWidgetAction();
-        }
-        m_buttonMenu->addAction(m_installFilelightWidgetAction);
-        return;
-    }
-
-    if (filelight) {
-        QAction *filelightFolderAction = m_buttonMenu->addAction(QIcon::fromTheme(QStringLiteral("filelight")), i18n("Disk Usage Statistics - current folder"));
-
-        m_buttonMenu->connect(filelightFolderAction, &QAction::triggered, m_buttonMenu, [this, filelight](bool) {
-            auto *job = new KIO::ApplicationLauncherJob(filelight);
-            job->setUrls({m_url});
-            job->start();
-        });
-
-        // For remote URLs like FTP analyzing the device makes no sense
-        if (m_url.isLocalFile()) {
-            QAction *filelightDiskAction =
-                m_buttonMenu->addAction(QIcon::fromTheme(QStringLiteral("filelight")), i18n("Disk Usage Statistics - current device"));
-
-            m_buttonMenu->connect(filelightDiskAction, &QAction::triggered, m_buttonMenu, [this, filelight](bool) {
-                const QStorageInfo info(m_url.toLocalFile());
-
-                if (info.isValid() && info.isReady()) {
-                    auto *job = new KIO::ApplicationLauncherJob(filelight);
-                    job->setUrls({QUrl::fromLocalFile(info.rootPath())});
-                    job->start();
-                }
-            });
-        }
-
-        QAction *filelightAllAction = m_buttonMenu->addAction(QIcon::fromTheme(QStringLiteral("filelight")), i18n("Disk Usage Statistics - all devices"));
-
-        m_buttonMenu->connect(filelightAllAction, &QAction::triggered, m_buttonMenu, [this, filelight](bool) {
-            const QStorageInfo info(m_url.toLocalFile());
-
-            if (info.isValid() && info.isReady()) {
-                auto *job = new KIO::ApplicationLauncherJob(filelight);
-                job->start();
-            }
-        });
-    }
-
-    if (kdiskfree) {
-        QAction *kdiskfreeAction = m_buttonMenu->addAction(QIcon::fromTheme(QStringLiteral("kdf")), i18n("KDiskFree"));
-
-        connect(kdiskfreeAction, &QAction::triggered, this, [kdiskfree] {
-            auto *job = new KIO::ApplicationLauncherJob(kdiskfree);
-            job->start();
-        });
-    }
-}
-
-void StatusBarSpaceInfo::slotInstallFilelightButtonClicked()
-{
-#ifdef Q_OS_WIN
-    QDesktopServices::openUrl(QUrl("https://apps.kde.org/filelight"));
-#else
-    auto packageInstaller = new DolphinPackageInstaller(
-        FILELIGHT_PACKAGE_NAME,
-        QUrl("appstream://org.kde.filelight.desktop"),
-        []() {
-            return KService::serviceByDesktopName(QStringLiteral("org.kde.filelight"));
-        },
-        this);
-    connect(packageInstaller, &KJob::result, this, [this](KJob *job) {
-        Q_EMIT showInstallationProgress(QString(), 100); // Hides the progress information in the status bar.
-        if (job->error()) {
-            Q_EMIT showMessage(job->errorString(), KMessageWidget::Error);
-        } else {
-            Q_EMIT showMessage(xi18nc("@info", "<application>Filelight</application> installed successfully."), KMessageWidget::Positive);
-            if (m_textInfoButton->menu()->isVisible()) {
-                m_textInfoButton->menu()->hide();
-                updateMenu();
-                m_textInfoButton->menu()->show();
-            }
-        }
-    });
-    const auto installationTaskText{i18nc("@info:status", "Installing Filelight…")};
-    Q_EMIT showInstallationProgress(installationTaskText, -1);
-    connect(packageInstaller, &KJob::percentChanged, this, [this, installationTaskText](KJob * /* job */, long unsigned int percent) {
-        if (percent < 100) { // Ignore some weird reported values.
-            Q_EMIT showInstallationProgress(installationTaskText, percent);
-        }
-    });
-    packageInstaller->start();
-#endif
-}
-
 void StatusBarSpaceInfo::slotValuesChanged()
 {
     Q_ASSERT(m_observer);
@@ -258,53 +146,4 @@ void StatusBarSpaceInfo::slotValuesChanged()
     }
 }
 
-void StatusBarSpaceInfo::initialiseInstallFilelightWidgetAction()
-{
-    Q_ASSERT(!m_installFilelightWidgetAction);
-
-    auto containerWidget = new QWidget{this};
-    containerWidget->setContentsMargins(Dolphin::VERTICAL_SPACER_HEIGHT,
-                                        Dolphin::VERTICAL_SPACER_HEIGHT,
-                                        Dolphin::VERTICAL_SPACER_HEIGHT, // Using the same value for every spacing in this containerWidget looks nice.
-                                        Dolphin::VERTICAL_SPACER_HEIGHT);
-    auto vLayout = new QVBoxLayout(containerWidget);
-
-    auto installFilelightTitle = new QLabel(i18nc("@title", "Free Up Disk Space"), containerWidget);
-    installFilelightTitle->setAlignment(Qt::AlignCenter);
-    installFilelightTitle->setTextInteractionFlags(Qt::TextSelectableByMouse | Qt::TextSelectableByKeyboard | Qt::LinksAccessibleByKeyboard);
-    QFont titleFont{installFilelightTitle->font()};
-    titleFont.setPointSize(titleFont.pointSize() + 2);
-    installFilelightTitle->setFont(titleFont);
-    vLayout->addWidget(installFilelightTitle);
-
-    vLayout->addSpacing(Dolphin::VERTICAL_SPACER_HEIGHT);
-
-    auto installFilelightBody =
-        // i18n: The new line ("<nl/>") tag is only there to format this text visually pleasing, i.e. to avoid having one very long line.
-        new QLabel(xi18nc("@title", "<para>Install additional software to view disk usage statistics<nl/>and identify big files and folders.</para>"),
-                   containerWidget);
-    installFilelightBody->setAlignment(Qt::AlignCenter);
-    installFilelightBody->setTextInteractionFlags(Qt::TextSelectableByMouse | Qt::TextSelectableByKeyboard | Qt::LinksAccessibleByKeyboard);
-    vLayout->addWidget(installFilelightBody);
-
-    vLayout->addSpacing(Dolphin::VERTICAL_SPACER_HEIGHT);
-
-    auto installFilelightButton =
-        new QPushButton(QIcon::fromTheme(QStringLiteral("filelight")), i18nc("@action:button", "Install Filelight…"), containerWidget);
-    installFilelightButton->setMinimumWidth(std::max(installFilelightButton->sizeHint().width(), installFilelightTitle->sizeHint().width()));
-    auto buttonLayout = new QHBoxLayout; // The parent is automatically set on addLayout() below.
-    buttonLayout->addWidget(installFilelightButton, 0, Qt::AlignHCenter);
-    vLayout->addLayout(buttonLayout);
-
-    // Make sure one Tab press focuses the button after the UI opened.
-    m_buttonMenu->setFocusProxy(installFilelightButton);
-    containerWidget->setFocusPolicy(Qt::TabFocus);
-    containerWidget->setFocusProxy(installFilelightButton);
-    installFilelightButton->setAccessibleDescription(installFilelightBody->text());
-    connect(installFilelightButton, &QAbstractButton::clicked, this, &StatusBarSpaceInfo::slotInstallFilelightButtonClicked);
-
-    m_installFilelightWidgetAction = new QWidgetAction{this};
-    m_installFilelightWidgetAction->setDefaultWidget(containerWidget); // transfers ownership of containerWidget
-}
-
 #include "moc_statusbarspaceinfo.cpp"
index 7a1012cf01310e9fb5fc0b38ad4e1c89a4346687..c384c3b2f869f823d751a627dd609950b735cbb9 100644 (file)
@@ -63,25 +63,10 @@ protected:
     void hideEvent(QHideEvent *event) override;
     QSize minimumSizeHint() const override;
 
-    void updateMenu();
-
 private Q_SLOTS:
-    /**
-     * Asynchronously starts a Filelight installation using DolphinPackageInstaller. @see DolphinPackageInstaller.
-     * Installation success or failure is reported through showMessage(). @see StatusBarSpaceInfo::showMessage().
-     * Installation progress is reported through showInstallationProgress(). @see StatusBarSpaceInfo::showInstallationProgress().
-     */
-    void slotInstallFilelightButtonClicked();
-
     void slotValuesChanged();
 
 private:
-    /**
-     * Creates a new QWidgetAction that contains a UI to install Filelight.
-     * m_installFilelightWidgetAction is initialised after calling this method once.
-     */
-    void initialiseInstallFilelightWidgetAction();
-
     // The following three methods are only for private use.
     using QWidget::hide; // Use StatusBarSpaceInfo::setShown() instead.
     using QWidget::setVisible; // Use StatusBarSpaceInfo::setShown() instead.
@@ -91,9 +76,6 @@ private:
     QScopedPointer<SpaceInfoObserver> m_observer;
     KCapacityBar *m_capacityBar;
     QToolButton *m_textInfoButton;
-    QMenu *m_buttonMenu;
-    /** An action containing a UI to install Filelight. */
-    QWidgetAction *m_installFilelightWidgetAction;
     QUrl m_url;
     /** Whether m_observer has already retrieved space information for the current url. */
     bool m_hasSpaceInfo;