X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/9108534ce07fbdc5e8f037826049c37cf226d2e6..dd4f41bc61866d9deaeaed534ba61099f5f65e89:/src/dolphinviewcontainer.cpp diff --git a/src/dolphinviewcontainer.cpp b/src/dolphinviewcontainer.cpp index 0a3dfd876..3fedef6fc 100644 --- a/src/dolphinviewcontainer.cpp +++ b/src/dolphinviewcontainer.cpp @@ -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" @@ -21,9 +22,6 @@ #include "statusbar/dolphinstatusbar.h" #include -#if HAVE_PLASMA_ACTIVITIES -#include -#endif #include #include #include @@ -65,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) @@ -109,7 +108,7 @@ DolphinViewContainer::DolphinViewContainer(const QUrl &url, QWidget *parent) #if !defined(Q_OS_WIN) && !defined(Q_OS_HAIKU) if (getuid() == 0) { // We must be logged in as the root user; show a big scary warning - showMessage(i18n("Running Dolphin as root can be dangerous. Please be careful."), Warning); + showMessage(i18n("Running Dolphin as root can be dangerous. Please be careful."), KMessageWidget::Warning); } #endif @@ -142,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); @@ -168,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); @@ -184,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 @@ -366,9 +366,7 @@ void DolphinViewContainer::setSelectionModeEnabled(bool enabled, KActionCollecti connect(m_view, &DolphinView::selectionChanged, this, [this](const KFileItemList &selection) { m_selectionModeBottomBar->slotSelectionChanged(selection, m_view->url()); }); - connect(m_selectionModeBottomBar, &SelectionMode::BottomBar::error, this, [this](const QString &errorMessage) { - showErrorMessage(errorMessage); - }); + connect(m_selectionModeBottomBar, &SelectionMode::BottomBar::error, this, &DolphinViewContainer::showErrorMessage); connect(m_selectionModeBottomBar, &SelectionMode::BottomBar::selectionModeLeavingRequested, this, [this]() { setSelectionModeEnabled(false); }); @@ -408,31 +406,25 @@ void DolphinViewContainer::slotSplitTabDisabled() } } -void DolphinViewContainer::showMessage(const QString &msg, MessageType type) +void DolphinViewContainer::showMessage(const QString &message, KMessageWidget::MessageType messageType, std::initializer_list buttonActions) { - if (msg.isEmpty()) { + if (message.isEmpty()) { return; } - m_messageWidget->setText(msg); + m_messageWidget->setText(message); // TODO: wrap at arbitrary character positions once QLabel can do this // https://bugreports.qt.io/browse/QTBUG-1276 m_messageWidget->setWordWrap(true); + m_messageWidget->setMessageType(messageType); - switch (type) { - case Information: - m_messageWidget->setMessageType(KMessageWidget::Information); - break; - case Warning: - m_messageWidget->setMessageType(KMessageWidget::Warning); - break; - case Error: - m_messageWidget->setMessageType(KMessageWidget::Error); - break; - default: - Q_ASSERT(false); - break; + const QList previousMessageWidgetActions = m_messageWidget->actions(); + for (auto action : previousMessageWidgetActions) { + m_messageWidget->removeAction(action); + } + for (QAction *action : buttonActions) { + m_messageWidget->addAction(action); } m_messageWidget->setWordWrap(false); @@ -586,10 +578,6 @@ void DolphinViewContainer::setUrl(const QUrl &newUrl) if (newUrl != m_urlNavigator->locationUrl()) { m_urlNavigator->setLocationUrl(newUrl); } - -#if HAVE_PLASMA_ACTIVITIES - KActivities::ResourceInstance::notifyAccessed(newUrl); -#endif } void DolphinViewContainer::setFilterBarVisible(bool visible) @@ -660,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() @@ -762,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(); @@ -828,18 +813,18 @@ void DolphinViewContainer::slotUrlNavigatorLocationChanged(const QUrl &url) if (url.scheme().startsWith(QLatin1String("http"))) { showMessage(i18nc("@info:status", // krazy:exclude=qmethods "Dolphin does not support web pages, the web browser has been launched"), - Information); + KMessageWidget::Information); } else { - showMessage(i18nc("@info:status", "Protocol not supported by Dolphin, default application has been launched"), Information); + showMessage(i18nc("@info:status", "Protocol not supported by Dolphin, default application has been launched"), KMessageWidget::Information); } QDesktopServices::openUrl(url); redirect(QUrl(), m_urlNavigator->locationUrl(1)); } else { if (!url.scheme().isEmpty()) { - showMessage(i18nc("@info:status", "Invalid protocol '%1'", url.scheme()), Error); + showMessage(i18nc("@info:status", "Invalid protocol '%1'", url.scheme()), KMessageWidget::Error); } else { - showMessage(i18nc("@info:status", "Invalid protocol"), Error); + showMessage(i18nc("@info:status", "Invalid protocol"), KMessageWidget::Error); } m_urlNavigator->goBack(); } @@ -914,9 +899,31 @@ void DolphinViewContainer::slotStatusBarZoomLevelChanged(int zoomLevel) m_view->setZoomLevel(zoomLevel); } -void DolphinViewContainer::showErrorMessage(const QString &msg) +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(msg, Error); + showMessage(message, KMessageWidget::Error); } void DolphinViewContainer::slotPlacesModelChanged() @@ -950,7 +957,7 @@ void DolphinViewContainer::slotCurrentDirectoryRemoved() setUrl(newUrl); } - showMessage(xi18n("Current location changed, %1 is no longer accessible.", location), Warning); + showMessage(xi18n("Current location changed, %1 is no longer accessible.", location), KMessageWidget::Warning); } void DolphinViewContainer::slotOpenUrlFinished(KJob *job)