X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/83988f5e5bdea84b133fea50f34b807a94ce0732..676c7fee62a42605d8f896be1089158159a8003c:/src/statusbar/statusbarspaceinfo.cpp diff --git a/src/statusbar/statusbarspaceinfo.cpp b/src/statusbar/statusbarspaceinfo.cpp index 253d912c0..c25d028d6 100644 --- a/src/statusbar/statusbarspaceinfo.cpp +++ b/src/statusbar/statusbarspaceinfo.cpp @@ -6,6 +6,9 @@ #include "statusbarspaceinfo.h" +#include "config-dolphin.h" +#include "dolphinpackageinstaller.h" +#include "global.h" #include "spaceinfoobserver.h" #include @@ -14,16 +17,26 @@ #include #include +#include #include +#include #include #include +#include #include #include +#include +#include StatusBarSpaceInfo::StatusBarSpaceInfo(QWidget *parent) : QWidget(parent) , m_observer(nullptr) + , m_installFilelightWidgetAction{nullptr} + , m_hasSpaceInfo{false} + , m_shown{false} { + hide(); // Only become visible when we have space info to show. @see StatusBarSpaceInfo::setShown(). + m_capacityBar = new KCapacityBar(KCapacityBar::DrawTextInline, this); m_textInfoButton = new QToolButton(this); m_textInfoButton->setAutoRaise(true); @@ -48,7 +61,17 @@ void StatusBarSpaceInfo::setShown(bool shown) m_shown = shown; if (!m_shown) { hide(); - m_ready = false; + return; + } + + // We only show() this widget in slotValueChanged() when it m_hasSpaceInfo. + if (m_observer.isNull()) { + m_observer.reset(new SpaceInfoObserver(m_url, this)); + connect(m_observer.data(), &SpaceInfoObserver::valuesChanged, this, &StatusBarSpaceInfo::slotValuesChanged); + } + + if (m_hasSpaceInfo) { + slotValuesChanged(); } } @@ -56,7 +79,7 @@ void StatusBarSpaceInfo::setUrl(const QUrl &url) { if (m_url != url) { m_url = url; - m_ready = false; + m_hasSpaceInfo = false; if (m_observer) { m_observer.reset(new SpaceInfoObserver(m_url, this)); connect(m_observer.data(), &SpaceInfoObserver::valuesChanged, this, &StatusBarSpaceInfo::slotValuesChanged); @@ -78,23 +101,18 @@ void StatusBarSpaceInfo::update() void StatusBarSpaceInfo::showEvent(QShowEvent *event) { - if (m_shown) { - if (m_ready) { - QWidget::showEvent(event); - } - - if (m_observer.isNull()) { - m_observer.reset(new SpaceInfoObserver(m_url, this)); - connect(m_observer.data(), &SpaceInfoObserver::valuesChanged, this, &StatusBarSpaceInfo::slotValuesChanged); - } + if (m_shown && m_observer.isNull()) { + m_observer.reset(new SpaceInfoObserver(m_url, this)); + connect(m_observer.data(), &SpaceInfoObserver::valuesChanged, this, &StatusBarSpaceInfo::slotValuesChanged); } + QWidget::showEvent(event); } void StatusBarSpaceInfo::hideEvent(QHideEvent *event) { - if (m_ready) { + if (m_hasSpaceInfo) { m_observer.reset(); - m_ready = false; + m_hasSpaceInfo = false; } QWidget::hideEvent(event); } @@ -115,7 +133,11 @@ void StatusBarSpaceInfo::updateMenu() const KService::Ptr kdiskfree = KService::serviceByDesktopName(QStringLiteral("org.kde.kdf")); if (!filelight && !kdiskfree) { - // nothing to show + // 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; } @@ -166,6 +188,42 @@ void StatusBarSpaceInfo::updateMenu() } } +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", "Filelight 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); @@ -176,7 +234,7 @@ void StatusBarSpaceInfo::slotValuesChanged() return; } - m_ready = true; + m_hasSpaceInfo = true; const quint64 available = m_observer->available(); const quint64 used = size - available; @@ -200,4 +258,53 @@ 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 ("") tag is only there to format this text visually pleasing, i.e. to avoid having one very long line. + new QLabel(xi18nc("@title", "Install additional software to view disk usage statisticsand identify big files and folders."), + 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"