]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/statusbar/statusbarspaceinfo.cpp
Add Filelight menu to Tools menu
[dolphin.git] / src / statusbar / statusbarspaceinfo.cpp
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"