diff options
| author | Felix Ernst <[email protected]> | 2025-04-19 14:32:25 +0200 |
|---|---|---|
| committer | Felix Ernst <[email protected]> | 2025-04-19 14:32:25 +0200 |
| commit | b889a446bfe851a7f49821d469c5f3041b6e5774 (patch) | |
| tree | e14a8ddec8efc56c27fd11cbb46f72d9b325784b /src/statusbar/statusbarspaceinfo.cpp | |
| parent | 81627bbf9a8eace35f87b6bb09d25afef5ea8421 (diff) | |
Add Filelight menu to Tools menu
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.
Diffstat (limited to 'src/statusbar/statusbarspaceinfo.cpp')
| -rw-r--r-- | src/statusbar/statusbarspaceinfo.cpp | 173 |
1 files changed, 6 insertions, 167 deletions
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" |
