]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/dolphinviewcontainer.cpp
Notify users if authorization is required to proceed
[dolphin.git] / src / dolphinviewcontainer.cpp
index ce91dbfe85a52cc5f337d3660628bfcdda4e812b..3fedef6fc9f220db1e28ae3089d4d6fc4ec666eb 100644 (file)
@@ -7,6 +7,7 @@
 #include "dolphinviewcontainer.h"
 
 #include "admin/bar.h"
+#include "admin/workerintegration.h"
 #include "dolphin_compactmodesettings.h"
 #include "dolphin_contentdisplaysettings.h"
 #include "dolphin_detailsmodesettings.h"
@@ -62,6 +63,7 @@ DolphinViewContainer::DolphinViewContainer(const QUrl &url, QWidget *parent)
     , m_searchBox(nullptr)
     , m_searchModeEnabled(false)
     , m_adminBar{nullptr}
+    , m_authorizeToEnterFolderAction{nullptr}
     , m_messageWidget(nullptr)
     , m_selectionModeTopBar{nullptr}
     , m_view(nullptr)
@@ -139,13 +141,12 @@ DolphinViewContainer::DolphinViewContainer(const QUrl &url, QWidget *parent)
     connect(m_view, &DolphinView::directoryLoadingCanceled, this, &DolphinViewContainer::slotDirectoryLoadingCanceled);
     connect(m_view, &DolphinView::itemCountChanged, this, &DolphinViewContainer::delayedStatusBarUpdate);
     connect(m_view, &DolphinView::selectionChanged, this, &DolphinViewContainer::delayedStatusBarUpdate);
-    connect(m_view, &DolphinView::errorMessage, this, &DolphinViewContainer::showErrorMessage);
+    connect(m_view, &DolphinView::errorMessage, this, &DolphinViewContainer::slotErrorMessageFromView);
     connect(m_view, &DolphinView::urlIsFileError, this, &DolphinViewContainer::slotUrlIsFileError);
     connect(m_view, &DolphinView::activated, this, &DolphinViewContainer::activate);
     connect(m_view, &DolphinView::hiddenFilesShownChanged, this, &DolphinViewContainer::slotHiddenFilesShownChanged);
     connect(m_view, &DolphinView::sortHiddenLastChanged, this, &DolphinViewContainer::slotSortHiddenLastChanged);
     connect(m_view, &DolphinView::currentDirectoryRemoved, this, &DolphinViewContainer::slotCurrentDirectoryRemoved);
-    connect(m_view, &DolphinView::urlChanged, this, &DolphinViewContainer::updateAdminBarVisibility);
 
     // Initialize status bar
     m_statusBar = new DolphinStatusBar(this);
@@ -165,6 +166,9 @@ DolphinViewContainer::DolphinViewContainer(const QUrl &url, QWidget *parent)
     });
     connect(m_statusBar, &DolphinStatusBar::stopPressed, this, &DolphinViewContainer::stopDirectoryLoading);
     connect(m_statusBar, &DolphinStatusBar::zoomLevelChanged, this, &DolphinViewContainer::slotStatusBarZoomLevelChanged);
+    connect(m_statusBar, &DolphinStatusBar::showMessage, this, [this](const QString &message, KMessageWidget::MessageType messageType) {
+        showMessage(message, messageType);
+    });
 
     m_statusBarTimer = new QTimer(this);
     m_statusBarTimer->setSingleShot(true);
@@ -181,7 +185,6 @@ DolphinViewContainer::DolphinViewContainer(const QUrl &url, QWidget *parent)
     m_topLayout->addWidget(m_statusBar, positionFor.statusBar, 0);
 
     setSearchModeEnabled(isSearchUrl(url));
-    updateAdminBarVisibility(url);
 
     // Update view as the ContentDisplaySettings change
     // this happens here and not in DolphinView as DolphinviewContainer and DolphinView are not in the same build target ATM
@@ -403,7 +406,7 @@ void DolphinViewContainer::slotSplitTabDisabled()
     }
 }
 
-void DolphinViewContainer::showMessage(const QString &message, KMessageWidget::MessageType messageType)
+void DolphinViewContainer::showMessage(const QString &message, KMessageWidget::MessageType messageType, std::initializer_list<QAction *> buttonActions)
 {
     if (message.isEmpty()) {
         return;
@@ -416,6 +419,14 @@ void DolphinViewContainer::showMessage(const QString &message, KMessageWidget::M
     m_messageWidget->setWordWrap(true);
     m_messageWidget->setMessageType(messageType);
 
+    const QList<QAction *> previousMessageWidgetActions = m_messageWidget->actions();
+    for (auto action : previousMessageWidgetActions) {
+        m_messageWidget->removeAction(action);
+    }
+    for (QAction *action : buttonActions) {
+        m_messageWidget->addAction(action);
+    }
+
     m_messageWidget->setWordWrap(false);
     const int unwrappedWidth = m_messageWidget->sizeHint().width();
     m_messageWidget->setWordWrap(unwrappedWidth > size().width());
@@ -637,6 +648,17 @@ void DolphinViewContainer::slotDirectoryLoadingCompleted()
     if (m_urlNavigatorConnected) {
         m_urlNavigatorConnected->setReadOnlyBadgeVisible(rootItem().isLocalFile() && !rootItem().isWritable());
     }
+
+    // Update admin bar visibility
+    if (m_view->url().scheme() == QStringLiteral("admin")) {
+        if (!m_adminBar) {
+            m_adminBar = new Admin::Bar(this);
+            m_topLayout->addWidget(m_adminBar, positionFor.adminBar, 0);
+        }
+        m_adminBar->setVisible(true, WithAnimation);
+    } else if (m_adminBar) {
+        m_adminBar->setVisible(false, WithAnimation);
+    }
 }
 
 void DolphinViewContainer::slotDirectoryLoadingCanceled()
@@ -739,20 +761,6 @@ void DolphinViewContainer::showItemInfo(const KFileItem &item)
     }
 }
 
-void DolphinViewContainer::updateAdminBarVisibility(const QUrl &url)
-{
-    if (url.scheme() == QStringLiteral("admin")) {
-        if (!m_adminBar) {
-            m_adminBar = new Admin::Bar(this);
-            m_topLayout->addWidget(m_adminBar, positionFor.adminBar, 0);
-            connect(m_adminBar, &Admin::Bar::activated, this, &DolphinViewContainer::activate);
-        }
-        m_adminBar->setVisible(true, WithAnimation);
-    } else if (m_adminBar) {
-        m_adminBar->setVisible(false, WithAnimation);
-    }
-}
-
 void DolphinViewContainer::closeFilterBar()
 {
     m_filterBar->closeFilterBar();
@@ -891,6 +899,28 @@ void DolphinViewContainer::slotStatusBarZoomLevelChanged(int zoomLevel)
     m_view->setZoomLevel(zoomLevel);
 }
 
+void DolphinViewContainer::slotErrorMessageFromView(const QString &message, const int kioErrorCode)
+{
+    if (kioErrorCode == KIO::ERR_CANNOT_ENTER_DIRECTORY && m_view->url().scheme() == QStringLiteral("file")
+        && KProtocolInfo::isKnownProtocol(QStringLiteral("admin")) && !rootItem().isReadable()) {
+        // Explain to users that they need authentication to see the folder contents.
+        if (!m_authorizeToEnterFolderAction) { // This code is similar to parts of Admin::Bar::hideTheNextTimeAuthorizationExpires().
+            // We should not simply use the actAsAdminAction() itself here because that one always refers to the active view instead of this->m_view.
+            auto actAsAdminAction = Admin::WorkerIntegration::FriendAccess::actAsAdminAction();
+            m_authorizeToEnterFolderAction = new QAction{actAsAdminAction->icon(), actAsAdminAction->text(), this};
+            m_authorizeToEnterFolderAction->setToolTip(actAsAdminAction->toolTip());
+            m_authorizeToEnterFolderAction->setWhatsThis(actAsAdminAction->whatsThis());
+            connect(m_authorizeToEnterFolderAction, &QAction::triggered, this, [this, actAsAdminAction]() {
+                setActive(true);
+                actAsAdminAction->trigger();
+            });
+        }
+        showMessage(i18nc("@info", "Authorization required to enter this folder."), KMessageWidget::Error, {m_authorizeToEnterFolderAction});
+        return;
+    }
+    Q_EMIT showErrorMessage(message);
+}
+
 void DolphinViewContainer::showErrorMessage(const QString &message)
 {
     showMessage(message, KMessageWidget::Error);