From 088b5160576c8ed317619855a4c9dc19a69d025b Mon Sep 17 00:00:00 2001 From: Gregor Mi Date: Mon, 12 Jan 2015 16:18:50 +0100 Subject: [PATCH] Add disk usage statistics menu to SpaceInfo widget in the status bar: the menu has the following entries: 1. Filelight location 2. Filelight device 3. Filelight 4. KDiskFree KService is used to find the applications and display proper translations. KRun is used to run the applications. REVIEW: 121478 CHANGELOG: Add a menu on left-click on the SpaceInfo widget in the status bar to show Disk Usage statistics. --- src/CMakeLists.txt | 1 + src/statusbar/spaceinfotoolsmenu.cpp | 103 +++++++++++++++++++++++++++ src/statusbar/spaceinfotoolsmenu.h | 41 +++++++++++ src/statusbar/statusbarspaceinfo.cpp | 11 +++ src/statusbar/statusbarspaceinfo.h | 2 + 5 files changed, 158 insertions(+) create mode 100644 src/statusbar/spaceinfotoolsmenu.cpp create mode 100644 src/statusbar/spaceinfotoolsmenu.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index f132e2844..d2ea49314 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -198,6 +198,7 @@ set(dolphin_SRCS statusbar/dolphinstatusbar.cpp statusbar/mountpointobserver.cpp statusbar/mountpointobservercache.cpp + statusbar/spaceinfotoolsmenu.cpp statusbar/spaceinfoobserver.cpp statusbar/statusbarspaceinfo.cpp views/zoomlevelinfo.cpp diff --git a/src/statusbar/spaceinfotoolsmenu.cpp b/src/statusbar/spaceinfotoolsmenu.cpp new file mode 100644 index 000000000..bd3d648c9 --- /dev/null +++ b/src/statusbar/spaceinfotoolsmenu.cpp @@ -0,0 +1,103 @@ +/*************************************************************************** + * Copyright (C) 2014 by Gregor Mi * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***************************************************************************/ + +#include "spaceinfotoolsmenu.h" + +#include +#include + +#include +#include +#include +#include + +SpaceInfoToolsMenu::SpaceInfoToolsMenu(QWidget* parent, QUrl url) + : QMenu(parent) +{ + const QString notInstalled = " [" + i18nc("@action:inmenu", "not installed") + "]"; + + // find service + // + const auto filelightService = KService::serviceByDesktopName("filelight"); + if (filelightService && filelightService->isApplication()) { + const auto filelightIcon = QIcon::fromTheme(filelightService->icon()); + + if (url.isLocalFile()) { // 2015-01-12: Filelight can handle FTP connections but KIO/kioexec cannot (bug or feature?), so we don't offer it in this case + // add action and connect signals + // + const auto startFilelightDirectoryAction = addAction(filelightService->genericName() + " - " + + i18nc("@action:inmenu", "current folder")); + startFilelightDirectoryAction->setIcon(filelightIcon); + + connect(startFilelightDirectoryAction, &QAction::triggered, this, [filelightService, url](bool) { + KRun::runService(*filelightService, { url }, nullptr); + }); + } + + if (url.isLocalFile()) { // makes no sense for non-local URLs (e.g. FTP server), so we don't offer it in this case + // add action and connect signals + // + const auto startFilelightDeviceAction = addAction(filelightService->genericName() + " - " + + i18nc("@action:inmenu", "current device")); + startFilelightDeviceAction->setIcon(filelightIcon); + + connect(startFilelightDeviceAction, &QAction::triggered, this, [filelightService, url](bool) { + KMountPoint::Ptr mountPoint = KMountPoint::currentMountPoints().findByPath(url.toLocalFile()); + KRun::runService(*filelightService, { mountPoint->mountPoint() }, nullptr); + }); + } + + // add action and connect signals + // + const auto startFilelightAllDevicesAction = addAction(filelightService->genericName() + " - " + + i18nc("@action:inmenu", "all devices")); + startFilelightAllDevicesAction->setIcon(filelightIcon); + + connect(startFilelightAllDevicesAction, &QAction::triggered, this, [filelightService](bool) { + KRun::runService(*filelightService, { }, nullptr); + }); + } else { + const auto startFilelightDirectoryAction = addAction("Filelight" + notInstalled); + startFilelightDirectoryAction->setEnabled(false); + } + + // find service + // + const auto kdiskfreeService = KService::serviceByDesktopName("kdf"); + if (kdiskfreeService && kdiskfreeService->isApplication()) { + // + // add action and connect signals + // + const auto startKDiskFreeAction = addAction(kdiskfreeService->genericName()); + startKDiskFreeAction->setIcon(QIcon::fromTheme(kdiskfreeService->icon())); + + connect(startKDiskFreeAction, &QAction::triggered, this, [kdiskfreeService](bool) { + KRun::runService(*kdiskfreeService, { }, nullptr); + }); + } else { + const auto startKDiskFreeAction = addAction("KDiskFree" + notInstalled); + startKDiskFreeAction->setEnabled(false); + } +} + +SpaceInfoToolsMenu::~SpaceInfoToolsMenu() +{ +} + + diff --git a/src/statusbar/spaceinfotoolsmenu.h b/src/statusbar/spaceinfotoolsmenu.h new file mode 100644 index 000000000..3ca2e184f --- /dev/null +++ b/src/statusbar/spaceinfotoolsmenu.h @@ -0,0 +1,41 @@ +/*************************************************************************** + * Copyright (C) 2014 by Gregor Mi * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***************************************************************************/ + +#ifndef SPACEINFOTOOLSMENU_H +#define SPACEINFOTOOLSMENU_H + +#include +#include + +class QWidget; +class QUrl; + +/** + * A menu with tools that help to find out more about free disk space for the given url. + */ +class SpaceInfoToolsMenu : public QMenu +{ + Q_OBJECT + +public: + explicit SpaceInfoToolsMenu(QWidget* parent, QUrl url); + virtual ~SpaceInfoToolsMenu(); +}; + +#endif diff --git a/src/statusbar/statusbarspaceinfo.cpp b/src/statusbar/statusbarspaceinfo.cpp index 046cbbb23..127641e60 100644 --- a/src/statusbar/statusbarspaceinfo.cpp +++ b/src/statusbar/statusbarspaceinfo.cpp @@ -21,6 +21,9 @@ #include "statusbarspaceinfo.h" #include "spaceinfoobserver.h" +#include "spaceinfotoolsmenu.h" + +#include #include #include @@ -65,6 +68,14 @@ void StatusBarSpaceInfo::hideEvent(QHideEvent* event) KCapacityBar::hideEvent(event); } +void StatusBarSpaceInfo::mousePressEvent(QMouseEvent* event) +{ + if (event->button() == Qt::LeftButton) { + SpaceInfoToolsMenu spaceInfoToolsMenu(this, m_url); + spaceInfoToolsMenu.exec(QCursor::pos()); + } +} + void StatusBarSpaceInfo::slotValuesChanged() { Q_ASSERT(m_observer); diff --git a/src/statusbar/statusbarspaceinfo.h b/src/statusbar/statusbarspaceinfo.h index 5d571beba..2ba7cbf0b 100644 --- a/src/statusbar/statusbarspaceinfo.h +++ b/src/statusbar/statusbarspaceinfo.h @@ -27,6 +27,7 @@ class QHideEvent; class QShowEvent; +class QMouseEvent; class SpaceInfoObserver; @@ -48,6 +49,7 @@ public: protected: void showEvent(QShowEvent* event) Q_DECL_OVERRIDE; void hideEvent(QHideEvent* event) Q_DECL_OVERRIDE; + void mousePressEvent(QMouseEvent* event) Q_DECL_OVERRIDE; private slots: void slotValuesChanged(); -- 2.47.3