Dolphin backport request

Norbert Preining norbert at preining.info
Mon Jan 18 02:04:50 GMT 2021


> Not good, crashes dolphin. I leave it to others.

Sorry again, the patch *does* work. I just compiled the Debian packages
with a bug mixing
	Primary
and
	Secondary
gdb helps ...

So to make sure, I attach the current patch I used for compiling
20.12.1, and I run-tested it, too.

Best

Norbert

--
PREINING Norbert                              https://www.preining.info
Accelia Inc. + IFMGA ProGuide + TU Wien + JAIST + TeX Live + Debian Dev
GPG: 0x860CDC13   fp: F7D8 A928 26E3 16A1 9FA0 ACF0 6CAC A448 860C DC13
-------------- next part --------------
>From b1cadeba939155282a9fadf7d7b025d6529c489e Mon Sep 17 00:00:00 2001
From: Nate Graham <nate at kde.org>
Date: Tue, 15 Dec 2020 23:03:00 -0700
Subject: [PATCH] Show button to open knetattach inline with URL nav on
 Remote:// view

In conjunction with
https://invent.kde.org/frameworks/kio/-/merge_requests/260,
the net result is to hide the knetattach launcher in the view, and show
it inline with Dolphin's URL navigator toolbar when viewing the
remote:// view, just like how we add an "Empty Trash" button when
viewing trash://.

CCBUG: 430211

Adjust by NP 20210117 to be applicable to 20.12.1
---
 src/dolphinnavigatorswidgetaction.cpp |   49 +++++++++++++++++++++++++++++++---
 src/dolphinnavigatorswidgetaction.h   |   17 +++++++++++
 2 files changed, 61 insertions(+), 5 deletions(-)

--- a/src/dolphinnavigatorswidgetaction.cpp
+++ b/src/dolphinnavigatorswidgetaction.cpp
@@ -10,9 +10,13 @@
 #include "trash/dolphintrash.h"
 
 #include <KLocalizedString>
+#include <KNotificationJobUiDelegate>
+#include <KService>
 #include <KXMLGUIFactory>
 #include <KXmlGuiWindow>
 
+#include <KIO/ApplicationLauncherJob>
+
 #include <QApplication>
 #include <QDomDocument>
 #include <QHBoxLayout>
@@ -154,7 +158,9 @@ void DolphinNavigatorsWidgetAction::adju
     }
     int trailingSpacing = (m_globalXOfSplitter + m_splitter->width())
                           - (m_globalXOfPrimary + m_widthOfPrimary);
-    if (trailingSpacing < 0 || emptyTrashButton(Primary)->isVisible()) {
+    if (trailingSpacing < 0 || emptyTrashButton(Primary)->isVisible()
+                            || networkFolderButton(Primary)->isVisible()
+    ) {
         trailingSpacing = 0;
     }
     const int widthLeftForUrlNavigator = m_splitter->widget(0)->width() - leadingSpacing - trailingSpacing;
@@ -181,7 +187,9 @@ void DolphinNavigatorsWidgetAction::adju
 
     trailingSpacing = (m_globalXOfSplitter + m_splitter->width())
                       - (m_globalXOfSecondary + m_widthOfSecondary);
-    if (trailingSpacing < 0 || emptyTrashButton(Secondary)->isVisible()) {
+    if (trailingSpacing < 0 || emptyTrashButton(Secondary)->isVisible()
+                            || networkFolderButton(Secondary)->isVisible()
+    ) {
         trailingSpacing = 0;
     } else {
         const int widthLeftForUrlNavigator2 = m_splitter->widget(1)->width() - trailingSpacing;
@@ -212,6 +220,9 @@ QWidget *DolphinNavigatorsWidgetAction::
     auto emptyTrashButton = newEmptyTrashButton(urlNavigator, navigatorWidget);
     layout->addWidget(emptyTrashButton);
 
+    auto networkFolderButton = newNetworkFolderButton(urlNavigator, navigatorWidget);
+    layout->addWidget(networkFolderButton);
+
     connect(urlNavigator, &KUrlNavigator::urlChanged, this, [this]() {
         // We have to wait for DolphinUrlNavigator::sizeHint() to update which
         // happens a little bit later than when urlChanged is emitted.
@@ -249,6 +260,36 @@ QPushButton *DolphinNavigatorsWidgetActi
     return emptyTrashButton;
 }
 
+QPushButton *DolphinNavigatorsWidgetAction::networkFolderButton(DolphinNavigatorsWidgetAction::Side side)
+{
+    int sideIndex = (side == Primary ? 0 : 1);
+    if (side == Primary) {
+        return static_cast<QPushButton *>(m_splitter->widget(sideIndex)->layout()->itemAt(3)->widget());
+    }
+    return static_cast<QPushButton *>(m_splitter->widget(sideIndex)->layout()->itemAt(2)->widget());
+}
+
+QPushButton *DolphinNavigatorsWidgetAction::newNetworkFolderButton(const DolphinUrlNavigator *urlNavigator, QWidget *parent) const
+{
+    auto networkFolderButton = new QPushButton(QIcon::fromTheme(QStringLiteral("folder-add")),
+                                        i18nc("@action:button", "Add Network Folder"), parent);
+    networkFolderButton->setFlat(true);
+    connect(networkFolderButton, &QPushButton::clicked,
+            this, [networkFolderButton]() {
+                KService::Ptr service = KService::serviceByDesktopName(QStringLiteral("org.kde.knetattach"));
+                auto *job = new KIO::ApplicationLauncherJob(service, networkFolderButton);
+                auto *delegate = new KNotificationJobUiDelegate;
+                delegate->setAutoErrorHandlingEnabled(true);
+                job->setUiDelegate(delegate);
+                job->start();
+            });
+    networkFolderButton->hide();
+    connect(urlNavigator, &KUrlNavigator::urlChanged, this, [networkFolderButton, urlNavigator]() {
+        networkFolderButton->setVisible(urlNavigator->locationUrl().scheme() == QLatin1String("remote"));
+    });
+    return networkFolderButton;
+}
+
 QWidget *DolphinNavigatorsWidgetAction::spacing(Side side, Position position) const
 {
     int sideIndex = (side == Primary ? 0 : 1);
@@ -257,9 +298,9 @@ QWidget *DolphinNavigatorsWidgetAction::
         return m_splitter->widget(sideIndex)->layout()->itemAt(0)->widget();
     }
     if (side == Primary) {
-        return m_splitter->widget(sideIndex)->layout()->itemAt(3)->widget();
+        return m_splitter->widget(sideIndex)->layout()->itemAt(4)->widget();
     }
-    return m_splitter->widget(sideIndex)->layout()->itemAt(2)->widget();
+    return m_splitter->widget(sideIndex)->layout()->itemAt(3)->widget();
 }
 
 void DolphinNavigatorsWidgetAction::updateText()
--- a/src/dolphinnavigatorswidgetaction.h
+++ b/src/dolphinnavigatorswidgetaction.h
@@ -30,7 +30,8 @@ class QPushButton;
  *      The secondary side only exists for split view and is created by
  *      createSecondaryUrlNavigator() when necessary.
  * - Each side is a QWidget which I call NavigatorWidget with a QHBoxLayout.
- * - Each NavigatorWidget consists an UrlNavigator, an emptyTrashButton and spacing.
+ * - Each NavigatorWidget consists an UrlNavigator, an emptyTrashButton, a
+ *   networkFolderButton, and spacing.
  * - Only the primary navigatorWidget has leading spacing. Both have trailing spacing.
  *      The spacing is there to align the UrlNavigator with its DolphinViewContainer.
  */
@@ -131,6 +132,20 @@ private:
      */
     QPushButton *newEmptyTrashButton(const DolphinUrlNavigator *urlNavigator, QWidget *parent) const;
 
+    /**
+     * Used to retrieve the networkFolderButtons for the navigatorWidgets on
+     * both sides.
+     */
+    QPushButton *networkFolderButton(Side side);
+
+    /**
+     * Creates a new add "network folder" button.
+     * @param urlNavigator Only when this UrlNavigator shows the remote directory
+     *                     will the button be visible.
+     * @param parent       The object that should be the button's parent.
+     */
+    QPushButton *newNetworkFolderButton(const DolphinUrlNavigator *urlNavigator, QWidget *parent) const;
+
     enum Position {
         Leading,
         Trailing


More information about the Distributions mailing list