1
0
mirror of https://invent.kde.org/system/dolphin synced 2024-07-02 16:31:23 +00:00

Port away from KMoreTools

The idea behind KMoreTools was to point the user at external tools for a given job.

It provides a rather complex framework for that, including suggesting not-yet-installed tools.

The UX behind that isn't great though, which somewhat deep menu hierarchies and a somewhat arbitrary list of tools.

Most KDE apps have moved away from it, with only Dolphin remaining.

Instead provide direct integration with relevant KDE tools (Filelight, KDiskFree, KFind)
This commit is contained in:
Nicolas Fella 2023-11-07 15:45:01 +01:00
parent 8297e0a8c9
commit 2cd3d58eec
8 changed files with 99 additions and 48 deletions

View File

@ -28,7 +28,6 @@ Dependencies:
'frameworks/kuserfeedback': '@latest-kf6'
'plasma/kactivities': '@latest-kf6'
'libraries/phonon': '@latest-kf6'
'libraries/kmoretools': '@latest-kf6'
- 'on': ['Linux/Qt6', 'FreeBSD/Qt6']
'require':

View File

@ -75,7 +75,6 @@ find_package(KF6 ${KF6_MIN_VERSION} REQUIRED COMPONENTS
WindowSystem
WidgetsAddons
Codecs
MoreTools
)
find_package(KUserFeedbackQt6 1.2.1)

View File

@ -212,8 +212,6 @@ target_link_libraries(
KF6::Codecs
KF6::KCMUtils
KF6::MoreTools
${FTS_LIB}
)

View File

@ -48,7 +48,6 @@
#include <KJobWidgets>
#include <KLocalizedString>
#include <KMessageBox>
#include <KMoreToolsMenuFactory>
#include <KProtocolInfo>
#include <KProtocolManager>
#include <KShell>
@ -1127,15 +1126,20 @@ void DolphinMainWindow::toggleShowMenuBar()
QPointer<QAction> DolphinMainWindow::preferredSearchTool()
{
m_searchTools.clear();
KMoreToolsMenuFactory("dolphin/search-tools").fillMenuFromGroupingNames(&m_searchTools, {"files-find"}, m_activeViewContainer->url());
QList<QAction *> actions = m_searchTools.actions();
if (actions.isEmpty()) {
return nullptr;
}
QAction *action = actions.first();
if (action->isSeparator()) {
KService::Ptr kfind = KService::serviceByDesktopName(QStringLiteral("org.kde.kfind"));
if (!kfind) {
return nullptr;
}
auto *action = new QAction(QIcon::fromTheme(kfind->icon()), kfind->name(), this);
connect(action, &QAction::triggered, this, [kfind] {
auto *job = new KIO::ApplicationLauncherJob(kfind);
job->start();
});
return action;
}

View File

@ -28,7 +28,6 @@
#include <KLocalizedString>
#include <KMessageBox>
#include <KMimeTypeEditor>
#include <KMoreToolsMenuFactory>
#include <KPluginFactory>
#include <KPluginMetaData>
#include <KSharedConfig>
@ -527,17 +526,10 @@ void DolphinPart::slotOpenTerminal()
void DolphinPart::slotFindFile()
{
QMenu searchTools;
KMoreToolsMenuFactory("dolphin/search-tools").fillMenuFromGroupingNames(&searchTools, {"files-find"}, QUrl::fromLocalFile(localFilePathOrHome()));
QList<QAction *> actions = searchTools.actions();
if (!(actions.isEmpty())) {
actions.first()->trigger();
} else {
KIO::CommandLauncherJob *job = new KIO::CommandLauncherJob(QStringLiteral("kfind"), {url().toString()}, this);
job->setDesktopName(QStringLiteral("org.kde.kfind"));
job->setUiDelegate(new KDialogJobUiDelegate(KJobUiDelegate::AutoHandlingEnabled, widget()));
job->start();
}
KIO::CommandLauncherJob *job = new KIO::CommandLauncherJob(QStringLiteral("kfind"), {url().toString()}, this);
job->setDesktopName(QStringLiteral("org.kde.kfind"));
job->setUiDelegate(new KDialogJobUiDelegate(KJobUiDelegate::AutoHandlingEnabled, widget()));
job->start();
}
void DolphinPart::updateNewMenu()

View File

@ -13,9 +13,10 @@
#include "dolphinquery.h"
#include "config-dolphin.h"
#include <KIO/ApplicationLauncherJob>
#include <KLocalizedString>
#include <KMoreToolsMenuFactory>
#include <KSeparator>
#include <KService>
#if HAVE_BALOO
#include <Baloo/IndexerConfig>
#include <Baloo/Query>
@ -395,18 +396,24 @@ void DolphinSearchBox::init()
searchLocationGroup->addButton(m_fromHereButton);
searchLocationGroup->addButton(m_everywhereButton);
auto moreSearchToolsButton = new QToolButton(this);
moreSearchToolsButton->setAutoRaise(true);
moreSearchToolsButton->setPopupMode(QToolButton::InstantPopup);
moreSearchToolsButton->setIcon(QIcon::fromTheme("arrow-down-double"));
moreSearchToolsButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
moreSearchToolsButton->setText(i18n("More Search Tools"));
moreSearchToolsButton->setMenu(new QMenu(this));
connect(moreSearchToolsButton->menu(), &QMenu::aboutToShow, moreSearchToolsButton->menu(), [this, moreSearchToolsButton]() {
m_menuFactory.reset(new KMoreToolsMenuFactory("dolphin/search-tools"));
moreSearchToolsButton->menu()->clear();
m_menuFactory->fillMenuFromGroupingNames(moreSearchToolsButton->menu(), {"files-find"}, this->m_searchPath);
});
KService::Ptr kfind = KService::serviceByDesktopName(QStringLiteral("org.kde.kfind"));
QToolButton *kfindToolsButton = nullptr;
if (kfind) {
kfindToolsButton = new QToolButton(this);
kfindToolsButton->setAutoRaise(true);
kfindToolsButton->setPopupMode(QToolButton::InstantPopup);
kfindToolsButton->setIcon(QIcon::fromTheme("arrow-down-double"));
kfindToolsButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
kfindToolsButton->setText(i18n("Open %1", kfind->name()));
kfindToolsButton->setIcon(QIcon::fromTheme(kfind->icon()));
connect(kfindToolsButton, &QToolButton::clicked, this, [this, kfind] {
auto *job = new KIO::ApplicationLauncherJob(kfind);
job->setUrls({m_searchPath});
job->start();
});
}
// Create "Facets" widget
m_facetsWidget = new DolphinFacetsWidget(this);
@ -429,7 +436,9 @@ void DolphinSearchBox::init()
optionsLayout->addWidget(m_fromHereButton);
optionsLayout->addWidget(m_everywhereButton);
optionsLayout->addWidget(new KSeparator(Qt::Vertical, this));
optionsLayout->addWidget(moreSearchToolsButton);
if (kfindToolsButton) {
optionsLayout->addWidget(kfindToolsButton);
}
optionsLayout->addStretch(1);
m_optionsScrollArea = new QScrollArea(this);

View File

@ -18,7 +18,6 @@ class QToolButton;
class QScrollArea;
class QLabel;
class QVBoxLayout;
class KMoreToolsMenuFactory;
/**
* @brief Input box for searching files with or without Baloo.
@ -172,7 +171,6 @@ private:
DolphinFacetsWidget *m_facetsWidget;
QUrl m_searchPath;
QScopedPointer<KMoreToolsMenuFactory> m_menuFactory;
QTimer *m_startSearchTimer;
};

View File

@ -8,11 +8,14 @@
#include "spaceinfoobserver.h"
#include <KLocalizedString>
#include <KMoreToolsMenuFactory>
#include <KIO/ApplicationLauncherJob>
#include <KIO/Global>
#include <KLocalizedString>
#include <KService>
#include <QMenu>
#include <QMouseEvent>
#include <QStorageInfo>
StatusBarSpaceInfo::StatusBarSpaceInfo(QWidget *parent)
: KCapacityBar(KCapacityBar::DrawTextInline, parent)
@ -87,11 +90,60 @@ void StatusBarSpaceInfo::mousePressEvent(QMouseEvent *event)
// Creates a menu with tools that help to find out more about free
// disk space for the given url.
// Note that this object must live long enough in case the user opens
// the "Configure..." dialog
KMoreToolsMenuFactory menuFactory(QStringLiteral("dolphin/statusbar-diskspace-menu"));
menuFactory.setParentWidget(this);
auto menu = menuFactory.createMenuFromGroupingNames({"disk-usage", "more:", "disk-partitions"}, m_url);
const KService::Ptr filelight = KService::serviceByDesktopName(QStringLiteral("org.kde.filelight"));
const KService::Ptr kdiskfree = KService::serviceByDesktopName(QStringLiteral("org.kde.kdf"));
if (!filelight && !kdiskfree) {
// nothing to show
return;
}
QMenu *menu = new QMenu(this);
if (filelight) {
QAction *filelightFolderAction = menu->addAction(QIcon::fromTheme(QStringLiteral("filelight")), i18n("Disk Usage Statistics - current folder"));
menu->connect(filelightFolderAction, &QAction::triggered, menu, [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 = menu->addAction(QIcon::fromTheme(QStringLiteral("filelight")), i18n("Disk Usage Statistics - current device"));
menu->connect(filelightDiskAction, &QAction::triggered, menu, [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 = menu->addAction(QIcon::fromTheme(QStringLiteral("filelight")), i18n("Disk Usage Statistics - all devices"));
menu->connect(filelightAllAction, &QAction::triggered, menu, [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 = menu->addAction(QIcon::fromTheme(QStringLiteral("kdf")), i18n("KDiskFree"));
connect(kdiskfreeAction, &QAction::triggered, this, [kdiskfree] {
auto *job = new KIO::ApplicationLauncherJob(kdiskfree);
job->start();
});
}
menu->exec(QCursor::pos());
}