settings/viewmodes/viewsettingstab.cpp
settings/viewmodes/contentdisplaytab.cpp
settings/viewmodes/generalviewsettingspage.cpp
+ statusbar/diskspaceusagemenu.cpp
statusbar/dolphinstatusbar.cpp
statusbar/mountpointobserver.cpp
statusbar/mountpointobservercache.cpp
settings/viewmodes/viewsettingstab.h
settings/viewmodes/contentdisplaytab.h
settings/viewmodes/generalviewsettingspage.h
+ statusbar/diskspaceusagemenu.h
statusbar/dolphinstatusbar.h
statusbar/mountpointobserver.h
statusbar/mountpointobservercache.h
#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"
, m_forwardAction(nullptr)
, m_splitViewAction(nullptr)
, m_splitViewMenuAction(nullptr)
+ , m_diskSpaceUsageMenu(nullptr)
, m_sessionSaveTimer(nullptr)
, m_sessionSaveWatcher(nullptr)
, m_sessionSaveScheduled(false)
updatePasteAction();
updateViewActions();
updateGoActions();
+ m_diskSpaceUsageMenu->setUrl(url);
// will signal used urls to activities manager, too
m_recentFiles->addUrl(url, QString(), "inode/directory");
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);
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);
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",
typedef KIO::FileUndoManager::CommandType CommandType;
+class DiskSpaceUsageMenu;
class DolphinBookmarkHandler;
class DolphinViewActionHandler;
class DolphinSettingsDialog;
KToolBarPopupAction *m_forwardAction;
KActionMenu *m_splitViewAction;
QAction *m_splitViewMenuAction;
+ DiskSpaceUsageMenu *m_diskSpaceUsageMenu;
QMenu m_searchTools;
KFileItemActions m_fileItemActions;
<?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" />
<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>
<?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" />
<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>
#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
*/
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.
*/
--- /dev/null
+/*
+ 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
+}
--- /dev/null
+/*
+ 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 ¤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
#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}
{
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.
{
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));
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);
}
}
-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"
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.
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;