┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKai Uwe Broulik <[email protected]>2026-03-20 20:32:39 +0100
committerKai Uwe Broulik <[email protected]>2026-04-14 20:34:30 +0200
commitd5903bd810ee0447e6201a1cc36dcf186fc9c37d (patch)
tree4c40677a7c1d40c50a7466343a3630c00c8427a3
parent902a47a468ca6a315d577c73cbb51f6aba94d1ac (diff)
dolphinnavigatorswidgetaction: Add "Open KDE Connect" button
When browsing kdeconnect scheme, offer to open the KDE Connect app to configure the devices. On the overview, the button just opens the app. When listing storage on a device, it opens the app directly with the given device.
-rw-r--r--src/dolphinnavigatorswidgetaction.cpp42
-rw-r--r--src/dolphinnavigatorswidgetaction.h14
2 files changed, 52 insertions, 4 deletions
diff --git a/src/dolphinnavigatorswidgetaction.cpp b/src/dolphinnavigatorswidgetaction.cpp
index c44b7e796..b16b4876b 100644
--- a/src/dolphinnavigatorswidgetaction.cpp
+++ b/src/dolphinnavigatorswidgetaction.cpp
@@ -15,6 +15,7 @@
#include <KService>
#include <KIO/ApplicationLauncherJob>
+#include <KIO/CommandLauncherJob>
#include <QApplication>
#include <QHBoxLayout>
@@ -55,7 +56,7 @@ void DolphinNavigatorsWidgetAction::adjustSpacing()
leadingSpacing = 0;
}
int trailingSpacing = (viewGeometries.globalXOfNavigatorsWidget + m_splitter->width()) - (viewGeometries.globalXOfPrimary + viewGeometries.widthOfPrimary);
- if (trailingSpacing < 0 || emptyTrashButton(Primary)->isVisible() || networkFolderButton(Primary)->isVisible()) {
+ if (trailingSpacing < 0 || emptyTrashButton(Primary)->isVisible() || networkFolderButton(Primary)->isVisible() || kdeConnectButton(Primary)->isVisible()) {
trailingSpacing = 0;
}
const int widthLeftForUrlNavigator = m_splitter->widget(0)->width() - leadingSpacing - trailingSpacing;
@@ -81,7 +82,8 @@ void DolphinNavigatorsWidgetAction::adjustSpacing()
spacing(Primary, Trailing)->setFixedWidth(0);
trailingSpacing = (viewGeometries.globalXOfNavigatorsWidget + m_splitter->width()) - (viewGeometries.globalXOfSecondary + viewGeometries.widthOfSecondary);
- if (trailingSpacing < 0 || emptyTrashButton(Secondary)->isVisible() || networkFolderButton(Secondary)->isVisible()) {
+ if (trailingSpacing < 0 || emptyTrashButton(Secondary)->isVisible() || networkFolderButton(Secondary)->isVisible()
+ || kdeConnectButton(Secondary)->isVisible()) {
trailingSpacing = 0;
} else {
const int widthLeftForUrlNavigator2 = m_splitter->widget(1)->width() - trailingSpacing;
@@ -213,6 +215,9 @@ QWidget *DolphinNavigatorsWidgetAction::createNavigatorWidget(Side side) const
auto networkFolderButton = newNetworkFolderButton(urlNavigator, navigatorWidget);
layout->addWidget(networkFolderButton);
+ auto kdeConnectButton = newKdeConnectButton(urlNavigator, navigatorWidget);
+ layout->addWidget(kdeConnectButton);
+
connect(
urlNavigator,
&KUrlNavigator::urlChanged,
@@ -303,6 +308,35 @@ QPushButton *DolphinNavigatorsWidgetAction::newNetworkFolderButton(const Dolphin
return networkFolderButton;
}
+QPushButton *DolphinNavigatorsWidgetAction::kdeConnectButton(DolphinNavigatorsWidgetAction::Side side)
+{
+ const int sideIndex = (side == Primary ? 0 : 1);
+ return m_splitter->widget(sideIndex)->findChild<QPushButton *>(QStringLiteral("KdeConnectButton"));
+}
+
+QPushButton *DolphinNavigatorsWidgetAction::newKdeConnectButton(const DolphinUrlNavigator *urlNavigator, QWidget *parent) const
+{
+ auto kdeConnectButton = new QPushButton(QIcon::fromTheme(QStringLiteral("kdeconnect")), i18nc("@action:button", "Open KDE Connect"), parent);
+ kdeConnectButton->setObjectName(QStringLiteral("KdeConnectButton"));
+ kdeConnectButton->setFlat(true);
+ connect(kdeConnectButton, &QPushButton::clicked, urlNavigator, [kdeConnectButton, urlNavigator]() {
+ QStringList args;
+ if (const QString deviceId = urlNavigator->locationUrl().host(); !deviceId.isEmpty()) {
+ args << QStringLiteral("--device") << deviceId;
+ }
+ auto *job = new KIO::CommandLauncherJob(QStringLiteral("kdeconnect-app"), args);
+ job->setDesktopName(QStringLiteral("org.kde.kdeconnect.app"));
+ job->setUiDelegate(new KNotificationJobUiDelegate(KJobUiDelegate::AutoErrorHandlingEnabled));
+ job->start();
+ });
+ kdeConnectButton->hide();
+ connect(urlNavigator, &KUrlNavigator::urlChanged, kdeConnectButton, [kdeConnectButton, urlNavigator]() {
+ kdeConnectButton->setVisible(urlNavigator->locationUrl().scheme() == QLatin1String("kdeconnect")
+ && KService::serviceByDesktopName(QStringLiteral("org.kde.kdeconnect.app")));
+ });
+ return kdeConnectButton;
+}
+
QWidget *DolphinNavigatorsWidgetAction::spacing(Side side, Position position) const
{
int sideIndex = (side == Primary ? 0 : 1);
@@ -311,9 +345,9 @@ QWidget *DolphinNavigatorsWidgetAction::spacing(Side side, Position position) co
return m_splitter->widget(sideIndex)->layout()->itemAt(0)->widget();
}
if (side == Primary) {
- return m_splitter->widget(sideIndex)->layout()->itemAt(4)->widget();
+ return m_splitter->widget(sideIndex)->layout()->itemAt(5)->widget();
}
- return m_splitter->widget(sideIndex)->layout()->itemAt(3)->widget();
+ return m_splitter->widget(sideIndex)->layout()->itemAt(4)->widget();
}
void DolphinNavigatorsWidgetAction::updateText()
diff --git a/src/dolphinnavigatorswidgetaction.h b/src/dolphinnavigatorswidgetaction.h
index c9ce4ece2..8395f0b91 100644
--- a/src/dolphinnavigatorswidgetaction.h
+++ b/src/dolphinnavigatorswidgetaction.h
@@ -145,6 +145,20 @@ private:
*/
QPushButton *newNetworkFolderButton(const DolphinUrlNavigator *urlNavigator, QWidget *parent) const;
+ /**
+ * Used to retrieve the kdeConnectButtons for the navigatorWidgets on
+ * both sides.
+ */
+ QPushButton *kdeConnectButton(Side side);
+
+ /**
+ * Creates a new add "Open KDE Connect" button.
+ * @param urlNavigator Only when this UrlNavigator shows a "kdeconnect" URL
+ * will the button be visible.
+ * @param parent The object that should be the button's parent.
+ */
+ QPushButton *newKdeConnectButton(const DolphinUrlNavigator *urlNavigator, QWidget *parent) const;
+
enum Position { Leading, Trailing };
/**
* Used to retrieve both the leading and trailing spacing for the navigatorWidgets