diff options
| -rw-r--r-- | src/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | src/dolphinmainwindow.cpp | 17 | ||||
| -rw-r--r-- | src/dolphinmainwindow.h | 2 | ||||
| -rw-r--r-- | src/dolphinui.rc | 3 | ||||
| -rw-r--r-- | src/dolphinuiforphones.rc | 3 | ||||
| -rw-r--r-- | src/dolphinviewcontainer.cpp | 5 | ||||
| -rw-r--r-- | src/dolphinviewcontainer.h | 6 | ||||
| -rw-r--r-- | src/statusbar/diskspaceusagemenu.cpp | 189 | ||||
| -rw-r--r-- | src/statusbar/diskspaceusagemenu.h | 76 | ||||
| -rw-r--r-- | src/statusbar/statusbarspaceinfo.cpp | 173 | ||||
| -rw-r--r-- | src/statusbar/statusbarspaceinfo.h | 18 |
11 files changed, 307 insertions, 187 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 7f0ec8296..70df0d777 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -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 diff --git a/src/dolphinmainwindow.cpp b/src/dolphinmainwindow.cpp index 67db2c5e9..1f483309f 100644 --- a/src/dolphinmainwindow.cpp +++ b/src/dolphinmainwindow.cpp @@ -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", diff --git a/src/dolphinmainwindow.h b/src/dolphinmainwindow.h index b6aa9c020..8b9c4a211 100644 --- a/src/dolphinmainwindow.h +++ b/src/dolphinmainwindow.h @@ -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; diff --git a/src/dolphinui.rc b/src/dolphinui.rc index e51bf2343..3e6e4c463 100644 --- a/src/dolphinui.rc +++ b/src/dolphinui.rc @@ -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> diff --git a/src/dolphinuiforphones.rc b/src/dolphinuiforphones.rc index 8cebd635f..0189c3bb6 100644 --- a/src/dolphinuiforphones.rc +++ b/src/dolphinuiforphones.rc @@ -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> diff --git a/src/dolphinviewcontainer.cpp b/src/dolphinviewcontainer.cpp index 6d08c47c7..9bda4d888 100644 --- a/src/dolphinviewcontainer.cpp +++ b/src/dolphinviewcontainer.cpp @@ -522,6 +522,11 @@ void DolphinViewContainer::showMessage(const QString &message, KMessageWidget::M #endif } +void DolphinViewContainer::showProgress(const QString ¤tlyRunningTaskTitle, int progressPercent) +{ + m_statusBar->showProgress(currentlyRunningTaskTitle, progressPercent, DolphinStatusBar::CancelLoading::Disallowed); +} + void DolphinViewContainer::readSettings() { // The startup settings should (only) get applied if they have been diff --git a/src/dolphinviewcontainer.h b/src/dolphinviewcontainer.h index e827c0885..d4ab0e66e 100644 --- a/src/dolphinviewcontainer.h +++ b/src/dolphinviewcontainer.h @@ -185,6 +185,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 ¤tlyRunningTaskTitle, int progressPercent); + + /** * Refreshes the view container to get synchronized with the (updated) Dolphin settings. */ void readSettings(); diff --git a/src/statusbar/diskspaceusagemenu.cpp b/src/statusbar/diskspaceusagemenu.cpp new file mode 100644 index 000000000..e750a70e6 --- /dev/null +++ b/src/statusbar/diskspaceusagemenu.cpp @@ -0,0 +1,189 @@ +/* + SPDX-FileCopyrightText: 2025 Felix Ernst <[email protected]> + + 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 index 000000000..50984a734 --- /dev/null +++ b/src/statusbar/diskspaceusagemenu.h @@ -0,0 +1,76 @@ +/* + SPDX-FileCopyrightText: 2025 Felix Ernst <[email protected]> + + 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 ¤tlyRunningTaskTitle, 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 diff --git a/src/statusbar/statusbarspaceinfo.cpp b/src/statusbar/statusbarspaceinfo.cpp index c25d028d6..4fb1f311e 100644 --- a/src/statusbar/statusbarspaceinfo.cpp +++ b/src/statusbar/statusbarspaceinfo.cpp @@ -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" diff --git a/src/statusbar/statusbarspaceinfo.h b/src/statusbar/statusbarspaceinfo.h index 7a1012cf0..c384c3b2f 100644 --- a/src/statusbar/statusbarspaceinfo.h +++ b/src/statusbar/statusbarspaceinfo.h @@ -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; |
